hildsoftのコード置き場

プログラム関連で調べたことやコードの保管場所です

Unityで対象となるオブジェクトを向くように回転させたい(Quaternion.LookRotation)

スポンサーリンク

f:id:hildsoft:20170706031756p:plain

Quaternionはさっぱりわからないという人は一度こちらを見てください。

code.hildsoft.com


Unityで使うQuaternionのサンプルコード(LookRotation)

対象となるオブジェクトを向くには、LookRotationを使ってどのくらい回転させればいいのかを求めて、 得られたクォータニオンを使用して回転させると楽です。

f:id:hildsoft:20170706133217p:plain

このように黒いキューブの方を向くなど、カメラの向き変更などでよく使います。

Quaternion LookRotation(Vector3 forward)

+Z軸を、指定の方向に向けたい時に必要な回転操作が欲しい時に使用します。

+Z方向はVector3.forwardでも定義されていて、カメラの撮影方向もZ軸プラスの方向になります。

今回は黒のキューブに向けてみましょう。

public GameObject targetBlack;

を定義してインスペクタから黒いキューブを設定します。

f:id:hildsoft:20170706030509p:plain

var aim = this.targetBlack.transform.position - this.transform.position;
var look = Quaternion.LookRotation(aim);
this.transform.localRotation = look;

向きたい方向を指定する必要があるので、ターゲットの座標から自身の座標を引き、相対ベクトルを計算します。

よくあるミスとして、引数に対象の座標を指定することがあるので注意してください。

Quaternion LookRotation(Vector3 forward, Vector3 upwards = Vector3.up)

LookRotationメソッドは第二引数を取るものもあります。

これは、指定方向を向いたあとに上方向をどこに指定してするか、対象を向きながら回転して決定します。

大抵の場合は、Vector3.upかtransform.upを指定することになると思います。

f:id:hildsoft:20170706033350p:plain

var aim = this.targetBlack.transform.position - this.transform.position;
var look = Quaternion.LookRotation(aim, Vector3.up);
this.transform.localRotation = look;

Vector3.upを指定した場合は、引数が一つのメソッドと同じ動きをします。

キューブのY軸(緑の棒)を見ると分かると思いますが、上を向いている状態です。

初期の状態でY軸がどこを向いていても、Y軸が上を向く(正確に言うとX軸が水平になる)ように回転します。

この場合は設定を省略できるので、引数が一つのメソッドを使う方が良いでしょう。

var aim = this.targetBlack.transform.position - this.transform.position;
var look = Quaternion.LookRotation(aim, this.transform.up);
this.transform.localRotation = look;

こちらのコードは、transform.upを指定した場合です。

単純に黒いキューブを向くだけで、そのあとの自身の回転を行いません。

補足

カメラで使用する場合は、前者は重力を考慮した動き、後者は無重力状態や飛行機などの重力をあまり考慮しない動きをする際に用いられることが多いと思います。

ただ単に方向を変えたいだけなら、Quaternionを使わずに

this.transform.LookAt(this.targetBlack.transform);
this.transform.LookAt(this.targetBlack.transform, this.transform.up);
this.transform.LookAt(this.targetBlack.transform.position);
this.transform.LookAt(this.targetBlack.transform.position, this.transform.up);

でも可能です。

Quaternionを使わないならこちらの方がシンプルになります。

関連リンク

Unity - スクリプトリファレンス: Quaternion

Unity - スクリプトリファレンス: Quaternion.LookRotation