チャムコード

チャーさんのUnityゲームラボです。Unityでゲーム制作する時に使うコードやノウハウをメインに発信しています。Unityでゲーム制作したいと思っているなら読んでください。

敵Aiの作り方

Unityで敵に巡回させるならこの3ステップ(ランダム巡回もできる)

投稿日:2023年10月3日 更新日:

うも、チャーさんです。

あなたはUnityで敵を巡回させたいですか?

この記事ではUnityで敵を巡回させる方法を説明します。

 

なので、この記事を読めばUnityで敵の巡回をすぐにさせれる

ようになります。ですが、これを読まなければ敵の巡回を

なかなかさせることができず、苦戦するでしょう。

 

そしてエラーやらなんやらで時間が溶けていくかもしれません。

そういうことになりたくなければ、このまま

記事を読んでください。

 

動画による説明はこちら

 

Unityで敵を巡回させる3ステップ

 

ということで結論です。

Unityで敵を巡回させたければ、

 

  1. NavMeshの設定+NavMeshAgentコンポーネントをつける
  2. 巡回地点を設置する
  3. 巡回用のコードを書く

 

大きくこの3つをやりましょう。

そうすればUnityで敵の巡回機能を実装することができます。

 

ということでそれぞれ1つずつ説明します。

まず、

 

NavMeshの設定+NavMeshAgentコンポーネントをつける

 

ですが、これをすることでUnity内で敵オブジェクトを

好きな地点(座標)まで自由に移動させることができます。

 

障害物とかがあってもそれを避けて、設定した巡回地点を

回らせることができるようになります。

 

なので超便利です。

 

 

NavMeshの設定+NavMeshAgentコンポーネントをつける

に関しては、

 

以前書いた以下の記事で詳しく説明してるので、

こちらを参照してください。

unityで敵を移動させる方法(詳細にわかりやすく説明します)

 

 

で上記の記事ではNavMeshAgentの

コードのdestination部分(敵オブジェクトの移動先)が

プレイヤーになっていますが、

 

これを今度は巡回させたい地点に設定するという

のだけ必要です。

 

ということで、NavMeshとNavMeshAgentの設定が

済んだら次は巡回地点の設定に進みましょう。

 

 

巡回地点を設置する

 

次に巡回地点ですが、

まずHierarchyの+ボタンから、3dオブジェクトをcubeでも何でも

好きなやつ選んで、敵オブジェクトの巡回地点として設置しましょう。

 

(ゲーム的にはcreate Emptyで何もオブジェクトが表示されない

やつを選んだ方がいいですが、最初は分かりやすさ重視で、

cubeとかsphereとか物体のあるやつ選びましょう)

 

 

で、

 

これらオブジェクトの設置位置に関しては、

あなたの好きな場所に3dオブジェクトを

設置して大丈夫です。

 

敵オブジェクトはその設置した場所を巡回地点として移動するので、

適当に3つか4つくらいのオブジェクトを巡回させたい場所として

設置しましょう。

 

でそれらの設置が終わったら次は、

実際にコードを記入していきましょう。

 

 

敵を巡回させるコード

 

add componentからc#のスクリプトを設定したら、

そのスクリプトの中に以下のようなコードを書きましょう。

 

using UnityEngine.AI;

↑(これ忘れるとnavmesh使えないのでコード最初の部分に

忘れずに書きましょう)

 

public Transform[] goals;
private int destNum = 0;
private NavMeshAgent agent;
 
    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();      
        agent.destination = goals[destNum].position;
    }
 
    void nextGoal(){
 
    destNum += 1;
    if(destNum == 3){
    destNum = 0;
    }
 
    agent.destination = goals[destNum].position;
 
    Debug.Log(destNum);
    }
    
    // Update is called once per frame
    void Update()
    {
        // Debug.Log(agent.remainingDistance);
        if(agent.remainingDistance < 0.5f){
        nextGoal();
        }
        
    }

 

 

とゆうことでコードのそれぞれの部分で補足説明していきます。

 

