[Unity]Transform.Translate 无法移动预期的距离。

この記事は約2分で読めます。
スポンサーリンク

我想做的事情

在 Unity 中,Transform.Translate 并没有平移预期的距离。

我们将调查事件真相并提出解决方案。

本节讨论每次调用时的移动量。如果重复调用 Update 或 FixedUpdate 时出现意外行为,请参考以下内容(必须考虑 Time.deltaTime)。

Transform-Translate - Unity スクリプトリファレンス
translation の方向と距離に移動します

具体示例

我尝试了以下代码。

Debug.Log("Before Local:" + obj.localPosition.x);
obj.Translate(-70f, 0f, 0f);
Debug.Log("After Local:" + obj.localPosition.x );

结果:

本地之前:755.3287
本地:580.3287

测试后的预期结果是 750.3287 – 70 = 680.3287,但实际结果并非如此。

スポンサーリンク

为什么结果与预期不同?

接下来,请尝试以下代码。

Debug.Log("Before Local:" + obj.localPosition.x);
Debug.Log("Before World:" + obj.position.x );
obj.Translate(-70f, 0f, 0f);
Debug.Log("After Local:" + obj.localPosition.x );
Debug.Log("After World:" + obj.position.x );

结果:

本地之前:755.3287
世界之前:716.1315
本地:580.3287
世界之后:646.1315

如上结果所示,世界坐标系的 x 坐标减去 70。

换句话说,Translate 函数的方向可以通过第二个参数指定,默认值是局部坐标系,但距离是在世界坐标系中计算的。

因此,尝试使用局部坐标系来指定移动距离将不会产生预期的结果。

スポンサーリンク

解决方案

有几种解决方案,但我创建了以下函数。(由于它是为 2D 游戏创建的,因此 z 是可选的。)

void MoveTransfrom(Transform obj, float x, float y, float z = 0) {
    obj.localPosition = new Vector3(obj.localPosition.x + x, obj.localPosition.y + y, obj.localPosition.z + z);
}

コメント

タイトルとURLをコピーしました