使用MovePosition的Unity 3D刚体2D运动

时间:2014-06-30 04:06:38

标签: c# unity3d

在2D模式下,我有一个附加到Sprite的脚本。 Update()部分如下:

void Update () {
  if (Input.GetKeyDown ("left")) {
    cursor.rigidbody2D.MovePosition (cursor.rigidbody2D.position - speedX);
  } else if (Input.GetKeyDown ("right")) {
    cursor.rigidbody2D.MovePosition (cursor.rigidbody2D.position + speedX);
  } else if (Input.GetKeyDown ("up")) {
    cursor.rigidbody2D.MovePosition (cursor.rigidbody2D.position + speedY);
  } else if (Input.GetKeyDown ("down")) {
    cursor.rigidbody2D.MovePosition (cursor.rigidbody2D.position - speedY);
  }
}

其中cursor是在Inspector中链接的预制件。 cursor预制件只有2个组件,Sprite Renderer(用于定义图像)和Rigidbody 2D,其设置如下:

  • 质量= 1
  • 线性拖动= 0
  • 角度拖动= 0
  • 重力等级= 0
  • 固定角度=真
  • Kinematic = false
  • Interpolate =无
  • 睡眠模式=开始醒来
  • 碰撞检测=离散

但是当我按下箭头键时,屏幕上显示的精灵不会移动。我错过了什么?

试图在Debug.Log()案例中添加if,它真的进入了案例。并没有发生错误。

注意:speedX = new Vector2(1,0);speedY = new Vector2(0,1);

1 个答案:

答案 0 :(得分:1)

您试图从游戏的角度移动一个不存在的对象。通过从资产库中拖动预制件来分配cursor预制件,就像分配蓝图一样。告诉预制件移动就像是在大肆宣传汽车的蓝图以加速:)

有两种通用解决方案。

1)保存参考

实例化预制件并保存生成的参考以操纵新对象。如果您主要对使用刚体感兴趣,可以直接将其强制转换为Rigidbody2D。只有当您的预制变量属于同一类型时,强制转换才会起作用,否则会引发异常。这种方式可确保您的预制件始终包含Rigidbody2D,或者您甚至无法在编辑器中指定它。

public Rigidbody2D cursorPrefab; // your prefab assigned by the Unity Editor

Rigidbody2D cursorClone = (Rigidbody2D) Instantiate(cursorPrefab);
cursorClone.MovePosition (cursorClone.position - speedX);

2)将脚本分配给预制件

根据您的游戏和您想要实现的目标,您还可以将脚本直接添加到预制件中。这样它的每个实例都可以控制自己。

void Update () {
  if (Input.GetKeyDown ("left")) {
    rigidbody2D.MovePosition (rigidbody2D.position - speedX);
  } else { //...}
}
相关问题