動く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;
}
これで、キャラクターがプレイヤーを目で追うようになりました。
ホラーゲームの敵キャラクターなどはどこで作っているのですか?教えたください!!
Blenderで作っています
顔の画像はこちらでダウンロードしました
https://generated.photos/