【UnityC#講座】見つけたら追いかけてくる監視ユニティちゃん【NavMeshAgent】

監視人ユニティちゃん/トップ

Unity2018.1.5f1
Windows10

監視人ユニティちゃん/トップ

前回はユニティちゃんに一定以上近づくと追いかけられるようになり、一定以上離れるとまた巡回に戻るようにしました。

【UnityC#講座】近づいたら追いかけてくる巡回ユニティちゃん【NavMeshAgent】

今回はユニティちゃんは巡回せず首を動かして辺りを見回し、プレイヤーが見つかったら追いかけて来るのですが、前回と同じく一定以上離れると追跡を止めるようにしました。

■首を振らせる

まずは追跡はなしで首だけ振るようにしてみました。

監視人ユニティちゃん/首を振る

やり方は以下のスクリプトをユニティちゃんにアタッチしInspectorの設定をするだけです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShakeHead : MonoBehaviour {
//Inspectorでユニティちゃんの
//Character1_Headをセットする
[SerializeField] GameObject head;
[SerializeField] float headAngle;
[SerializeField] Vector3 startHeadAngle;
bool neckSwitch = true;
void Start()
{
//元からの首の位置を記録しておく
startHeadAngle = head.transform.localEulerAngles;
}
//Updateだとアニメーションクリップに入れると首が動かない
void LateUpdate () {
//首を45度まで動かしたらfalse
//-45度まで動かしたらtrue
if (headAngle >= 45)
{
neckSwitch = false;
}
else if (headAngle <= -45)
{
neckSwitch = true;
}
//首を少しずつ動かすための数値を時間で増やす
//trueで足しfalseで引く、を繰り返す
if (neckSwitch)
{
headAngle += Time.deltaTime * 10;
}
else
{
headAngle -= Time.deltaTime * 10;
}
//頭のローカルの角度に、最初の角度に変数を加える
//ユニティちゃんの場合、首を左右に振るならX軸で動かす
head.transform.localEulerAngles = new Vector3(
startHeadAngle.x + headAngle, startHeadAngle.y, startHeadAngle.z);
}
}
view raw 28.cs hosted with ❤ by GitHub

今回UpdateではなくLateUpdateになっていますが、これはアニメーションクリップと併用した際、Updateでは首を振る動作が出なくなるためです。

InspectorにはCharacter1_Headを入れます。

監視人ユニティちゃん/Inspectorにセット

分かりづらいところにあります。

監視人ユニティちゃん/Hierarchyのツリー

Sceneビューで顔をクリックした方が早く見つかるかもしれません。

監視人ユニティちゃん/Sceneで顔クリック

スポンサーリンク

■監視ユニティちゃんを作る

さて次は見つかったら追いかけられるようにします。
具体的にはユニティちゃんの頭からRayが出ていてそれにヒットするとNavMeshAgentが動くようになり、一定以上離れるとNavMeshAgentがストップします。
RayはGizmosにより見えるようにしました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//NavMeshAgent使うときに必要
using UnityEngine.AI;
//オブジェクトにNavMeshAgentコンポーネントを設置
[RequireComponent(typeof(NavMeshAgent))]
public class Monitoring : MonoBehaviour {
[SerializeField] int destPoint = 0;
private NavMeshAgent agent;
//Inspectorでユニティちゃんの
//Character1_Headをセットする
[SerializeField] GameObject head;
[SerializeField] float headAngle;
[SerializeField] Vector3 startHeadAngle;
bool neckSwitch = true;
[SerializeField] float quitRange = 5f;
[SerializeField] bool tracking = false;
Vector3 playerPos;
GameObject player;
float distance;
void Start()
{
agent = GetComponent<NavMeshAgent>();
agent.autoBraking = false;
player = GameObject.Find("Player");
startHeadAngle = head.transform.localEulerAngles;
}
void LateUpdate()
{
playerPos = player.transform.position;
distance = Vector3.Distance(this.transform.position, playerPos);
//頭から前方3mにRayを出す
//それにPlayerが当たるとtrueになる
if (Physics.Raycast(head.transform.position, head.transform.up * 3, 3))
{
tracking = true;
}
if (tracking)
{
//Agentを動かす
agent.isStopped = false;
//追跡の時、quitRangeより距離が離れたら中止
if (distance > quitRange)
tracking = false;
//Playerを目標とする
agent.destination = playerPos;
}
else
{
//Agentを止める
agent.isStopped = true;
//首を左右どちらに動かすか
if (headAngle >= 45)
{
neckSwitch = false;
}
else if (headAngle <= -45)
{
neckSwitch = true;
}
//首の角度に加える数値を増減させる
if (neckSwitch)
{
headAngle += Time.deltaTime * 10;
}
else
{
headAngle -= Time.deltaTime * 10;
}
//首のローカルの角度に初期角度とX軸の首の傾きの数値を加える
head.transform.localEulerAngles = new Vector3(
startHeadAngle.x + headAngle,
startHeadAngle.y, startHeadAngle.z);
}
}
void OnDrawGizmosSelected()
{
//頭から出ているRayの線を赤いワイヤーフレームで示す
Gizmos.color = Color.red;
Vector3 direction = head.transform.position + head.transform.up * 3;
Gizmos.DrawLine(head.transform.position, direction);
//quitRangeの範囲を青いワイヤーフレームで示す
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, quitRange);
}
}
view raw 28a.cs hosted with ❤ by GitHub

ユニティちゃんにアタッチしたらまたInspectorでCharacter1_Headをセットしてください。

あとNavMeshAgentはベイクした地面の上しか移動できませんが、ベイクの仕方が分からなければ前回の記事を見てください。

【UnityC#講座】近づいたら追いかけてくる巡回ユニティちゃん【NavMeshAgent】

出来上がりはこのようになります。

Gizmosをゲームビューで表示するにはビュー右上のGizmosをクリックし、Hierarchy上でGizmosを表示するスクリプトをアタッチしたオブジェクトを選択している必要があります。

監視人ユニティちゃん/完成

■関連記事

今回のプレイヤーの操作方法はこちらを使っています。

【UnityC#講座】ユニティちゃんをマウスカーソルの方向に移動させる

【UnityC#講座】近づいたら追いかけてくる巡回ユニティちゃん【NavMeshAgent】

【UnityC#講座】ユニティちゃんをモブキャラのごとくランダム移動させる【NavMeshAgent】

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています

スポンサーリンク

目次に戻る