ゲームオブジェクトがどこに向いているかを知りたい場合はどうすればいいの~?
Transformを調べれば分かるわ!
向きはベクトルとして得られるの。
Unityでは、オブジェクトの向きは、傾き(姿勢)から計算することができます。
しかしながら、オブジェクトの前や右、上といった決まった向きは、Transformプロパティから向きベクトルとして簡単に取得できます。
本記事では、ゲームオブジェクトの向きをスクリプトから取得する方法をご紹介します。
目次 非表示
正面の向きのベクトルを取得する
ゲームオブジェクトの正面の向きは、Transform.forwardフィールドから取得することができます。
これは、シーンエディタで該当するオブジェクトを選択したときに表示されるz軸向き(青色)のベクトルに相当します。
Transform.forwardはワールド座標系で表現された長さが1の単位ベクトルです。
参考:Transform-forward – Unity スクリプトリファレンス
X、Y軸向きのベクトルも同様に取得可能です。
右・上向きのベクトルを取得する
右向きはTransform.right、上向きはTransform.upから取得できます。
Transform.rightはシーンエディタで該当オブジェクトを選択したときに表示されるx軸向き(赤色)のベクトル、Transform.upはy軸向き(緑色)のベクトルに相当します。
Transform.forwardと同じくワールド座標系におけるベクトルです。
参考:Transform-right – Unity スクリプトリファレンス
参考:Transform-up – Unity スクリプトリファレンス
例えば、後ろとか左とか下向きを求めたいときはどうするの?
ベクトルの符号反転を駆使すれば求められるわ!
後ろ・左・下向きのベクトルを取得する
今度はこれまでの応用です。
後ろ、左、下向きのベクトルは、それぞれ正面、右、上向きのベクトルの符号を反転させたベクトルとなります。
サンプル
オブジェクトのリアルタイムな向きをデバッグログで表示するサンプルです。
スクリプト
実行結果
ローカル座標系における向きについて
これまでご紹介した向きはすべてワールド座標系でしたが、ローカル座標系の場合は値が常に固定です。
transform.~ではなく、Vector3.~にコードを置き換えれば良いです。
また、後ろ、左、下向きのベクトルは、それぞれVector3.back、Vector3.left、Vector3.downプロパティとして参照できます。
斜め向きのベクトルを取得する
正面や右、上などの決まった向きなら、Transformプロパティから簡単に取得できることが分かりました。しかし、右前や斜め上など任意の向きを取得したい場合、別の方法で取得する必要があります。
次に紹介する二種類の取得方法があります。
Transform.rotationを用いる
オブジェクトの姿勢はTransform.rotationで表現されています。
Transform.rotationはワールド空間において、どの軸周りにどの角度だけ回転したかを表すクォータニオンです。
参考:Transform-rotation – Unity スクリプトリファレンス
ローカル空間における向きベクトルにTransform.rotationを掛けることで、ワールド空間における向きを算出できます。
例えば、オブジェクトの右前を取得するコードは次のようになります。
Transform.TransformDirection()メソッドを用いる
ローカル空間の向きベクトルは、Transform.TransformDirection()メソッドを用いてワールド空間に変換できます。
参考:Transform-TransformDirection – Unity スクリプトリファレンス
変換処理は次のようになります。
三種類の取得方法の結果比較
これまで紹介したオブジェクトの向きの取得方法は、求める過程が異なりますが、結果は同じになるはずです。
正面方向の取得を例にとって結果を確認してみましょう。
スクリプト
実行結果
全ての結果が一致していることが確認できました!
さいごに
ワールド座標系におけるオブジェクトの向きはTransform.rotationを用いて算出することも可能ですが、正面や右向きなど決まった向きなら簡単に調べることが可能です。
向きベクトルはクォータニオンと並んで回転を扱うのに役立ちます。
是非活用してみてください!