前回(第5回)では、経路に沿って実際に敵オブジェクトが移動する仕組みなどを作りました。
前回の記事↓
【敵の移動処理の作成2】目的地の設定とベクトルを用いた経路設計
前回(第4回)では、敵の経路を作成しました。 前回の記事↓ 第5回である今回は、その経路に沿って実際に敵オブジェクトが移動する仕組みなどを作っていきます。 どんどんタワーディフェンスらしくなってきますね。 敵(Enemy)スクリプトの修正 ...
今回は敵オブジェクトの作成を制御する仕組みを作っていきます。
Waveの概念も入ってきてあなたのレベルデザインの見せ所になります。では、作っていきましょう。
タワーディフェンスゲームでは一連の敵が出てくる流れ1セットをウェーブと呼びます。そして、決められた回数のウェーブを全て耐え、HPが0にならなければ勝ちです。
EnemyManagerの作成
敵オブジェクトを複数出現(生成)させていくにあたり、その生成タイミング等を管理するオブジェクト(EnemyManager)を作ります。
Hierarchyビューに、新規オブジェクト(CTRL+SHIFT+N)を作成し、新規ScriptもAddComponentします。
- 名前:EnemyManager
- スクリプト名:EnemyManager
では、EnemyManagerスクリプトを作成していきます。 このEnemyManagerに必要な要件としては
- 今が第何waveか管理 (
wave
) - waveがスタートしてからの経過時間を管理 (
time
) - 生成する敵(Enemy)が指定できる
- 生成する時間(Time)が指定できる
- Enemyが通る経路(Route)が指定できる
この辺りになります。
この、Time,Enemy,Route をワンセットで管理するEnemyPatternクラスと、1ウェーブは複数の敵の出現パターンで構成されるので、EnemyPatternをListで管理するWaveクラスをEnemyManagerクラスの外に書いておきます。
おさらいと次回予告
今回は敵を管理するEnemyManagerを作成し、Inspectorで敵の出現パターンを指定してウェーブが作れるようになりました。
次回は、この敵を倒す弓矢を作っていきます。
次回の記事↓
敵当たり判定とコルーチンを用いた弓矢の生成&射出処理の作成
前回(第6回)では、ウェーブを作って、敵オブジェクトの出現パターンを制御する仕組みを用意しました。 前回の記事↓ 見た目だけは大分ゲームらしくなってきましたが、まだ敵を倒すことが出来ません。 今回は敵の当たり判定(Collider2D)の作...
コメント
いつも楽しく進めさせて頂いております
毎回、目から鱗が落ちる思いで体験させてもらっています
ところで、今回の「敵の生成処理の作り方 ウェーブの作成とレベルデザインまで」ですが
「Waveの作成」項目のEnemyManagerの要素0のEnemy欄に、Prefabsの敵を入れる箇所がブログの通りになりませんでした
試行錯誤したところ、以前のブログ「敵オブジェクトの作成・パラメータ設定・敵処理のプロトタイプの作成」
のPrefabsを作る際に、子オブジェクトである「sprite」を入れると上手くEnemy欄に収まりました
Unity初学者なので見当違いことを言っているかもしれませんが
もしかしたら記載間違いかもしれないので、念のためご報告いたします
コメントありがとうございます。
Unity入門の森のゲームの作り方講座を楽しんでいただけてるようでうれしいです^^
さて、プレハブですが、そもそもEnemyオブジェクト制作の過程でspriteは子オブジェクトになっています。
ヒエラルキーでspriteを子オブジェクトとしたEnemyをプレハブにしているので。
講座をそのまま進めていただければちゃんとEnemy欄に収まるはず。
お気づきになられたこと教えていただきありがとうございます。
>管理人さん
私もいつもこのサイトで勉強をさせていただいております。
とてもわかりやすく感謝しております。
>banananさん
私もUnity初学者で同様の問題となりEnemy欄にPrefabsを設定することができませんでした。いろいろと試した結果原因が解明できたため共有いたします。
「敵オブジェクトの作成・パラメータ設定・敵処理のプロトタイプの作成」の記事にて、Enemyを作成した際にEnemyスクリプトを親オブジェクトではなく子オブジェクトのSprite側に設定しているため、設定することができませんでした。
(spriteをPrefabs化した際に設定できたのはこのためと思われます。)
記事を読み返すとEnemyスクリプトが親オブジェクトに設定されておりましたので、作成した際の誤りだと思われます。
私も見当違いなことでしたらすみません。
では。
>askrさん
コメントありがとうございます!
お役に立てているようで幸いです^^
EnemyオブジェクトにEnemyスクリプトが割り当てるところを間違えるとその状態に至るとのことですね。
作成時にありがちな誤りとして追記しておきます。
情報提供ありがとうございました!
最後まで作成することが出来ました!
とても有意義な講座をありがとうございます。
質問なのですが、ここからさらにアレンジを加えて弓矢以外にも銃などの味方ユニットを実装して選んで使えるようにしてみたいのですがそれは可能でしょうか?
最後まで読んでいただきありがとうございました!
アレンジを加えていろんなユニットを実装することはもちろん作れば可能です!
今回は初心者向けなので拡張性を意識して抽象化はそこまで行われていませんが、
新しい機能を持ったユニットを作る場合は共有する機能だけ抽象クラスを作成して継承していくとスマートかと思います。
https://feynman.co.jp/unityforest/unity-introduction/unity-csharp-programming/inheritence-abstractmethod-override/
この記事なども参考になると思います。
ありがとうございます!!
とても読みやすく勉強になっております。
あるところで手が止まったのですが解決法が見つかったので共有です。
「Waveの作成」にて「Size を 1 に変更します。」の部分ですが、手持ちのUnity新バージョン2022.3.4f1ですとSizeという項目が無いので2時間ほどググって探していました。
結局どこにあったかというと、Wavesの右側の空欄に数字を入れることで解決しました。
Sizeという表示自体が無くてスリムなUIになっただけでしたw
同じようにPatternsもSize表記は無くなって見やすくなってますね。
バージョンが違うとそれだけで引っかかる事がありますが、この記事に来るまでほぼ検索することが無かったので今も通用する記事の精度はすごいです。
完成までお世話になります。
コメントありがとうございます。
バージョン変化によりUIの見た目や機能に若干の差が出てることもありますが、
仰る通り基本的には同機能が提供されているかと思います。
もしどうしてもわからなくなった場合は一度対応バージョンのUnityエディタをUnity hubから入れて切り替えてみるなども有効です。
講座記事も気に入っていただけて嬉しいです。
読んでいただきありがとうございます。