範囲内にいるときだけ敵キャラが追いかけてくるようにする

前回の作業で無事敵キャラクターが主人公を追いかけてくれるようになりました。しかし、このままでは最初から最後まで主人公を追いかけ続けることになるので、プレイヤーとしてはたまったものではありません。そこで、敵キャラに主人公を検出する範囲(視界のようなもの)を作って、その中に主人公がいる時だけ追いかけてくるようにしましょう。

スポンサーリンク

検出範囲の作成

まずは検出範囲のトリガーを作成します。true_scarecrowにBox Colliderをアタッチし、Sizeを適当な大きさに変更して「Is Trigger」にチェックを入れてください。

検出範囲の作成

スポンサーリンク

EnemyController.csの変更

そうしたら、EnemyControllerを下記のように変更します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityStandardAssets.Characters.ThirdPerson;

[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
[RequireComponent(typeof(ThirdPersonCharacter))]

public class EnemyController : MonoBehaviour
{
	[System.NonSerialized]
	public bool isActive = false;

	[SerializeField]
	Transform target;

	NavMeshAgent agent;
	ThirdPersonCharacter character;

	void Start ()
	{
		agent = GetComponent<NavMeshAgent>();
		character = GetComponent<ThirdPersonCharacter>();

		agent.updateRotation = false;
		agent.updatePosition = true;
	}

	private void Update()
	{
		if (isActive)
		{
			agent.isStopped = false;

			if (target != null)
				agent.SetDestination(target.position);

			if (agent.remainingDistance > agent.stoppingDistance)
			{
				character.Move(agent.desiredVelocity, false, false);
			}
			else
			{
				character.Move(Vector3.zero, false, false);
			}
		}
		else
		{
			character.Move(Vector3.zero, false, false);
			agent.isStopped = true;

			return;
		}
		
	}

	public void SetTarget(Transform target)
	{
		this.target = target;
	}

	//他のオブジェクトに接触したときの処理
	void OnCollisionEnter(Collision other)
	{
		if(other.gameObject.tag == "Player")
		{
			Debug.Log("ゲームオーバーです。");

			isActive = false;
		}
	}

	//検出範囲に入った時の処理
	void OnTriggerStay(Collider other)
	{
		if(other.gameObject.tag == "Player")
		{
			isActive = true;
		}
	}

	//検出範囲から出たときの処理
	void OnTriggerExit(Collider other)
	{
		if (other.gameObject.tag == "Player")
		{
			isActive = false;
		}
	}
}

スポンサーリンク

変更部分の解説

トリガーの範囲内に入っているときはisActiveをtrueに、そうでないときはisActiveをfalseにすることで範囲内のときだけ追いかけてくるようにしました。また、isActiveがfalseのときはNavMeshAgentを停止させて敵キャラが止まるように変更しました。

ちなみに、isActiveをパブリック変数にしたので他のオブジェクトから敵キャラの追跡・停止を操作することもできるようになっています。なので例えば別の検出範囲を作り、そこを通ったら敵が追いかけてくるというようなシチュエーションも簡単に実現できます。

次のページ→ProBuilderで仮のステージを作る