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

本文关键字:刚体 2D 运动 3D Unity MovePosition 使用 | 更新日期: 2023-09-27 18:10:41

在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
  • 固定角度= true
  • Is Kinematic = false
  • Interpolate = None
  • 睡眠模式=启动唤醒
  • 碰撞检测=离散

但是当我按下方向键时,屏幕上显示的精灵并没有移动。我错过了什么?

尝试在if案例中添加Debug.Log(),它确实进入了案例。没有错误发生

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

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

你试图移动一个从游戏角度看并不存在的物体。通过从资产库中拖动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 { //...}
}