zoukankan      html  css  js  c++  java
  • 关于Unity中使用刚体制作简单跑酷案例

    一、步骤

    1.创建一个Canvas

    2.对Canvas进行初始化,记得把Game视图的分辨率调成和Canvas里面设置的一样的分辨率960X640

    3.创建一个Image的UI节点作为Canvas的子节点,名字叫bg,设置宽高为1920X1080,Image组件里面的Color设置为黑色。

    4.设置背景image的Pivot(表示bg节点的原点位置)的X为0,Y为0.5

    5.设置背景image的Pos X为-480,其他为0

    6.创建一个Ground空节点在Canvas父节点下,里面放障碍物的image

    7.在Ground文件夹下面创建名为g1,g2,g3,g4的image类型的UI节点,作为障碍节点,设置这些障碍节点的颜色不同

    8..在Ground文件夹下面创建名为item的image类型的UI节点,作为主角节点,设置这个节点的Image组件的贴图,记得设置贴图的Texture Type为Sprite,拖进去后记得set native size

    9.给主角添加Rigidbody 2D的刚体组件,设置Gravity Scale重力加速度为60

    10.给主角添加Box Collider 2D的正方形形状组件,点击Edit Collider编辑形状区域

    11.给Ground障碍物组节点添加Edge Collider 2D的边界形状组件,把左上角那个菊花图案选择为中心的那个图案

    12.点击Ground节点的Edge Collider 2D组件的Edit Collider编辑形状区域,不同的是这个是两个绿色的点,要自己拉伸来包围整个障碍物,先从左拉到右边,然后从左边开始每次都拉一小段来慢慢包围,最后要包围屏幕边界,不然主角跳出屏幕

      地图编辑的时候,如果是水平的,还需要最后数值调整,要让某两个点的Y轴一样,不然会滑动。

    13.创建一个地面材质,Create-Physics2D Material,设置摩擦力,弹性都位0,把编辑好的Material拖进ground节点的Material属性中。

    14.接下来要用一个脚本来通过键盘控制主角移动

    15.在写的过程中要获得和键位匹配的参数Horizontal

    Edit--Project Settings--Input

    public class player : MonoBehaviour {
        Rigidbody2D body;
        // Use this for initialization
        void Start () {
         //获得刚体
            this.body = this.GetComponent<Rigidbody2D>();
            // 设置刚体不会有选转;两种方法
            this.body.freezeRotation = true;
            // this.body.constraints = RigidbodyConstraints2D.FreezeRotation;
        }
    
        // 跳跃
        void jump() {
            this.body.AddForce(new Vector2(0, 10000));
        }
    
        void walk(int dir) {
         //获得刚体速度
            Vector2 v = this.body.velocity;
            if (dir < 0) {
                v.x = -100;
                this.transform.localScale= new Vector3(-1, 1, 1);
            }
            else if (dir > 0) {
                v.x = 100;
                this.transform.localScale = new Vector3(1, 1, 1);
            }
            this.body.velocity = v;
        }
    
        // Update is called once per frame
        void Update () {
            if (Input.GetButtonDown("Jump")) {
                this.jump();
            }
            // 左边走
            else if (Input.GetAxisRaw("Horizontal") < 0) {
                this.walk(-1);
            } 
            // 右边走
            else if (Input.GetAxisRaw("Horizontal") > 0) {
                this.walk(1);
            }
        }
    }

    16.设置摄像机跟着主角一起运动

    a.设置Canvas节点的Canvas组件的Reander Mode为Screen Space Camera

    b.把main Camera节点拖进Canvas节点的Canvas组件的Render Camera属性

    c.一定要记得把main Camera节点放在Canvas节点下面,作为子节点,不然会出错,Canvas会和摄像机一起移动,这和Canvas与摄像机的实现机制有关系,由于Unity是不开源的,所以猜测。

    public class player : MonoBehaviour {
        Rigidbody2D body;
        public Camera bind_camera = null;
        private Vector3 offset = Vector3.zero;
        // Use this for initialization
        void Start () {
            this.body = this.GetComponent<Rigidbody2D>();
            // 刚体不会有选转;两种方法
            this.body.freezeRotation = true;
            // this.body.constraints = RigidbodyConstraints2D.FreezeRotation;
    
            // 计算玩家到camera的相对距离
            if (this.bind_camera != null) {
                this.offset = this.bind_camera.transform.position - this.transform.position;
            } 
        }
    
        // 跳跃
        void jump() {
            this.body.AddForce(new Vector2(0, 10000));
        }
    
        void walk(int dir) {
            Vector2 v = this.body.velocity;
            if (dir < 0) {
                v.x = -100;
                this.transform.localScale= new Vector3(-1, 1, 1);
            }
            else if (dir > 0) {
                v.x = 100;
                this.transform.localScale = new Vector3(1, 1, 1);
            }
            this.body.velocity = v;
        }
        // Update is called once per frame
        void Update () {
            if (Input.GetButtonDown("Jump")) {
                this.jump();
            }
            // 左边
            else if (Input.GetAxisRaw("Horizontal") < 0) {
                this.walk(-1);
            } 
            // 右边 
            else if (Input.GetAxisRaw("Horizontal") > 0) {
                this.walk(1);
            }
    
            if (this.bind_camera != null) {
                // 摄像机位置的y,z不变,x随着主角的移动而移动
                Vector3 new_position = this.offset + this.transform.position;
                new_position.y = this.bind_camera.transform.position.y;
                new_position.z = this.bind_camera.transform.position.z;
                this.bind_camera.transform.position = new_position;
    
                // this.bind_camera.transform.position = this.offset + this.transform.position;
            }
        }
    }

    17.添加UI界面

    a.再创建一个Canvas节点,和原来的Canvas是平级的

    b.在新Canvas节点下面创建一个UI类型的Button节点

    c.把Button的菊花改到左上角的那个图案,点击Button设置它的菊花,菊花的位置会跑到父节点Canvas的左上角那个点,那个点相对于Button来说就是原点位置。

    d.设置Button的大小和它子节点Text的字体内容和字体大小。

    注意:

    游戏一般都是两层Canvas

    1.一层是overlay模式处理GUI

    2.一层是camera模式处理游戏内容

  • 相关阅读:
    【刷题】BZOJ 4078 [Wf2014]Metal Processing Plant
    【刷题】BZOJ 4000 [TJOI2015]棋盘
    【刷题】BZOJ 3495 PA2010 Riddle
    【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生
    Linux 文件系统 相关
    Ubuntu、Sql Server卸载心得
    CVTE面试总结
    open_clientfd(char* hostname,int port)和open_listenfd(int port)
    将十六进制显示为点分十进制
    Linux 小记录
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7082446.html
Copyright © 2011-2022 走看看