3Dアクションゲームの作り方14 敵の自動生成・ボスの作成・ステージコントロール

Unity 3Dアクションゲームの作り方 ゼルダ・原神・モンハン風 (スマホ化対応)


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

今回は3Dアクションゲームの作り方講座の第14回です。いよいよ完成まで近くなってきましたね。

前回は敵の遠距離攻撃を作成し、継承の使い方を学びました。

前回の記事:

3Dアクションゲームの作り方13 敵の行動の種類を増やす オブジェクト指向の継承を使いこなそう
今回は3Dアクションゲームの作り方講座の第13回です。前回はNavMeshシステムを活用して敵AIの移動処理を作成しました。 前回の記事: 第13回目では敵の行動の種類を増やし、遠距離攻撃できるようにしていきます。 ま...

第14回目は敵を自動出現させる機能、ボス戦を作り、ゲームステージを構築していきます。


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

ゲームステージの構想

まずはどういったステージにするのかを考えていきましょう。

今回は1ステージしかなく短いのでザコ敵が一定時間ごとに自動生成するようにして、一定数倒したらボスが出現。そのボスを倒すとゲームクリアとなるようにします。

ゲームとしてはやや単調で短いですが、こんなステージを複数個配置し、次々とクリアするようにしていくと立派な3Dスマホアクションゲームとしてリリースすることも可能です。

敵の自動生成処理の作り方

敵の出現機能を作る

まずは現在ただ置いてある敵をゲーム中に出現させるようにしましょう。

まず敵の死亡時処理を少し修正します。現在死亡時にはゲームオブジェクトを非アクティブにしていますが、これを破壊してしまいましょう。

一応再生して、敵を倒したらHierarchyから敵がなくなるか確認しておきましょう。

そして敵プレハブですが、もしここまでの設定をシーン上に配置されているオブジェクトに行っていた場合はプレハブではなくシーン上のオブジェクトのみにその設定が適用されプレハブには適用されていませんのでそれをプレハブに適用します。

どの様に確認をするかというと、シーン上の敵オブジェクトを選択しInspectorを見ましょう。下記画像のように、値の左側に青い線が入っている場合それはプレハブではなく配置されているオブジェクト独自に変更されています。

その場合はその値を右クリックして「Apply to Prefab ‘(プレハブ名)’」をクリックしましょう。するとシーン上の値がプレハブに適用されます。(Tagなども同様ですので忘れずに「Apply」しましょう。)

逆にシーン上のオブジェクトの値をプレハブの値に戻したい場合は「Revert」をクリックするとプレハブの値がシーン上のオブジェクトに適用されます。

二度手間感がありますが、次に再度「EnemyBase」を変更します。

まず「DestroyEvent」という「EnemyMoveEvent」を作成します。(移動時にも使用しているイベントなのでMoveイベントですがそのまま使います。気になる方はクラス名を変更しましょう。)

そして先程「Destory」した「Anim_DieEnd」の破壊処理を削除して、「DestroyEvent?.Invoke( this );」でイベントを実行します。この段階では死亡しても破棄も非アクティブもされなくなっていますのでご注意ください。

では次に「GameController」を編集していきます。追記と変更が必要になります。

まずは追記部分のみです。

変数に「enemyPrefabList」と「enemyGateList」を「SerializeField」属性で作成します。それぞれ生成する敵のプレハブ、敵の出現位置を後ほどInspectorから設定します。

「fieldEnemys」は生成した敵を保管しておくためのListです。

「Start」関数内には後述の「CreateEnemy」を2回、これは適当に暫定的に実行しておきます。

敵の生成処理です。「Random.Range」はランダムな値を取得する関数です。「num」「posNum」にそれぞれプレハブ、出現位置のリストの要素数を上限に値を取得し、そのインデックスの値のプレハブ、位置を保管します。

ランダムに決めた値から「Instantiate( prefab, pos.position, Quaternion.identity );」で敵オブジェクトを生成します。

その後、生成したオブジェクトから「EnemyBase」を取得し「ArrivalEvent」と「DestroyEvent」にそれぞれ、「EnemyMove」と「EnemyDestroy」(後述)を登録します。

最後に敵破壊時のイベントに登録する関数です。

「if( fieldEnemys.Contains( enemy ) == true )」というのは「fieldEnemys」に「enemy」が存在したら、という条件です。

存在する場合は「fieldEnemys.Remove( enemy );」でリストから「enemy」を削除します。

その後「Destroy( enemy.gameObject );」で敵を破棄します。

では、Unityに戻って出現位置を作成していきます。作成はほぼ移動位置と同じですので適当に5つほど「CreateEmpty」をして配置していきます。Yの値だけ低すぎず高すぎずにしておきましょう。(低いと埋まります、高いのは落ちてくるので多少はOKです)

「GameController」の「EnemyPrefabList」に「Slime Variant」「TurtleShell Variant」Projectフォルダからドラック&ドロップします。そして作成した、出現位置を「EnemyGateList」にHierarchyからドラック&ドロップします。

では一旦再生して確かめてみましょう。敵が2体生成され、攻撃し倒すとHierarchyからも消えていることを確認しましょう。

これで敵を生成する処理が完成しました。

ここで一旦「GameController」のいらない処理を削除していきます。もちろんそれによって処理がおかしくならない様に修正していきます。

削除する部分をコメントアウトして追加部分を記載、変更しない部分は省略しています。コメントアウト部分は確認後削除しましょう。

「enemys」はあらかじめ配置されているフィールド上の敵のリストなので削除し、それを使用していた処理も同時に削除します。「OnGameOver」ではそのまま「fieldEnemys」に置き換えます。

「OnRetryButtonClicked」では、敵をリトライ処理するのではなくフィールド上の敵を一旦削除して「fieldEnemys」リストをクリアするようにします。

また「Init」という関数を追加(中身はまだなし)します。

敵を自動生成させる

次に暫定的に「Start」で作成していた処理を消したので、自動で生成されるようにしていきます。まずどの様な決まりのもとに生成するかを考えていきます。

無限に増え続けてもおかしいので、一定時間毎に生成してここでは10体まで増えたらそこで一旦止める形にしましょう。

今何体かというのは「GameController」の「fieldEnemys」の要素数を見ればわかるのでそれを元に作成していきます。

また敵を10倒したら生成を中断しボスを出現させます。では「GameController」を編集しましょう。

続きを読む

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

次回の記事:

3Dアクションゲームの作り方15 タイマー処理とアイテム取得処理の実装
今回は3Dアクションゲームの作り方講座の第15回目です。前回は敵の出現処理、ボス戦等ゲームステージの一連の処理を作成しました。 前回の記事: 第15回目は時間の計測、アイテムの取得の処理を作成しゲーム性を追加していきましょう...


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


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

コメント

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