Unityでオブジェクトを指定の方向に向ける

#オブジェクトを指定の方向に向けたい
![lookat1.jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/3897d011-ba2e-e9fb-e36c-58acffa6f213.jpeg)
図のようにCubeをSphereの方向に向かせたい場合
transform.forwardに方向ベクトルを突っ込む方法とtransform.LookAt関数を使う方法がある
##検証コード1
```csharp:LookAtTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LookAtTest : MonoBehaviour 
{
	public Transform _target;

	readonly int COUNT = 100000;

	void Update()
	{
		if(Input.GetKeyDown(KeyCode.A))
		{
			float startTime = Time.realtimeSinceStartup;
			for (int i = 0; i < COUNT; i++) {
				Vector3 direction = (_target.position - this.transform.position).normalized;
				this.transform.forward = direction;
			}
			float end1 = Time.realtimeSinceStartup - startTime;

			startTime = Time.realtimeSinceStartup;
			for (int i = 0; i < COUNT; i++) {
				Vector3 direction = (_target.position - this.transform.position);
				this.transform.forward = direction;
			}
			float end2 = Time.realtimeSinceStartup - startTime;

			startTime = Time.realtimeSinceStartup;
			for (int i = 0; i < COUNT; i++) {
				this.transform.LookAt (_target.position);
			}
			float end3 = Time.realtimeSinceStartup - startTime;

			Debug.Log (end1);    //0.04388928sec
			Debug.Log (end2);    //0.03444195sec
			Debug.Log (end3);    //0.02334642sec
		}
	}
}

```
| 手法 | 実行時間 |
|:-:|:-:|
|forwardに方向ベクトル normalizeあり|0.04388928sec|
|forwardに方向ベクトル normalizeなし|0.03444195sec|
|LookAt関数|0.02334642sec|

何も考えずにLookAt関数を使うのが一番早い
forwardに突っ込む場合もわざわざnormalize(正規化)しなくても大丈夫

#オブジェクトを軸固定で指定の方向に向けたい
![lookat2.jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/3df6a1c0-d10d-87b0-91c7-52111e286b71.jpeg)
図のようにCubeをSphereの方向にY軸だけ回転させて向かせたい場合
外積を用いる方法、transform.LookAt関数のtargetの座標Yを一致させる方法
targetの座標Yを一致させ、Quaternion.LookRotationを使う方法がある

##検証コード2
```csharp:LookAtTest2.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LookAtTest2 : MonoBehaviour 
{
	public Transform _target;

	Vector3 _RotAxis = Vector3.up;

	readonly int COUNT = 100000;

	void Update()
	{
		if (Input.GetKeyDown (KeyCode.S)) 
		{
			float startTime = Time.realtimeSinceStartup;
			for (int i = 0; i < COUNT; i++) {
				Vector3 direction = (_target.position - this.transform.position).normalized;
				Vector3 xAxis = Vector3.Cross (_RotAxis, direction).normalized;
				Vector3 zAxis = Vector3.Cross (xAxis, _RotAxis).normalized;
				this.transform.rotation = Quaternion.LookRotation(zAxis,_RotAxis);
			}
			float end1 = Time.realtimeSinceStartup - startTime;

			startTime = Time.realtimeSinceStartup;
			for (int i = 0; i < COUNT; i++) {
				Vector3 direction = (_target.position - this.transform.position);
				Vector3 xAxis = Vector3.Cross (_RotAxis, direction);
				Vector3 zAxis = Vector3.Cross (xAxis, _RotAxis);
				this.transform.rotation = Quaternion.LookRotation(zAxis,_RotAxis);
			}
			float end2 = Time.realtimeSinceStartup - startTime;

			startTime = Time.realtimeSinceStartup;
			for (int i = 0; i < COUNT; i++) {
				Vector3 target = _target.position;
				target.y = this.transform.position.y;
				this.transform.LookAt (target);
			}
			float end3 = Time.realtimeSinceStartup - startTime;

                        startTime = Time.realtimeSinceStartup;
			for (int i = 0; i < COUNT; i++) {
				Vector3 target = _target.position;
				target.y = this.transform.position.y;
				this.transform.rotation = Quaternion.LookRotation (target , _RotAxis);
			}
			var end4 = Time.realtimeSinceStartup - startTime;

			Debug.Log (end1);    //0.06525421sec
			Debug.Log (end2);    //0.03794098sec
			Debug.Log (end3);    //0.03161621sec
                        Debug.Log (end4);    //0.03028011sec
		}
	}
}

```

| 手法 | 実行時間 |
|:-:|:-:|
|外積 normalizeあり|0.06525421sec|
|外積 normalizeなし|0.03794098sec|
|LookAt関数|0.03161621sec|
|LookRotation関数|0.03028011sec|

LookRotation関数の方がLookAt関数よりわずかに早い

#参考リンク
- [Unityで回転したかったお話](http://qiita.com/utah/items/005e34e6888b0b6c63c3)
- [UnityのベクトルとQuaternionによる回転について](http://tsubakit1.hateblo.jp/entry/2014/08/02/030919)
- [Unity の回転と向き](https://docs.unity3d.com/ja/current/Manual/QuaternionAndEulerRotationsInUnity.html)