Unityにおける座標移動の実装方法まとめ
座標移動の実装を考える時、度々「もっと良い方法があるんじゃないか」となることが多いため、まとめていこうと思う。
考慮すべき事柄
実装内容によってベストな実装は異なると考える。よって、考慮すべき事柄もまとめておく。
1. Y軸移動が存在するか
2. 障害物が存在するか
3. 坂は存在するか
TimeScaleによる挙動の差異に関しては考慮しないこととする。
処理負荷について考慮しないこととする。
ネットワーク通信等の外的要因も同様に考慮しない。
実装方法(利用クラス)
1. Transformクラスを経由する
メリット
最も手軽で直感的に座標移動ができる。
デメリット
その他のオブジェクトの影響が考慮しづらい。障害物があった際にはすり抜けてしまう。衝突判定だけRigidBodyを駆使したとしても、物理挙動と併用すると干渉してバグとなることが多い。坂も同様で、面に沿う動きを実現するには計算が必要。
2. RigidBodyクラスを経由する
メリット
手軽に障害物を考慮できる。重力も手軽に実装でき、PhisicsMaterialを実装すれば摩擦も制御できる。
デメリット
非現実的な動きに向いていない。RigidBodyは物理挙動を実装するためのものなので当然ではあるが、そのため速度の調整が難しいことがある。
坂を上るときにX方向にのみ力を加えた場合には力のベクトルが変化するため与えたパラメータとは異なる量の移動になったりする。
3. NavMeshAgentクラスを経由する
メリット
ルート探索などAIの実装に向いている。障害物も考慮できる。
デメリット
実装手順が多い。障害物が移動する場合等では更に手順が増えていく。
また冗長にも感じられる。当たり判定にはどのみちCollider・RigidBodyを使うことになるので移動以外の実装を考慮してしまうと無駄が多く感じる。
実装方法(計算手法)
計算方法は制作するゲームによって確実に最適解が変わると思う。各種クラスにはそれぞれ異なる計算手法が取れるように機能が実装されていることが多いので、あまり強く意識する必要はないと思う。