Oops! It appears that you have disabled your Javascript. In order for you to see this page as it is meant to appear, we ask that you please re-enable your Javascript!

unity

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

投稿日:

Pocket

うも、チャーさんです。

 

あなたは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の機能を使って、

 

実現しましょう。

 

 

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

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

 

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

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

 

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

 

 

それでは。

 

チャーさん

 

-unity

スポンサードサーチ

関連記事

no image

unityでoculus questの開発をしたい方必見!手順まとめました

どうも、チャーさんです。   あなたはunityでoculus questの 開発をしたい、そう思ってませんか?     この記事ではunityでoculus quest …

no image

unityで弾の発射位置をコントロールする方法

どうも、大石です。 あなたはunityで弾の発射位置を自由に コントロールしたいですか?   この記事を読めばあなたの好きな位置から 弾を発射できるようになりますよ。   スポンサ …

no image

[unity]foreach内でget componentを使う方法

どうも、チャーさんです。   この記事ではunityのforeachループで get componentする方法を書きます。     なのでこの記事を読めば、 &nbsp …

no image

unity上でblender作成モデルが透ける時の解決法

どうも、チャーさんです。   あなたはunityにblenderで作ったモデルを 持ってきたものの、面が透ける現象が起こって 困っていませんか?     この記事は、透け …

no image

Unityでオブジェクトに重力を1分以内につける方法

  どうも、チャーさん(@chaa___san)です。   あなたはUnityでオブジェクトに重力をつけたいですか?   この記事ではUnityでオブジェクトに、 重力を …

no image

unityで地形を作る方法「初心者でもできるように丁寧に説明してます」

どうも、チャーさんです。   あなたはunityでいい感じの地形を作りたい。 でも、やり方がわからない。と悩んでいませんか?   この記事では、unityで地形を作る方法を、 ステ …

no image

unityでオブジェクトを移動させたい人は読んでください。

どうも、チャーさんです。   あなたはunityでオブジェクトや、 プレイヤーなど自由自在に移動させたい、 そう思っていませんか?     キーボードの上下左右の矢印ボタ …

no image

unityで弾の発射の向きを敵に向ける方法(自動)

どうも大石です。   あなたはunityで弾を発射するときの向き をコントロールしたいと思っていませんか?   この記事を読めば、あなたはunityで 弾を敵に向かって発射させれる …

no image

unityで矢印キーでオブジェクトを移動させるには(3d)

どうも、チャーさんです。 あなたはunityで矢印キーで3dオブジェクトを 移動させたいですか?   この記事では矢印キーによる3dオブジェクトの 移動を実現する方法を書いてるので、 読めば …

no image

unityでターン制のゲームを作るにはコレを使いましょう

どうも、チャーさんです。 あなたはunityでターン制ゲームを作りたい そう思っていませんか?   この記事ではunityでターン制のゲームを 作る方法を書いています。   なので …

no image

blenderで作ったモデルをunityにインポートする方法「簡単です」

どうも、チャーさんです。   あなたはblenderで作ったものを、 unityで表示(インポート)したいと、 思っていませんか?   この記事では、あなたが作ったblenderの …

no image

unityで弾を発射する方法(簡単3ステップ)

どうも、大石です。   あなたは、unityで弾を発射したいですか? この記事を読めば、あなたはunityで弾を発射 できるようになります。   なので、弾を発射したければ、 この …

no image

unityでオブジェクトを回転させる方法「1分でできます」

どうも、チャーさんです。   あなたはunityでオブジェクトを回転させたいですか?   unityでゲームなど作るとオブジェクトを 回転させたい場面がありますよね。   …

no image

unityアセットの使い方を初心者でもわかるように説明。

  どうも、チャーさんです。   あなたはunityのアセットの使い方が、 わからず困ってませんか?   この記事ではunityのアセットの使い方を、 1から説明してます …

no image

unityでカメラを追従させる簡単なコードと方法の説明をする記事

  どうも、チャーさんです。   あなたはunityでカメラの追従をさせたい、 こう思ってませんか?   この記事ではオブジェクトをカメラで追従させる、 (カメラが追いか …

最新記事

チャーさん

プログラミング・筋トレ・unity系の記事などを書いてます。

大学卒業後→開業→個人事業主7年目ぐらいです。webサイト制作したり、unityでゲーム開発しております。

youtubeもやってまして、主にプログラミング動画とかunity系の動画をあげてるので見てください。