はとの豆知識

Unityを中心に手っ取り早い機能の実装を紹介します。

【Unity】対象のオブジェクトの方向を向く方法を紹介。

今回は対象のオブジェクトを設定してその方向を向く、という処理を作成しました。
応用することでシューティングゲームの弾や追尾など色々使えそうですね。

手っ取り早い実装方法

    [SerializeField, Header("対象のオブジェクト")] GameObject targetObject;

    //移動速度
    private float moveSpeed = 4f;

    private void Start()
    {
        //対象の方向を向く
        this.LookingTarget();
    }

    private void Update()
    {
        ////前進処理
        transform.Translate(Vector3.up * this.moveSpeed * Time.deltaTime);
    }

    /// <summary>
    /// 対象の方向を向く
    /// </summary>
    private void LookingTarget()
    {
        Vector3 look = (this.targetObject.transform.position -
        transform.position).normalized;

        transform.rotation = Quaternion.FromToRotation(Vector3.up, look);
    }

f:id:HatoHatter:20210601015409g:plain

Start()で呼んでいるので開始と同時に白い丸に向いていますね。
移動と組み合わせることでそっちの方向目掛けて進むようになっています。

これをUpdate()で呼ぶことで追尾のようなことも可能です。

応用編

決められた複数の場所から、指定した場所に向けて矢印を飛ばしてみます。

今回はUniRxObservableを使用して1秒ごとに処理を呼び出していますが
別の方法でも十分代用可能です。

using UnityEngine;
using UniRx;
using System;

public class Looking : MonoBehaviour
{
    [SerializeField] private GameObject arrow;//スポーンさせるオブジェクト

    [SerializeField, Header("ターゲットをセット")] private GameObject targetObject;

    [SerializeField, Header("スポーンさせる位置をセット")] private Transform[] spawnPositions;

    ///生成するための間隔
    private readonly int spawnSpan = 1;

    private void Start()
    {
        ///指定した秒数ごとにスポーン
        Observable.Interval(TimeSpan.FromSeconds(this.spawnSpan))
            .Subscribe(x =>
            {
                ///0~指定した数値(spawnPositionsの数)からランダムな数値
                int randomSpawnNum = UnityEngine.Random.Range(0, 
                this.spawnPositions.Length);

                ///spawnPositionsとtargetObjectから進む方向を決める
                Vector3 look = (this.targetObject.transform.position - 
                this.spawnPositions[randomSpawnNum].transform.position).normalized;

                ///GimmickSpawn関数を呼び出し必要な情報を渡す
                Instantiate(arrow, this.spawnPositions[randomSpawnNum].position,
                Quaternion.FromToRotation(Vector3.up, look));

            }).AddTo(this);
    }
}

f:id:HatoHatter:20210605032619p:plain
SerializeFieldTransform[] を組み合わせて
複数の出現位置を設定しています。

f:id:HatoHatter:20210606232321g:plain