【问题标题】:Move Character Tile by Tile逐块移动字符块
【发布时间】:2014-06-16 15:58:07
【问题描述】:

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

我使用以下代码来移动我的角色。这是我的角色(“英雄”)的代码:

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

【问题讨论】:

  • 你为什么使用 RigidBody2D?你会在游戏中使用任何物理吗?
  • 我需要在游戏中进行碰撞检测

标签: unity3d unityscript


【解决方案1】:

据我所知,您似乎希望在按下键后立即将角色移动到新位置。如果是这样,你有两个错误:

  1. 您无需将速度(speedXspeedY)乘以 Time.deltaTime
  2. Input.GetKey 不是您想要使用的,因为它会在每个按键被按下的帧中返回 true(不是每次按键一次)。相反,您需要使用Input.GetKeyDown

所以,你的代码应该是这样的:

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);
        }
    }
}

【讨论】:

  • 像魅力一样工作! Unity 3D 文档引导我走错路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多