FPSゲームの作り方10 Unityで指定したスポーン位置に敵を自動生成する

Unity FPSゲームの作り方


Unity入門の森オリジナル本格ゲーム制作講座はこちら
8種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

本講座では、UnityとC#を用いて3DFPSゲームを作成しています。今回は第10回です。

前回までで敵の攻撃処理を作成しました。アニメーション・当たり判定・遠距離攻撃も作成したので、敵の一連の行動AIはできあがりです。

前回の記事:

FPSゲームの作り方9 Unityで敵が自動で攻撃する人工知能を完成させる
この記事はFPSゲームの作り方講座の第9回目です。 前回はCinemachineによる移動と敵の攻撃準備のための移動処理AIを作成しました。 前回の記事: 今回は敵が自動で動いて攻撃してくる人工知能の開発を完成させていきましょう。...

次にこの敵を指定した位置に自動で配置できるようにしていきます。

FPSゲームでは倒すべき敵を指定した位置にスポーン・リスポーンする機能が必須です。今回は一人プレイのFPSゲームですが、マルチプレイに対応する際にも役立つ知識になります。

では始めます。


【Line登録者限定のプレゼントもあるよ!】

Unityで敵を指定した位置に自動生成・スポーンさせるための準備

まずは、新しくゲーム全体の管理のための「AppGameContorller」というスクリプトを「Assets/AppMain/Script」に作成します。

敵の生成を制御するC#スクリプトの作成

先に変数を準備しておきます。

「enemySpawnPoints」という「List<Transform>」を作成します。これは現在「EnemyCrocodile」にあるリストをこちらに持ってきます。その修正はまた後ほど行います。

次の「enemyPrefab」「skyEnemyPrefab」は生成する敵プレハブです。これはここまでに生成した敵をプレハブ化していきます。「enemyCount」はフィールド上に生成する敵の総数です。

ここまで全て「SerializeField」にしておきましょう。

また「currentFieldEnemies」と「isEnemyRespawn」を「private(省略)」で用意します。これらは後ほど使用します。

プレハブ、出現(移動)位置の作成

Inspectorで変数に必要なものを設定していきます。

最初にHierarchyに空オブジェクトを作成し、「AppGameManager」という名前にしておきます。そして作成したスクリプト「AppGameManager」をアタッチしておきましょう。(位置角度はなんでも構いませんが、Position、Rotationは全て0、Scaleは全て1にしておくといいでしょう)

では、現在Hierarcyにある「Enemy1」と「EnemyBat」を、Projectウインドウの「Assets/AppMain/Prefab」にドラック&ドロップしてプレハブ化します。

できたらHierarchyのゲームオブジェクトは消しておきましょう。

次に以前作成した「EnemyMovePoints」の子にある「Goal1」(名前は違っても敵の移動目的地になっているもの)を複製してまずは16個くらいにします(何個でもOKです)。

その16個をどこでも構いませんが、今回は下記画像の一周している道の周辺あたりに配置します。

その時位置によって高さが違いますので、各ゴールは地面の近くに来るように調整しておきます。(下記画像の白い棒は解説用の目印なのでなくて構いません)

Inspector設定

これらを「AppGameManager」に設定します。

変数「EnemyPrefab」に「Enemy1」のプレハブを、変数「skyEnemyPrefab」に「EnemyBat」のプレハブを、「EnemySpawnPoints」には「EnemyMovePoints」以下の「Goal」を面倒ですが一つずつ設定します。

 

EnemyBaseの調整

敵処理の修正をしていきます。

まずは「EnemyBase」。

最初に変数にある「maxHp」の「SerializeField」を消します。これはスクリプトから生成するため、その時に設定するように変更するためです。そして新しく「gameController」、「attack」を作成します。

次に「Start()」関数にある「Init()」関数の実行を削除します。

続いて「Init()」関数の引数に「AppGameController appGameController」、「int maxHp」、「float attack」を追加します。

処理では「gameController = appGameController」を追加し「AppGameController」を取得しておき、「this.maxHp(変数のmaxHp)」に「maxHp(引数)」を「this.attack(変数)」に「attack(引数)」を保管しておきます。

このように生成時の初期化で「HP」と「攻撃力」を設定できるようにして、強さに変化を持たせることができるようにしておきます。

引数と変数に同じ名前がある場合は「this」をつけることで、thisつまり今回では「EnemyBase」の変数である方、と区別ができます。

また「OnDead()」関数には「gameController.OnDeadEnemy( this )」を追加しますが、この関数は少し先に作成するのでこの段階ではエラーになりますのでご注意ください。

煩わしい方は一旦コメントアウトして後で戻してください。忘れそうな方はエラーのままにしておけばUnityに戻った時にエラーログがでて思い出せます。

 

AttackSphereの調整

「AttackSphere」を調整します。 

こちらは簡単です。変数の「attack」の「SerializeField」をなくします。

そして「Init()」関数の引数に「float attack」を追加し、処理にも先ほどと同じように「this.attack = attack」で保管しておきます。

EnemyCrocodileの調整

次に「EnemyCrocodile」の変更をします。  

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.stores.jp/)で講座閲覧権を取得してね。

スポーン・リスポーン機能の最終確認とまとめ

では最後に確認です。

まずは敵が20体生成されます。その後敵を倒すと足りない分だけ生成され、また20体に戻ることを確認してみてください。

敵が早く生成され過ぎるように感じるかもしれないので、その場合はyield return new WaitForSeconds(1f); の部分を遅らせるとよいでしょう。

また、int num = Random.Range(0, 2);のあたりで敵の種類を2と定義していますが、マジックナンバーになってしまうので今後このゲームを改造していく際は「フィールドで生成される敵の種類の最大値」を別途変数などに格納しておき、その値を用いる方が良いですね。

練習と思ってリファクタリングしてみるのも良いと思います。

ひとまずこれで敵が無限に湧き続けるスポーン・リスポーン処理が完成しました。

今はワニの敵は「HP3攻撃1」、コウモリは「HP1攻撃1」で固定して生成していますが、例えば敵を倒した数を測定しだんだん強くなるような設定も、この引数で値を設定してやることでできるようになります。

今回はここまでにしましょう。

次回はゲームルールや、UIなど詳細が必要になってきますのでその辺りを作成していきましょう。

次回の記事 : 

FPSゲームの作り方11 ゲーム進行管理の実装・HPステータスバーや被弾エフェクトの作成
この記事はFPSゲームの作り方講座の第11回目です。 前回は敵の自動生成機能を開発し、クリアするまで敵が出現し続けるようにしました。 前回の記事: 今はただ敵を倒しているだけなので、ゲーム性を出せるようにゲームクリア・クリア時...


Unity入門の森オリジナル本格ゲーム制作講座はこちら
8種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

タイトルとURLをコピーしました