我想做的事情
在 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);
}

コメント