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); | |
} | |
} |
今回UpdateではなくLateUpdateになっていますが、これはアニメーションクリップと併用した際、Updateでは首を振る動作が出なくなるためです。
InspectorにはCharacter1_Headを入れます。
分かりづらいところにあります。
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); | |
} | |
} |
ユニティちゃんにアタッチしたらまたInspectorでCharacter1_Headをセットしてください。
あとNavMeshAgentはベイクした地面の上しか移動できませんが、ベイクの仕方が分からなければ前回の記事を見てください。
【UnityC#講座】近づいたら追いかけてくる巡回ユニティちゃん【NavMeshAgent】
出来上がりはこのようになります。
Gizmosをゲームビューで表示するにはビュー右上のGizmosをクリックし、Hierarchy上でGizmosを表示するスクリプトをアタッチしたオブジェクトを選択している必要があります。
■関連記事
今回のプレイヤーの操作方法はこちらを使っています。
【UnityC#講座】ユニティちゃんをマウスカーソルの方向に移動させる
【UnityC#講座】近づいたら追いかけてくる巡回ユニティちゃん【NavMeshAgent】
【UnityC#講座】ユニティちゃんをモブキャラのごとくランダム移動させる【NavMeshAgent】
この作品はユニティちゃんライセンス条項の元に提供されています
スポンサーリンク