変数宣言部分の説明

 

まず、最初の配列の変数の宣言ですが、

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で敵に索敵機能を持たせる方法(簡単なやり方)

 

まとめ

 

ということで一旦まとめに入ります。

 

Unityで敵を巡回させたい場合は、

  1. NavMeshの設定+NavMeshAgentコンポーネントをつける
  2. 巡回地点を設置する
  3. 巡回用のコードを書く

をやりましょう。

すると、敵に巡回行動をさせることができるようになります。

 

ということで是非是非やってみてください。

それでは今回の記事を読んでいただきありがとうございました。

 

それでは。

 

チャーさん

 

-敵Aiの作り方

関連記事

Unityで敵の上にHPを表示させる方法「すぐにできます」

どうも、チャーさんです。 あなたは、unityで敵にHPを表示させたいですか?   この記事ではunityで敵の上にHPを表示させる方法について お話しします。   なのであなたが …

no image

unityで敵に近づくと追いかけてくるコードとコードの解説記事

どうも、チャーさんです。   あなたはunityで敵に近づくと、 プレイヤーを追いかけてくるという機能を つけたいと思っていませんか?   この記事ではそれを実現するコードと方法や …

Unityで敵が攻撃を受けたらHPを減らす機能の作り方

どうも、チャムコードというブログ運営してる、チャーさんです。   あなたはUnityで敵のHPを減らす機能を作りたいですか? 敵がプレイヤーから攻撃を受けたときに、HPを減らす 処理をつけた …

Unityで敵にプレイヤーを攻撃させる方法

どうも、チャーさんです。   あなたはUnityで敵が攻撃してくるようにしたいですか? この記事ではUnityで敵に攻撃させる方法を書いてるので、 この記事を読めば敵に攻撃させることができま …

Unityで敵を徘徊させたい?ならこうやればいいですよ。

どうも、チャーさんです。   あなたは、Unityで敵に徘徊させたいですか? であればこの記事を読んでください。   読めば、Unityで敵に徘徊させることができるようになります。 …

Unityで敵による索敵を距離で行わせる簡単な方法「このメソッド1個使えばいける」

どうも、チャーさんです。 いつもこのブログ、チャムコードに来ていただき ありがとうございます。   あなたは、Unityで敵による索敵を距離で行わせたいですか? プレイヤーと敵オブジェクトと …

no image

unityで敵を移動させる方法(詳細にわかりやすく説明します)

どうも、チャーさんです。   あなたはunityで敵を移動させたい、そう思っていませんか? コライダーなどでもできるが、他の方法がないかと探してませんか?   この記事ではコライダ …

unity-enemy-spawn

Unityで敵をスポーンさせる簡単な方法[速攻でできる]

どうも、チャーさんです。 この記事では、Unityで敵をスポーンさせる方法について お話しします。   なので、あなたがこの記事を読めば、 すぐにUnityで敵をスポーンさせることができるよ …

Unityで敵に索敵機能を持たせる方法(簡単なやり方)

どうも、チャーさんです。   あなたはUnityで敵に索敵機能をつけたいですか? この記事ではUnityで敵に索敵機能をつける方法を説明します。 なので、   この記事を読めば、あ …

unityで敵を消滅させる

Unityで敵を消滅させる方法(敵を攻撃した時に消滅させるとかも)

  どうも、チャーさんです。   あなたはUnityで敵を消滅させたいですか? 例えばプレイヤーが敵を攻撃したら消滅させたり、 そんな風にしたいならばこの記事を読んでください。 & …

最新記事

チャーさん

Unityに関する記事を書いてます。

 

[簡単な経歴]

 

2018年-プログラムを始めUnityの存在を知りハマる。

2019年-エンジニアとして仕事開始(web系)

2021年-UnityでVR開発等にも手を出し始める。

現在-エンジニアとして活動しながらUnityも続行中。

 

youtubeでは、Unityに関する動画をあげてるので、

あなたのUnityスキルアップにどうぞ。