この記事では、Rayがあたった方向にキャラクターなどを向かせる方法を紹介します。
手順
1.Rayの発生源となるオブジェクトとRayをあてるオブジェクトを用意する
2.新しくスクリプトを作って発生源となるオブジェクトにつける
3.Rayを生成するスクリプトを書く
4.Rayの方向に向かせるスクリプトを書く
1 Rayの発生源となるオブジェクトとRayをあてるオブジェクトを用意する
今回はこのようなステージを作りました。
判別のため、CubeとCapsuleには「Enemy」というタグをつけています。
2 新しくスクリプトを作って発生源となるオブジェクトにつける
ProjectウィンドウのCreateからC#スクリプトを新しく作成します。
それを、HierarchyにあるRayの発生源となるオブジェクト(今回はUnityちゃん)にドラッグ&ドロップでくっつけます。
3 Rayを生成するスクリプトを書く
2で作ったスクリプトに、以下のようなコードを書きます。
void Update()
{
raytest();
}
//Rayを生成する関数
void raytest()
{
RaycastHit hit;
Ray ray;
int distance = 3;
ray = new Ray(transform.position + new Vector3(0, 0.3f, 0), transform.forward);
if (Physics.SphereCast(ray, 2, out hit, distance))
{
Debug.DrawLine(ray.origin, hit.point, Color.red);
}
}
わかりやすいように赤い線が出るようにしているほか、Rayがあたる面積を広げるためSphereCastを使用しています。
また、SDUnityちゃんはデフォルトだとRayの発生源が足元になってしまうので、Vector3の値を足して発生源に位置を上げています。
4 Rayの方向に向かせるスクリプトを書く
Enemyというタグが付いているオブジェクトにRayが当たっている時、クリックすると今Rayが当たっている方向を向くコードを、以下のように書きます。
if (Physics.SphereCast(ray, 2, out hit, distance))
{
//デバッグ用の赤い線を引く
Debug.DrawLine(ray.origin, hit.point, Color.red);
//クリックされた場合
if (Input.GetMouseButtonDown(0))
{
//当たったオブジェクトのタグがEnemyだった場合
if (hit.collider.tag == "Enemy")
{
//Unityちゃんから見たRayが当たった場所の角度分y軸を中心に回転する
var newRotation = Quaternion.LookRotation(hit.point - transform.position).eulerAngles;
newRotation.x = 0;
newRotation.z = 0;
transform.rotation = Quaternion.Euler(newRotation);
}
}
}
これを実行すると
Unityちゃんがぴょこんとオブジェクトのほうを向いたのがわかると思います。