対象物(ターゲット)の方向を向く(3D)
他のオブジェクトを見つめたり、迫って行くときにその方向を向きたい場合があります
Unityでは、そのためのメソッドが用意されています。いくつかの方法があるのでみていきましょう
シーンの構成
LookAtSampleとしてプロジェクトを作成しましょう
ビデオから、プロジェクト名、シーンのゲームオブジェクト、コンポーネントを確認して、同じように構成しましょう
対象物を向くとは
対象物を向くとは、z軸がその方向を向くことを言います
LookAt
対象物のTransfromコンポーネントを引数に取ります。これをアタッチしているゲームオブジェクトは対象物のtransform.potisionの方向を向きます
オーバーロードとして引数にVector3型を取ることもできます
コード
using UnityEngine;
public class WatchLookAt : MonoBehaviour
{
[SerializeField]
Transform targetTran;
void Update()
{
transform.LookAt(targetTran);
}
}
実行結果
LookRotation
対象物の座標(transfrom.potision:Vector3型)を引数に取ります。これをアタッチしているゲームオブジェクトは対象物のtransform.potisionの方向を向きます
rotationに回転を代入しますが、クウォータニオン型(Quaternion)になります
インスペクターでの表示はVector3型になっていますが、内部ではクウォータニオン型で保持されています
回転は、回転順・向きによっては期待通りにならないことがあるため(ジンバルロック)、4元(x, y, z, w)を使って処理されます
コード
using UnityEngine;
public class WatchTargetLookRotation : MonoBehaviour
{
[SerializeField]
Transform targetTran;
void Update()
{
transform.rotation = Quaternion.LookRotation(targetTran.position);
}
}
実行結果
ゆっくり対象物の方向を向く
Slerp
対象物を向くのは同じですが、その方向に徐々に向けることができます
Quaternion.Slerpメソッドを使用して、現在の回転から目標の回転に向けて少しずつ回転させることで、スムーズな回転を実現しています。また、回転速度を調整するためのrotateSpeed変数を用意しています。この変数の値を大きくすると回転速度が速くなり、小さくすると回転速度が遅くなります。適切な値を設定して、オブジェクトをスムーズに回転させるようにしてください。
コード
using UnityEngine;
public class WatchTargetSlerp : MonoBehaviour
{
// 注視する対象のTransform
[SerializeField]
Transform targetTran;
// 回転速度
[SerializeField]
float rotationSpeed;
void Update()
{
// ターゲットの方向ベクトルを取得
Vector3 direction = target.position - transform.position;
// 方向ベクトルから回転クォータニオンを求める
Quaternion targetRotation = Quaternion.LookRotation(direction, Vector3.up);
// 現在の回転から目標の回転に向けて少しずつ回転する
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
}
}
ディスカッション
コメント一覧
まだ、コメントがありません