通过平铺移动角色平铺

时间:2014-06-16 07:15:02

标签: unity3d unityscript

我正在制作2D游戏。我有一个角色和一些瓷砖。瓷砖是1 x 1单位,并放置在场景中。

我使用以下代码移动我的角色。这是我的角色(" Hero")的代码:

public class Hero : MonoBehaviour {
    private Vector2 speedX = new Vector2(1, 0);
    private Vector2 speedY = new Vector2(0, 1);

    void Update () {
        if(Input.GetKey("left")) {
            rigidbody2D.MovePosition(rigidbody2D.position - speedX * Time.deltaTime);
        } else if(Input.GetKey("right")) {
            rigidbody2D.MovePosition(rigidbody2D.position + speedX * Time.deltaTime);
        } else if(Input.GetKey("up")) {
            rigidbody2D.MovePosition(rigidbody2D.position + speedY * Time.deltaTime);
        } else if(Input.GetKey("down")) {
            rigidbody2D.MovePosition(rigidbody2D.position - speedY * Time.deltaTime);
        }
    }
}

它可以工作,但它没有按预期移动。当我按下箭头键一次时,它移动大约0.2个单位。如何让玩家每按一下1个单位?

我错过了什么?

文档:Rigidbody2D.MovePosition

1 个答案:

答案 0 :(得分:4)

从我看到的情况看,一旦按下按键,你就会想要将角色瞬间移动到新位置。如果是这样,那么您有两个错误:

  1. 您不需要将速度(speedXspeedY)乘以Time.deltaTime
  2. Input.GetKey不是您想要使用的,因为它会在按下键的每一帧中返回true(每按一次键不会一次)。相反,您需要使用Input.GetKeyDown
  3. 因此,您的代码应如下所示:

    public class Hero : MonoBehaviour {
        private Vector2 speedX = new Vector2(1, 0);
        private Vector2 speedY = new Vector2(0, 1);
    
        void Update () {
            if(Input.GetKeyDown("left")) {
                rigidbody2D.MovePosition(rigidbody2D.position - speedX);
            } else if(Input.GetKeyDown("right")) {
                rigidbody2D.MovePosition(rigidbody2D.position + speedX);
            } else if(Input.GetKeyDown("up")) {
                rigidbody2D.MovePosition(rigidbody2D.position + speedY);
            } else if(Input.GetKeyDown("down")) {
                rigidbody2D.MovePosition(rigidbody2D.position - speedY);
            }
        }
    }