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