どうも、チャーさんです。
あなたはunityで敵を移動させたい、そう思っていませんか?
コライダーなどでもできるが、他の方法がないかと探してませんか?
この記事ではコライダーなどを使わず敵を移動させる
方法を書いてます。なので読めば、あなたはunityで
敵を移動させれるようになります。
そして敵オブジェクトを自由に移動させて
ゲームづくりを楽しめるでしょう。ということでunityで
敵を移動させたいなら読んでみてください。
*動画はこちら
目次
unityで敵を移動させる方法
ということで早速その方法ですが、
navMeshAgentというunityで用意されてる
機能を使いましょう。
というのもnavMeshAgentとは、
オブジェクトを目的地に向かって動かす
という機能でして、
これを使えばunityで敵をプレイヤーなどに向かって
移動させるなどできます。
ということで敵を移動させたければ、
navMeshAgentを使いましょう。
unityで敵を移動させるための手順
ということで、ここからはこのnavMeshAgentを使い
敵を移動させるための手順を書いていきます。
床と敵を用意する
ということでまず、
1番目にオブジェクトが移動するための
床と敵役として移動させたいオブジェクトを
用意しましょう。
床はCreate 3d ObjectでTerrainなどを
用意しとけばいいでしょう。
敵はCubeでもCylinderでもなんでも
OKです。
で次2番目に、
navMeshというのを設定する必要があります。
でこのnavMeshというのは何かというと、
オブジェクトが移動する範囲を設定するというものです。
これをせずしてnavMeshAgentで敵を
移動させれないのでまずこれをやりましょう。
でやり方ですが、Inspector画面を
みてください。
するとその横にNavigationという表示が
書いてあります。
【追記 2023/10/2 】
Navigation 表示のやり方がちょっと変わったみたいで、
Unityの左上メニューにある Window → AI → Navigation の順でクリックしていけば Navigationを表示できます。
でまずはここをクリックしましょう。
でBakeというタブがあるので、
そこをクリックして、その下のBakeボタンを
クリックしましょう。
するとシーンビューの中の床に当たる部分が
青色で表示されます。
(その青い部分がオブジェクトが移動できるエリアになります。)
そしたらBakeが完了です。
そして次、3番目に、
navMeshAgentというコンポーネントを
敵にするオブジェクトにつけましょう。
その理由は、このnavMeshAgentというコンポーネントを
つけないと、オブジェクトを移動させることが
できないからです。
なので必須です。
やり方は普通にオブジェクトを選択し、
add componentをクリックすると、
コンポーネント一覧の中に、
navMeshAgentというのがあるので、
それをクリックしましょう。
スクリプトをつけましょう
でそれができたら、次4番目ですが、
敵にするオブジェクトにスクリプトを
つけましょう。
(navMeshAgentのコンポーネントを
つけたのと同じオブジェクトにつけましょう)
理由はこのスクリプト内で、
敵を移動させるコードを書くからです。
移動先である目的地などの指定も
このスクリプト内で行うので、
add componentしましょう。
で、スクリプトの中身ですが、
以下を参考にしてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI; //①←これを足しておかないと動かないので必須です。
public class navtest : MonoBehaviour {
public GameObject goal; //②←目的地になるオブジェクトを取得するための変数
public NavMeshAgent agent; //③コンポーネント取得用の変数
// Use this for initialization
void Start () {
agent = GetComponent<NavMeshAgent> (); //③コンポーネントの取得
goal = GameObject.Find (“ここに目的地になるゲームオブジェクト名“); //②ここで目的地を取得
}
// Update is called once per frame
void Update () {
agent.destination = goal.transform.position; //④ここで目的地を設定
}
}
上記コードですが実行すると敵が
プレイヤーに向かって移動してくる(追いかけてくる)
動きになります。
ということでコードを解説します。
①using UnityEngine.AI;
ですがnavMeshAgentの機能を使うのに必須です。
なのでこのコードを絶対に書きましょう。
書かないとエラー表示が出ます。
②public GameObject goal;
void Start () {
goal = GameObject.Find (“ここに目的地になるゲームオブジェクト名“); //②ここで目的地を取得
}
ここで目的地に当たるオブジェクトを取得
してます。
Findの後の()内には目的地に当たるオブジェクトを書きましょう。
例えばプレイヤーに相当するゲームオブジェクトの名前が
playerになってた場合、
goal = GameObject.Find (“player“);
にすればOKです。
でこんなことする理由ですがnavMeshAgentでは、
オブジェクトを目的地に向かって動かす、
という仕組みが採用されてます。
なので敵が移動する際、目的地にあたる位置情報
が必要なのです。
で、このコードでオブジェクトを取得することで、
位置情報を取得できます。
で上記コードでは、
プレイヤーのオブジェクトを取得することで
プレイヤーの位置情報を取得し、
プレイヤー(目的地)に向かって敵が移動してくるというわけです。
③コンポーネントの取得ですが、
スクリプトでnavMeshAgentを制御するには、
スクリプト内で、
agent = GetComponent<NavMeshAgent> ();
とかいて、コンポーネントを取得する必要があります。
取得しないと動かないので書いときましょう。
④void Update () {
agent.destination = goal.transform.position; //④ここで目的地を設定
}
}
これですが、上記のコードを書くことで、
実際に敵が移動してくれます。
変数名.destination = というのは、
「目的地は、」という意味で、
その目的地に当たるのが、
goal.transform.position;
になるわけです。
でこのgoal.transform.positionとは、
今回のコードで言えばプレイヤーオブジェクトの
位置情報です。
(用語に馴染みがないとわかりづらいのですが、
transform.positionとは位置情報のことです。)
(なのでgoal.transform.positionとは、
goalという変数に格納したゲームオブジェクトの
位置情報という意味です。)
ということでこのコードを書くことで、
プレイヤーに向かって敵が移動してくるという
わけです。
ということで、上記を書いて、
保存したら実行してみましょう。
でこれで敵オブジェクトが移動したら
成功です。
まとめ
ということで長かったと思いますが、
unityで敵を移動させたいならnavMeshAgentを
使うといいです。
コライダーで動かすこともできますが、
攻撃判定がややこしくなったりするので、
navMeshAgentでやった方がいいです。
ということで早速本記事の内容を実践して、
敵を動かしてみてください。
また、今回は単純に敵がプレイヤーに
向かって移動してくるという方法を記事にしましたが、
これだけだとゲーム的に味気ないので、
プレイヤーが敵にある程度近づいたら、
移動してくるというような機能を作る方法も書きました。
それが以下の記事です。
ということで本記事の内容をクリアして、
そこから応用としてプレイヤーが敵に近づくと、
追いかけてくる。
をやりたいなら上記記事を読んでください。
ということで読んでもらってありがとうございました。
チャーさん