【Unity】動くプレイヤーの方向を滑らかな動きで向き続けるGameObjectの作り方

2021年8月29日Unity

スポンサーリンク

動くプレイヤー(ターゲット)の方向を滑らかにゆっくりと向き続けるGameObjectの作り方です。
Quaternion.Slerpを使います。

プレイヤーとしては以下を使います。

完成動作

作り方(動画)

作り方(ブログ)

1.シーンに各オブジェクトを配置

1-1.以下のようにunity-chan(今回はこれをプレイヤー)とBase(赤いCylinder)とNozzle(青いCylinder)を設置する。Baseが親、Nozzleが子のオブジェクトとなるようにする。
※今回はNozzleがunity-chanの方を向き続けるようにする。この後のスクリプトの便宜上、Nozzleは先端がZ軸を向くようにする。
流れとしてはBaseをスクリプトでプレイヤーの方向に回転させて、子であるNozzleも回転する仕組み

2.プレイヤー(ターゲット)の方向を向き続けるスクリプトを作成

2-1.Slerp.csという名前のスクリプトを作成して、以下のコードを記載する。

using UnityEngine;

public class Slerp : MonoBehaviour
{
    [SerializeField]
    [Tooltip("対象物(向く方向)")]
    private GameObject target;

	[SerializeField]
	[Tooltip("対象物を向くまでのスピード[0-1](値が小さいほど向くまでのスピードが遅い")]
	private float speed;

	private void Update()
	{
		// 対象物と自分自身の座標からベクトルを算出してQuaternion(回転値)を取得
		Vector3 vector3 = target.transform.position - this.transform.position;
		// もし上下方向の回転はしないようにしたければ以下のようにする。
		// vector3.y = 0f;

		// Quaternion(回転値)を取得
		Quaternion quaternion = Quaternion.LookRotation(vector3);
		// 取得した回転値をこのゲームオブジェクトのrotationに代入
		this.transform.rotation = Quaternion.Slerp(this.transform.rotation, quaternion, speed);
	}
}

3.スクリプトをアタッチ

3-1.Slerpスクリプトをプレイヤー(ターゲット)の方向を滑らかに向き続けさせたいGameObject(今回はBaseオブジェクト)にアタッチ

アタッチ後

4.Slerpスクリプトのプロパティの設定

4-1.SlerpスクリプトのTargetプロパティにプレイヤー(ターゲット)を設定(今回はunity-chan)

設定後

4-2.SlerpスクリプトのSpeedプロパティに0から1までの任意の値を設定(値が小さいほどターゲットの方を向くまでに時間がかかる。※0だとターゲットを追いかけない。)
今回は0.01を設定

完成

これでゲームをスタートしてプレイヤーが動くと、Baseが回転して、その子であるNozzleもプレイヤーの方に滑らかに回転して向き続ける。

Unity

Posted by ton