Unityでゲーム作ってるんだけどさ~、敵ってどうするとプレイヤーを追いかけてくるようになるの?
初心者だけどこれまでで キャラクター操作を設定できるようになった!
となったら次はそのキャラクター(プレーヤー)が戦う敵ですね!
敵が出てくるとさらにアクションゲームがおもしろくなるでしょう。
その敵がキャラクターに向かって追いかけてくるようにするにはいくつか方法がありますが今回はNavMeshAgent(ナビメッシュエージェント)を使ってみます。
ゲームにおけるAIの一種ですね。
これを使うと敵が障害物を避けながらプレイヤーを追いかけてくる、みたいなことができます。
スクリプトも少し書きますがUnityの機能で大体の部分はできてしまいますので「AI」と聞いて身構えてしまう必要も全くございません。
上級者になるといろいろと複雑な設定ができる機能ですが、この記事では「敵がプレイヤーを追いかけて攻撃してくる」という極めてシンプルなアクションをさせてみたいと思います。
最後まで読んでいただければUnityでゲーム内に登場する敵の動きを制御できるようになります!
大量に並べて無双もできる!
UnityのNavMeshAgentとは
NavMeshAgentを設定すると、敵キャラクターなどが障害物を回避しながら目的地や目標物に自動で向かっていくようになります。
目的地や目標物に向かっていくオブジェクト、キャラクターをエージェントとし、追いかけるほうをターゲットと言ったりします。
プレーヤーキャラなどの追いかけられるほうがターゲットですね。
ここではキャラクターを追跡させるために使います。
Unityを開いた状態でメニューのWindow➡AI➡Navigationと選択してNavigationウィンドウを表示させると使えるようになります。
Unity NavMeshAgentを使う前に設定確認
NavMeshAgentを使う前に以下の点を確認しておきましょう。
②使用するアセット
①Unityのバージョン、バックエンドの設定
Unityは以下のバージョンを使っています。
またInput Manager, Input System Package の新旧両方をのシステムを使うのでActive Input Handling をBoth にしてあります。
・Unity Version 2021.1.16
・Active Input Handling ➡Both
Active Input HandlingはメニューバーのEdit➡Project Settingから設定できます。
②使用するアセット
今回使うキャラクターアセットは上の画像の二種類になります。(どちらも無料)
名前をクリックするとUnity Asset Store に移動できます。
どちらも3Dモデルに加え歩く、走る、攻撃、被ダメージなど使いたいアニメーションがそろっていたのでこれらを選びました。
もちろん他に使いたいキャラクターモデルがあればそれを使っても大丈夫です。
Unity NavMeshAgent:下準備
それでは敵キャラクターを動かす設定をする前にUnity内での下準備をしましょう。
以下の設定をします。
①NavMeshAgentの表示
②敵の配置
③地面のStatic設定とベイク
④オブジェクトの配置とStatic設定&ベイク
順番にやっていきましょう。
①NavMeshAgentの表示
NavMeshAgentを使えるようにしましょう。
メニューのWindow ➡ AI ➡ Navigation と選択します。
すると Navigation というタブが表示されます。(だいたいInspectorのとなりに出ます)
これでNavMeshAgentが使えるようになります。
②敵の配置
地面になるものを設置したらその上に敵となるキャラクターを配置します。
(地面のオブジェクトはいきなりTerrainなど使ってもいいですが今回は練習の意味もあるのでPlaneなどシンプルなオブジェクトで問題ないです)
そのとき Add Component で Rigidbody を追加し、その中のUseGravity のチェックを外しておきます。
今回は重力の設定は使わない方法で行います。
③地面のStatic設定とベイク
地面となるオブジェクトにその上を移動できるようにベイク処理をします。
この設定をするとAIがここは歩いていい場所なんだと認識し、そこをキャラクターなどのオブジェクトが通れるようになります。
Navigationタブ内のObjectを選択します。
Navigation Staticにチェックを入れた状態で、Navigation Areaを Walkable にします。
walkable、歩けるという意味そのままですね。
次にBaleの項目に移り、下のボタンのBakeを押します。
(通行できる地面の傾斜など細かく設定できるのですが今回はひとまず敵を動かす方法の紹介がメインなのでそれらの機能の話は省略します。)
これで敵に設定するAIがPlaneを移動可能なゲームのステージと認識できるようになりました。
④オブジェクトの配置とStatic設定&ベイク
続いて障害物となるオブジェクトの設定です。
障害物にできるのであればCubeでもなんでもいいです。(笑)
この画像ではUnityAssetStoreで見つけた Rock and Boulders 2 という岩のアセットを使っています。(無料)
障害物は Navigation Static にチェックを入れておくのは同じですが、NavigationAreaの項目でNot Walkable にしておきましょう。
単語の意味の通り設定されたオブジェクトのある位置は通らなくなります。
そのあとのベイクは同じようにBakeの項目からBakeのボタンを押すだけです。
ここまでで敵が移動できるマップの用意ができました。
・障害物を追加する場合は シーンビューに配置して、同様の手順でベイクまで行えば追加設定できます。
・Clearのボタンを押せばベイクした設定を解除できます。
・Navigation Area の項目でjumpにすると、敵などのオブジェクトが谷間のようになっている場所を飛び越えるようにできます。
Unity NavMeshAgentで敵を動かす
それではキャラクターが移動できるステージが作れたので、いよいよ今回のメインテーマ「敵AIを動かす」設定を解説します。
とりあえずシンプルなスクリプトとアニメーションで、前回の記事で設定したしたプレーヤーキャラクターを敵が追いかけるようにしてみましょう。
前回のプレーヤーキャラの記事はこちらです。
Unityでキャラクターを歩いて移動させたいんだけど、どうすればいいっすかね? この記事はUnity初心者でゲーム開発をしたいと思っていて、3D空間でキャラクターを動かせるようになりたい人のために書きました。 U[…]
このスクリプトとアニメーションで設定すると以下の動画のように敵がプレーヤーを追いかけます。
開始と同時に敵のSkeletonが剣を振り回しながらプレーヤーを追跡しはじめます。
障害物として岩を設定したので回り込むように移動してまいす。
プレーヤーを追跡することができるようになるんだということを説明したいがためにとりあえず書いたシンプルなスクリプトを使用しています。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class SkeltonTest003 : MonoBehaviour { private Animator animator; //アニメーターを使う private NavMeshAgent agent; //NavMeshAgentを使う public Transform target; //ターゲットに設定できるようにする private Rigidbody rb; // Start is called before the first frame update void Start() { animator = GetComponent(Animator); //アニメーターを情報取得 agent = GetComponent(NavMeshAgent); //NavMeshAgentを情報取得 agent.destination = target.position; //敵(agent)がプレーヤー(target)に向かう rb = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { agent.destination = target.position; //プレーヤのほうに向かっていく } }
スクリプトの中に書いた通りですがGetComponent<NavMeshAgent>(); でNavMeshAgentが使えるようになります。
そしてアニメーターコントローラーも攻撃アニメーションが入っているだけのシンプルなものです。
Inspectorでターゲットを指定できるようになっています。
ここではPlayerをターゲットとして指定しています。
アニメーターコントローラーの基本の使い方はこちらの記事をご覧ください
Unityで3Dゲームを作ろう!と思ったときにどうすればいいのだろう? Unityでキャラクターを動かすときに、アニメーターコントローラー(Animator Controller) というものが[…]
かなり雑にでしたが「とりあえず手っとり早くこういう感じにすれば基本、敵が追跡してくるようになる」ということを把握してもらいたいと思いこのように解説しました(笑)。
ここまでで とりあえずプレーヤーを追跡するようにできるんだと実感が持てれば、あとはどのように追跡させるかということになります。
もうすこし設定を加えてみましょう。
UnityのNavMeshAgent とスクリプトでアニメーションを設定する
これまで作成した敵のアニメーションは攻撃のアニメーションしか設定していませんでした。
当然結果は剣を振り回す以外のことはしていませんでしたね。
さらにゲーム開始と同時にプレーヤーのほうに向かってくるのでアクションRPGのようにしたい場合は不都合ですよね。
複数敵を配置する場合、これでは開始と同時に一斉にマップ中の全的が襲いかかってくることになるかもしれません。
特定のエリアに到達したら敵が向かってくるようにしたいと思います。
スクリプトとアニメーターコントローラーを調整して敵に一定距離近づいたら敵が攻撃を始めるようにしてみました。
動画の中で最初のうちプレーヤーがじりじりと近づいていき、接近したところで敵が振り返り剣を振り始めます。
その後プレーヤーが敵の攻撃圏外に出ると剣を振るのをやめますが追跡のため走るアニメーションに切り替わります。
そしてさらにプレーヤーが走り敵から距離を離すと追跡をやめます。
まだ攻撃中にスライド移動してしまうなど調整が必要な個所はありますがそれは今後調整を加えていこうと思います。
敵の移動速度などはInspectorにあるパラメータで調整できるのでプレーヤーキャラが逃げ切れるぎりぎりの値を入れてみたりしてみましょう。
ひとまずこれで敵キャラクターはある程度動かせるようになりました。
AIなどで敵の行動パターンを制御できると敵からうまく逃げて反撃する、気づかれないように移動して目的地まで移動する、などのゲーム性も与えられるでしょう。
UnityのNavMeshAgentによる演出のアイデア
AIをうまく使えるようになると皆さん大好きなゲームがいろいろと設定できるでしょう。
ここでAIを応用したゲームの話を少しだけしてみましょう。
あなたが今までやってきたゲームの中にもAIを使ったものはたくさんあると思います。
いくつか思い出してみると、「あのゲームはこうやって作ったんじゃないか?」というのがわかってまた別の面白さがあることでしょう。
そういう経験がのちのちあなたがゲーム開発をするときにアイデアの種になるかもしれません。
敵を大量に配置して無双
単純に大量に配置すれば無双系、Hack&Slash系のゲームになりますね。
多人数の敵にキャラクター1人または少数で突撃して倒しまくり、キャラクターもまた強くなるゲームは中毒性があるほど楽しいものです。
注意点はこういうゲームの場合、大量に敵やステージのオブジェクトが表示されると処理が重くなり再生が鈍くなったりします。
マップ内でカメラから見て遠くにあるものは描画しない、見下ろしカメラにして画面外の物は描画処理しない、などの方法でマシンの負荷を減らす必要が出てくるでしょう。
データの扱いや操作性まで考えていくと快適なゲームが作れることでしょう。
ユーザーへの配慮があなたのゲームをより魅力的なものに仕上げてくれます。
動物と一緒に移動する
追跡してくる、という機能の応用でちょっとしたお話が作れそうですね。
RPGなどでは助けた犬を特定の場所まで連れていくとストーリでキーとなるアイテムを地面から掘り出してくれたりする、なんていう話があると思います。
または一定の距離がひらくと追ってこなくなるという設定を利用し、負傷した仲間を敵の攻撃から守りつつHP回復ポイントまではぐれないように連れていくなど。
ストーリー性がゲームの世界観をより熱いものにしていくでしょう。
仲間とともに戦う
こちらもオープンワールドのRPGなどでおなじみですね。
プレーヤーのHPが少なくなったら味方が回復魔法をかけてくれたり、敵に囲まれてピンチになると助けに来てくれたり。
作業的には複雑化してやることも増えますが、うまく行動パターンを設定すれば敵と戦っているときの状況に合わせて仲間のキャラクターが行動してくれるようになります。
キャラクターの性格を作りこみ、それに合わせた行動パターンを設定すると「本当にこういう人がいそうだな」と思わせることすらできます。
ユーザーのストーリーへの没入感もより深まることでしょう。
シナリオが作れる人がいるといいですね。
UnityのNavMeshAgentでアクションゲームをおもしろくしよう!
今回はNavMeshAgentで敵のAiを作る方法を解説してみました。
①NavMeshAgentで地形や障害物をベイク処理する
②エージェント(敵キャラクター)に追跡の条件を与える
このような流れで設定できましたね。
今回は1つのスクリプトでできるごく簡単な方法でした。
記事一つでは書ききれませんがNavMeshAgentにもまだ使っていない機能はあります。
他にもアニメーションコントローラーと組み合わせたりするなどの方法もあります。
これもアイデア次第でゲームがどんどんおもしろくなりそうですね。
興味のある方はぜひいろいろな方法を工夫してみてください
(この記事で使用したキャラクターなどの画像はUnity Asset StoreでダウンロードしたものをUnityシーンビューに配置して作成しました。)