【Unity】プレイヤーを目で追う

投稿者: | 2020-12-01

動くFPSプレイヤーをキャラクターに目で追わせてみました。目はボーンコンストレイントで目を動かすの方法でコントロール用のボーンによって回転させました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowWithEyes : MonoBehaviour
{
    [SerializeField] Transform control;
    Vector3 controlDefaultPosition;
    Transform target;    

    // Start is called before the first frame update
    void Start()
    {
        target = Camera.main.transform; // プレイヤーのトランスフォーム
        controlDefaultPosition = control.position; // コントロールの元の位置を保存
    }

    // Update is called once per frame
    void Update()
    {
        // 顔からプレイヤーへの方向ベクトル
        Vector3 dir = Vector3.Normalize(target.position - transform.position);

        // 顔の正面との内積
        float dot = Vector3.Dot(dir, transform.forward);

        // 目で追う
        if (dot > 0.6f)
        {
            control.position = Vector3.Lerp(control.position,target.position,0.1f);
            //control.position = target.position;
        }
        // 前を見る
        else
        {
            control.position = Vector3.Lerp(control.position, controlDefaultPosition, 0.1f);
            //control.position = controlDefaultPosition;
            //control.position = transform.position + transform.forward * 2f;

        }
    }
}

まずコントロール用のボーンの元の位置をStart()で保存しておきます。

controlDefaultPosition = control.position; // コントロールの元の位置を保存

そして、Update()で目を動かすキャラクターの正面方向と、顔からプレイヤーへの方向との内積を計算します。

Vector3 dir = Vector3.Normalize(target.position - transform.position);

// 顔の正面との内積
float dot = Vector3.Dot(dir, transform.forward);

内積がある値以上のときはプレイヤーがキャラクターの顔の前にいるので、コントロールボーンをプレイヤーの位置に移動します。このときに、そのまま代入せずに、Vector3.Lerpを使って少しずつ近づけることで目の動きをスムーズにしています。

// 目で追う
if (dot > 0.6f)
{
    control.position = Vector3.Lerp(control.position,target.position,0.1f);
    //control.position = target.position;
}

内積がそれより小さいと、元の位置に戻します。

// 前を見る
else
{
    control.position = Vector3.Lerp(control.position, controlDefaultPosition, 0.1f);
    //control.position = controlDefaultPosition;
    //control.position = transform.position + transform.forward * 2f;

}

これで、キャラクターがプレイヤーを目で追うようになりました。

無料ホラーゲームを作りました

コメントを残す

メールアドレスが公開されることはありません。