どうも、チャーさんです。
あなたはUnityで敵を巡回させたいですか?
この記事ではUnityで敵を巡回させる方法を説明します。
なので、この記事を読めばUnityで敵の巡回をすぐにさせれる
ようになります。ですが、これを読まなければ敵の巡回を
なかなかさせることができず、苦戦するでしょう。
そしてエラーやらなんやらで時間が溶けていくかもしれません。
そういうことになりたくなければ、このまま
記事を読んでください。
動画による説明はこちら
目次
Unityで敵を巡回させる3ステップ
ということで結論です。
Unityで敵を巡回させたければ、
- NavMeshの設定+NavMeshAgentコンポーネントをつける
- 巡回地点を設置する
- 巡回用のコードを書く
大きくこの3つをやりましょう。
そうすればUnityで敵の巡回機能を実装することができます。
ということでそれぞれ1つずつ説明します。
まず、
ですが、これをすることでUnity内で敵オブジェクトを
好きな地点(座標)まで自由に移動させることができます。
障害物とかがあってもそれを避けて、設定した巡回地点を
回らせることができるようになります。
なので超便利です。
NavMeshの設定+NavMeshAgentコンポーネントをつける
に関しては、
以前書いた以下の記事で詳しく説明してるので、
こちらを参照してください。
で上記の記事ではNavMeshAgentの
コードのdestination部分(敵オブジェクトの移動先)が
プレイヤーになっていますが、
これを今度は巡回させたい地点に設定するという
のだけ必要です。
ということで、NavMeshとNavMeshAgentの設定が
済んだら次は巡回地点の設定に進みましょう。
巡回地点を設置する
次に巡回地点ですが、
まずHierarchyの+ボタンから、3dオブジェクトをcubeでも何でも
好きなやつ選んで、敵オブジェクトの巡回地点として設置しましょう。
(ゲーム的にはcreate Emptyで何もオブジェクトが表示されない
やつを選んだ方がいいですが、最初は分かりやすさ重視で、
cubeとかsphereとか物体のあるやつ選びましょう)
で、
これらオブジェクトの設置位置に関しては、
あなたの好きな場所に3dオブジェクトを
設置して大丈夫です。
敵オブジェクトはその設置した場所を巡回地点として移動するので、
適当に3つか4つくらいのオブジェクトを巡回させたい場所として
設置しましょう。
でそれらの設置が終わったら次は、
実際にコードを記入していきましょう。
敵を巡回させるコード
add componentからc#のスクリプトを設定したら、
そのスクリプトの中に以下のようなコードを書きましょう。
using UnityEngine.AI;
↑(これ忘れるとnavmesh使えないのでコード最初の部分に
忘れずに書きましょう)
とゆうことでコードのそれぞれの部分で補足説明していきます。
変数宣言部分の説明
まず、最初の配列の変数の宣言ですが、
public Transform[] goals;
この配列に巡回地点を代入していくことになります。
NavMeshAgentでは、移動先の座標を明示してあげる
必要があるため、Transform型です。
ここ間違えるとエラー出るので注意しましょう。
で、これかくとインスペクターに、配列用の変数が
表示されるので、
そこのsizeという部分に巡回地点に設置したオブジェクトの
数分の数字を入れましょう。
例えば巡回地点が3つで巡回地点のオブジェクトを
3つ用意したなら、3です。
そして数字を入力するとその下に、
配列のインデックス番号と値代入用の空欄が、
element0 空欄
element1 空欄
・・・
みたいな感じで表示されるので
そこに先ほど用意した、巡回地点のオブジェクトを
それぞれドラッグ&ドラッグしていきましょう。
すると巡回地点の座標情報が配列に代入されていきます。
これで巡回地点の位置情報はバッチリです。
次に、
private int destNum = 0;
は配列のインデックス番号指定用です。
この数字を1ずつプラスしていき
先ほど用意した巡回位置情報が入った配列の
インデックス番号として、
後述する
agent.destination = goals[destNum].position;
(agent.destinationとは敵オブジェクトの移動先という意味)
のように書けば、
敵オブジェクトの移動先が次々に切り替わるようになり
巡回地点1到達後に巡回地点2に向かって巡回していきます。
で、あともう1個変数
private NavMeshAgent agent;
// Start is called before the first frame update
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
ですが、
NavMeshAgentの移動先をいじるには、
NavMeshAgentのコンポーネントを取得する必要があるので、
それ用です。
関数部分説明
次に独自の関数の
void nextGoal(){
destNum += 1;
if(destNum == 3){
destNum = 0;
}
agent.destination = goals[destNum].position;
Debug.Log(destNum);
}
ですが、
これが敵オブジェクトの次の移動先を設定
する関数です。
主に大事なのは、
agent.destination = goals[destNum].position;
でして、
この部分(agent.destinationが)
敵オブジェクトの巡回先を決めています。
でその代入内容が、最初に配列に設定した巡回先の位置情報たちです。
巡回地点情報が入った配列の値を次々に
巡回先に設定するため、先ほど説明したdestNumを1つずつ増やし、
インデックス番号として設定する。
それにより敵オブジェクトの移動先(巡回先が順次更新され)
そして最後の地点に来たらまたdestNumを0に戻せば、
また最初の巡回先に戻り
ずっとぐるぐる巡回してくれるわけです。
で、最後の
void Update()
{
// Debug.Log(agent.remainingDistance);
if(agent.remainingDistance < 0.5f){
nextGoal();
}
}
ですが、この、agent.remainingDistance というのは
敵オブジェクトと巡回先のオブジェクトのまでの距離を
表示してくれるプロパティです。
なので、敵オブジェクトが巡回地点に近づくほどに距離がつまり
3,.2.,1,.0(到達)という感じになります。
Deubg.Logのコメントアウトしてる部分を
コメントとって実行しconsoleを見ると距離が数値でどんどん
縮まるのを表示してくれるので分かりやすいです。
で最後の最後に、
if(agent.remainingDistance < 0.5f){
nextGoal();
}
で敵オブジェクトと巡回先の距離が、0.5より小さくなったら
nextGoal();関数が動き、
次の巡回先を設定してまたそっちに向かって巡回していくという
仕組みになっております。
という感じで、
これらのコードを記述すれば、
敵を巡回させることが可能です!(やったね、わっしょい!)
敵の巡回をランダムにしたいならコレ(おまけ)
でここからはちょいとおまけですが、
この記述のままだと巡回をずっと決まった順番で
巡回します。
ですが当然ランダムで巡回させたい、という気持ちも
あなたには芽生えることでしょう。
なので、その方法ですが、
destNum += 1;
if(destNum == 3){
destNum = 0;
}
としていたのを、
↓ ↓ ↓ ↓
destNum = Random.Range(0,3);
この1行に変えましょう。
するとランダムな0~2までの数字がこのdestNumに代入
され、配列のインデックス番号がランダムになるため、
巡回地点として設定した地点をランダムに巡回してくれるようになります。
ということで、ランダムに巡回地点を巡回させたい場合は
これを試してみてください。
するとランダム巡回の実現です。
敵に巡回させながら索敵までさせるならコレ(更におまけ)
で更に更におまけ内容ですが、
この巡回機能を設定したら、次は以前の記事で書いた
索敵機能も合わせて設定しましょう。
すると敵が巡回しながらプレイヤーが近づいて
敵の索敵に引っかかると、敵が追いかけてくるという機能が
可能になります。
これやると更にゲーム感出せるので、ぜひやってみてください。
索敵のやり方は以下の記事をご参考に。
まとめ
ということで一旦まとめに入ります。
Unityで敵を巡回させたい場合は、
- NavMeshの設定+NavMeshAgentコンポーネントをつける
- 巡回地点を設置する
- 巡回用のコードを書く
をやりましょう。
すると、敵に巡回行動をさせることができるようになります。
ということで是非是非やってみてください。
それでは今回の記事を読んでいただきありがとうございました。
それでは。
チャーさん