やりたいこと
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 );
結果:
Before Local:755.3287
After Local:580.3287
想定ではAfterの結果は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 );
結果:
Before Local:755.3287
Before World:716.1315
After Local:580.3287
After World:646.1315
上記の結果の通りWorld座標のxが-70されていることが分かります。
つまりTranslateの方向は第二引数で指定でき初期値はローカル座標系だが、距離はWorld座標系ということのようです。
そのためローカル座標系で移動距離を指定しようとすると想定した動作しません。
解決策
解決策はいろいろあるのですが以下の関数を作成しました。(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);
}
コメント