チャムコード

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

敵Aiの作り方

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

投稿日:2020年4月9日 更新日:

うも、チャーさんです。

 

あなたはunityで敵に近づくと、

プレイヤーを追いかけてくるという機能を

つけたいと思っていませんか?

 

この記事ではそれを実現するコードと方法や手順を

書いてるので読めば、敵に近づくと追いかけてくる

機能をつけれるようになります。

 

 

ということで、近づいたら追いかけてくる

をやりたい場合、読んでください。

(コードもシンプルですよ)

 

 

unityで敵に近づくと追いかけてくるをやるには

 

ということでunityでプレイヤーが敵に近づくと

追いかけてくるようにするには、

 

NavMeshAgentと、

Vector3.Distance()という関数と、

if文を組み合わせれば実現できます。

 

 

あとで詳しく説明しますが、

これらで近づくと追いかけてくる機能ができる理由を

先に簡単に説明しますと、

 

まずunityに用意されてるNavMeshAgent

という機能を使うと、敵を自動で目的地(プレイヤー)に

向かって動かすことができます。

 

そして、Vector3.Distance()というこれまたunityに

用意されてる関数を使うと、オブジェクト同士の

距離を出すことができます。(floatの値で)

 

 

であとはif文を使い、

この距離が一定値以下になれば

(プレイヤーが敵に近づけば)

 

NavMeshAgentを稼働させ敵がプレイヤーに

向かって移動してくる(追いかけてくる)

という機能を作れます。

 

 

とはいえこれだけじゃわかりづらいと思うはずなので、

 

ここからは実際に動かすためのコードとコード解説を

載せます。

 

近づくと追いかけてくるコード

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class navtest : MonoBehaviour {

    public GameObject goal; //これにプレイヤーを格納
    public NavMeshAgent agent; //①敵が自動で動くために必要
    public float distance; //②プレイヤーと敵の距離を格納する変数(distane=距離)
   

    // Use this for initialization
    void Start () {
     agent = GetComponent<NavMeshAgent> (); //①
        goal = GameObject.Find (“ここにプレイヤーのゲームオブジェクト名”);
    }
    
    // Update is called once per frame
    void Update () {

        //②二者間の距離を計算してfloat 一定値いかになれば追跡する
        distance = Vector3.Distance (transform.position, goal.transform.position);
        Debug.Log (distance);

        if (distance < 5){
            agent.destination = goal.transform.position; //①
        }
    }
}

 

コードは以上でして、このスクリプトを、

敵になるゲームオブジェクトにつければokです。

 

コードの説明

 

でここからはコードの説明に入ります。

(上記コードから説明する部分を抜粋します)

 

敵を動かす部分のコード

 

①まずスクリプトの中のNavMeshAgent関係です。

 

これら↓

    public NavMeshAgent agent; //①敵が自動で動くために必要

    agent = GetComponent<NavMeshAgent> ();

   agent.destination = goal.transform.position;

 

ですが、これらはオブジェクトを自動で

目的地に向かって動かせる機能を使うために必要な

コードです。

 

詳しくはNavMeshAgentで敵を移動させる

という記事のなかで全部説明したので、

以下の記事を読んでください。

 

すると敵を動かせます。

 

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

 

敵とプレイヤーの距離をはかるコード

 

②で次にこれが本記事のメイン部分でして、

以下のコードで敵に近づくとという部分を作っていけます。

 

それに当たるコードは、

 

   public float distance; //②プレイヤーと敵の距離を格納する変数(distane=距離)

void Update () {

        //②二者間の距離を計算してfloat 一定値いかになれば追跡する
        distance = Vector3.Distance (transform.position, goal.transform.position);

}

ですが、

 

このVector3.Distance ();という関数を使うと、

先ほどと説明がダブりますが、

 

オブジェクトとオブジェクト同士の距離を

算出してくれます。

でその距離はfloat値で出ます。

 

(Debug.Log(distance);で見ると一発でわかります)

 

 

つまりこの関数を使うと、

敵オブジェクトとプレイヤーオブジェクトの距離を

算出してくれます。

 

なのでこれを使うと敵に近づくと、

OOをするという機能を作れるわけです。

(ある距離まで行くとOOをするのような感じです)

 

 

でこのDistance関数はプレイヤーを動かすゲームの場合なら、

update関数の中に書いておく必要があります。

 

そうすると常に敵とプレイヤーの距離を出してくれ

プレイヤーが敵に近づいたらというのを検知させれます。

 

 

でこのVector3.Distance ();ですが、

()の引数の中には、2つの値をとれまして、

2つの位置情報を引数にいれれます。

 

例えば上記のコード例で出しました

 Vector3.Distance (transform.position, goal.transform.position);

であれば、

 

transform.position

(このスクリプトが貼ってあるオブジェクトの位置)と

 

