【Unity】3DダンジョンRPGの作り方 第9回|エネミーAI・オートバトルシステムの実装 | Unity入門の森 ゲームの作り方

【Unity】3DダンジョンRPGの作り方 第9回|エネミーAI・オートバトルシステムの実装

Unity 3DダンジョンRPGの作り方 ~世界樹・ウィザードリィ風ゲームを作ろう~

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

この講座は3Dダンジョン探索型RPGの作り方について説明しています。今回はその第9回目になります。

前回は戦闘のステート管理などを実装し、アクターの通常攻撃スキルを使用できるところまでを実装しました。

前回の記事:

【Unity】3DダンジョンRPGの作り方 第8回|バトルコマンドと攻撃システムの実装
この講座は3Dダンジョン探索型RPGの作り方について説明しています。今回はその第8回目になります。前回はカウントタイムシステムを実装し、速度から行動値を計算してキャラクターにターンをまわす処理まで実装しました。前回の記事:今回はバトルに用い...

今回はエネミーもスキルを発動してくるようにしてお互いに攻撃を行えるようにします。エネミーのターンも終了するようになるので「行動開始→スキル発動→ターン終了→次のキャラクターのターンへ」という戦闘のゲームループが完成します。

ほか、未実装となっている戦闘システムまわりの処理(複数ターゲット選択など)やオートバトルシステムも実装していきます。これらが完了すれば戦闘システムの開発は一区切りとなります。

【ゲームの作り方講座プレゼント中!】

ターン制複数バトルにおけるエネミーターン処理を実装する

エネミーにターンが周ってきた場合の処理を実装していきます。

アクターのターンと違うところは「コマンドや対象選択などをプレイヤーは行わない」「どのスキルを使用するかはEnemyData(のuseSkills)で指定されたものの中からランダムに決める」という点です。

BattleManager.cs (一部省略)

ActorUIがクリックされた時に呼び出される処理を、EnemyUIの時と同様に作成しておきます。

エネミーの通常攻撃スキルの対象設定はTargetType.Actor_Hate(ヘイト値基準で味方1体をランダムに選択)となっているのでこの場合の対象自動選択機能を実装しています。

 

このゲームにおけるヘイト計算は単純に「前衛は後衛より3倍ターゲットになりやすい」というものになっています。

条件式を追加すれば「最もHPの低いアクターを優先的に狙う」のようにすることも可能です。

 

この状態でテストプレイすれば、エネミーにターンが周ってきたときにそのエネミーが行動し、一撃でアクターを倒すのを確認できます。

ダメージポップアップ・総合ダメージ表示をUnityで実装

いまはダメージ量はConsoleのログにしか表示されないため、分かりやすくするようにダメージ発生時には画面上にポップアップ出現するように演出を追加します。また、1度の攻撃で複数体・複数回数ダメージを与えた時のために総合ダメージ量も別で表示するようにします。

Canvas UIの子オブジェクトにダメージ表示UIを構築する

まずはダメージを表示するための場所をcanvas UIの子オブジェクトに作っていきます。

(GameObject)ダメージポップアップの親オブジェクト_DamagePopups

ダメージポップアップのUIオブジェクトを出現させるときの親にする空オブジェクトとしてDamagePopupsを作成します。Inspectorからの設定は不要です。

(TextMeshPro – DamagePopups)ダメージポップアップUI_DamagePopup

DamagePopups以下にTextMeshProオブジェクトとしてDamagePopupを作成します。ダメージの数量を表示するオブジェクトになります。

  • RectTransform:(Width, Height) = (100, 100)に
  • TextMeshPro – Text:空欄もしくは任意の数字(確認用)
  • TextMeshPro – Font Asset:Assets/Fonts/MPLUS1p-Regular SDF
  • TextMeshPro – Material Preset:BlackShadow
  • TextMeshPro – Font Size:58
  • TextMeshPro – Spacing Options:Lineを-50
  • TextMeshPro – Alignment:中央揃え
  • TextMeshPro – Text Wrapping Mode:No Wrap

Text Wrapping ModeをNoWarpにすることで、長い文章などを表示させても自動的に改行されなくなります。

このオブジェクトは作成できたらプレハブ化し、シーン上からは削除しておきます。

(TextMeshPro)総合ダメージ量UI_TotalDamageText

1攻撃あたりの総合ダメージ量を表示するTextMeshProオブジェクト、TotalDamageTextをCanvasの子オブジェクトとして作成します。

  • RectTransform:Positionは(-320, 169)、サイズは(160, 60)
  • TextMeshPro – Text:空欄もしくは任意の文章(確認用)
  • TextMeshPro – Font Asset:Assets/Fonts/NotoSans_BlackShadow
  • TextMeshPro – Font Size:38
  • TextMeshPro – Spacing Options:Lineを-30
  • TextMeshPro – Text Wrapping Mode:No Wrap

後述しますが、TextMeshProのRichText機能を使うことで1つのTextMeshProオブジェクト内でも「文章の特定の範囲内だけサイズや色を変更する」ということが可能です。後ほどC#スクリプトからこの性質をダメージ表示処理に活用します。

ダメージポップアップ・総合ダメージ量表示スクリプト

まずはダメージポップアップの表示を制御するスクリプトとしてDamagePopupSpawnerクラスを作成します。

DamagePopupSpawner.cs (新規)

続きを読む

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

まとめ

今回はエネミーの行動や複数ターゲット設定、状態異常の処理やオートバトル設定など、戦闘に関する様々なシステムの実装を進めました。

次の章からは一度戦闘システムからは離れて、アクターの編成や強化などを行えるタウン画面の実装に移っていきます。

次の記事:

【Unity】3DダンジョンRPGの作り方 第10回|キャラクター作成・パーティ編成UIの構築
この講座は3Dダンジョン探索型RPGの作り方について説明しています。今回はその第10回目になります。前回まで戦闘システムの開発を進め、複数ターゲットなどの機能も実装して一区切りとしました。前回の記事:今回からはダンジョンRPGの重要な要素の...

Unity 3DダンジョンRPGの作り方講座に戻る >>

【ゲームの作り方講座もプレゼント中!】

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

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