それでは最後の敵キャラクターとして「プレイヤーに一番近い地点に向かう敵」を作ってみましょう。こちらも巡回する敵のスクリプトを少し変えるだけで実装することができます。
プレイヤーに近い地点に向かう敵のC#スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RabbitController : BaseEnemyController
{
int destinationIndex = 0;
float distance = 0;
float leastDistance = 0;
GameObject player;
GameObject[] navPointsObj;
Vector3 diff;
protected override void Start()
{
base.Start();
player = GameObject.FindGameObjectWithTag("Player");
navPointsObj = GameObject.FindGameObjectsWithTag("NavPoint");
GetNextPoint();
}
protected override void Move()
{
base.Move();
if (navPointsObj.Length == 0)
{
Stop();
return;
}
rigidBody.velocity = agent.desiredVelocity;
//今の目標地点に近づいてきたら、次の目標地点を設定
if (!agent.pathPending && agent.remainingDistance < 0.5f)
{
GetNextPoint();
}
}
void GetNextPoint()
{
if (navPointsObj.Length == 0)
{
Stop();
return;
}
//ある地点とプレイヤーの地点との距離を計測し、一番プレイヤーに近い地点を目標地点とする
for(int i= 0; i < navPointsObj.Length; i++)
{
diff = navPointsObj[i].transform.position - player.transform.position;
distance = diff.sqrMagnitude;
if(i == 0)
{
//とりあえず、最初の距離を仮の最小値として登録
leastDistance = distance;
destinationIndex = i;
}
else
{
if(distance < leastDistance)
{
leastDistance = distance;
destinationIndex = i;
}
}
}
target = navPointsObj[destinationIndex].transform;
agent.SetDestination(target.position);
}
}
変更点はGetNextPoint()メソッドの処理ですね。説明するまでもないと思いますが、今回の処理では各地点についてプレイヤーとの距離を求め、一番プレイヤーに近い地点を目標地点として設定します。ちなみにベクトルの長さの大小関係を比較するときはsqrMagnitudeを使うと普通のmagnitudeよりもずっと高速なようです(sqrMagnitudeで得られる値は2乗されたものですが、大小関係を比較するだけなら問題にはなりません)。
これで敵キャラが揃いました。次のページではステージづくりに進む前に、ひと手間かけてミニマップを作っていきます。
次のページ→ミニマップの作り方