goal.transform.position

(対象になるオブジェクトの位置)

 

の距離を測ってくれるようになるわけです。

 

 

なので、このスクリプトを敵オブジェクトに

つけとけば、transform.positionで敵のオブジェクトの位置、

 

goal.transform.positionで、

プレイヤーの位置情報となり、

 

敵とプレイヤーとの距離を

算出できます。

 

 

近づいたら追ってくるを実装

 

であとは簡単でして、

 

次のコードの

     if (distance < 5){
            agent.destination = goal.transform.position; //①
        }

 

ですが、if文を使いオブジェクト同士の距離が

5以下になれば、

 

agent.destination = goal.transform.position; //①

プレイヤーに向かって敵が移動してくる

が発動するようになります。

 

 

わかると思いますが、この

 if (distance < 5)

distanceというのは、

 

 distance = Vector3.Distance (transform.position, goal.transform.position);

で敵とプレイヤーの距離を格納した変数でして、

プレイヤーが移動すると常に、

 

敵とプレイヤーの距離の数値が変動します。

(update関数のなかに書いてるので。)

(Debug.Log(distance);で見てやるとよくわかります)

 

 

でプレイヤーが敵オブジェクトに近づいていくと、

このdistanceの値がどんどん小さくなり、

上記コードでいう5以下になりますと、

 

if文の中身が稼働して、

敵が動き出すという仕組みです。

 

つまりはプレイヤーがある一定の距離まで近づくと、

敵がプレイヤーに近づいてくる、という風になるのです。

 

 

なのでやることは割とシンプルでして、

距離をはかり、距離が一定値だったら

敵を動かすということをやれば、

 

敵に近づくと追いかけてくるという機能を

作れるのです。

 

手順の説明

 

でコードは説明しましたので、

あとはやり方の手順を書いておきます。

 

敵、プレイヤー、床を準備

 

まずは当然のことながら、

敵とプレイヤーと床を用意しましょう。

 

用意済みならここは飛ばしましょう。

 

 

NavMeshとNavMeshAgentの設定

 

次に、床にNavMeshの設定をし、

敵オブジェクトにNavMeshAgentという

コンポーネントをつけましょう。

 

やり方は上で紹介した記事に書いてます。

 

も一回貼っときます。

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

 

敵にスクリプトをつける

 

で次に、敵オブジェクトにスクリプトを

つけましょう。

 

内容はこの記事で紹介したスクリプトを

ペタっとそのまま写せばいいです。

上戻るの面倒だと思うので同じのまた載せておきます。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI

public class navtest : MonoBehaviour {

    public GameObject goal
    public NavMeshAgent agent
    public float distance

    // Use this for initialization
    void Start () {
     agent = GetComponent<NavMeshAgent> (); //①
        goal = GameObject.Find (“ここにプレイヤーのゲームオブジェクト名”);
    }
    
    // Update is called once per frame
    void Update () {

        distance = Vector3.Distance (transform.position, goal.transform.position);
        Debug.Log (distance);

        if (distance < 5){
            agent.destination = goal.transform.position; //①
        }
    }
}

 

コードについての補足

 

で1つ補足ですが、

 

goal = GameObject.Find (“ここにプレイヤーのゲームオブジェクト名”);

の引数の中には、あなたのゲームでいう

プレイヤーに当たるオブジェクトの名前を書きましょう。

 

 

例えばゲームオブジェクトのCubeをプレイヤーに

見立ててるならば、

 

goal = GameObject.Find (“Cube”);

と書くことになります。

 

またもしCubeを使ってても

そのオブジェクトの名前をPlayerとかに

してるなら引数には(“Player”)と書きましょう。

 

 

動くか確認

 

であとは、ゲームを再生して、

プレイヤーオブジェクトで敵オブジェクトに

近づいていって、

 

敵が動き出したら成功です。

 

晴れて機能完成です。

お疲れ様です。

 

 

ということで手順としては割と

シンプルなので、やってみてください。

 

まとめ

 

それではまとめに入ります。

 

unityで敵に近づいたらプレイヤーを

追いかけてくるという機能を作りたいなら、

 

Distance関数と、

if文と、

NavMeshAgentの機能を使って、

 

実現しましょう。

 

 

そうすればあなたの作ってるゲームで

敵に近づくと追いかけさせれますよ。

 

ということで近づくと追いかけてくるの記事でしたが、

読んでもらってありがとうございました。

 

これができるとかなりゲームっぽくなってきますよ。

 

 

それでは。

 

チャーさん

 

-敵Aiの作り方

関連記事

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

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

no image

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

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

unityで敵を消滅させる

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

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

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

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

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

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

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

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

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

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

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

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

unity-enemy-spawn

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

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

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

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

最新記事

チャーさん

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

 

[簡単な経歴]

 

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

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

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

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

 

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

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