i-school - リザルト機能の実装
 バトル終了時にバトル結果をリザルトとして表示する機能を実装します。


<実装動画>
動画ファイルへのリンク

 ※ レベルアップの処理は未実装です。



設計


 バトル内でのユーザーに対する褒賞や評価として、バトルごとの結果をリザルトとして表示する機能を設計します。

 今回はエネミーを倒した際に獲得した経験値(Exp)の総数と、コンボを成功した(あるいはクリティカルした)回数を、結果報告として表示するようにしています。
このほかにも表示したい内容があれば、仕様と設計を考えて追加します。



 処理の流れは次の通りです。

 1.エネミーを倒したら、エネミー側から BattleManager 側に用意してある、バトル内で獲得した経験値を管理しておくための変数に、エネミーの持つ経験値を加算する処理を追加する

 2.すべてのエネミーを倒したら、シーン遷移するのではなく、リザルトの表示を行うように処理を修正する

 3.リザルトが表示されたら、ウインドウや、獲得した経験値の値をカウントアップするアニメ演出などを行い、GameData クラスにあるトータル経験値を管理する変数に、今回のバトルで獲得した経験値を加算する
   しばらく経ったら自動的にシーンの遷移を行うようにする
   シーン遷移先は、ボスバトルである場合にはワールドシーン、通常のバトルの場合にはステージシーンへ遷移させる

 こちらの流れを念頭に置いて、処理を実装します。

 まずは最初にリザルト表示用のゲームオブジェクト群を作成します。


リザルト用のポップアップを作成する


 新しくリザルト表示用の Canvas ゲームオブジェクトを作成し、その中に表示用のゲームオブジェクト群を配置します。
背景や形状、フォントなど、自由に設計していただいて構いません。参考例を載せておきます。


完成時のヒエラルキー画像



完成時の Sceneビュー画像





Canvas_Result ゲームオブジェクト


 CanvasScaler コンポーネントの設定のうち、Reference Resolution の値は、自分の Game ビューの解像度の値に合わせてください。



lblTitle ゲームオブジェクト





imgBackFrame ゲームオブジェクト





ExpSet ゲームオブジェクト





lblExp ゲームオブジェクト




txtExp ゲームオブジェクト




TotalComboCountSet ゲームオブジェクト




lblTotalComboCount ゲームオブジェクト





txtTotalComboCount ゲームオブジェクト



NormalResultCancas スクリプトを作成する


 DOTween を使ったアニメ演出を複数実装しています。
アニメのパターン、時間、Ease の設定などを自由に変更して、どの処理によってどのアニメが連動しているかをしっかりと理解しておいてください。

 DOTween の処理は非同期処理になります。そのため、プログラム上、1秒かけて移動する、という DOTween の処理があった場合、
の時間を待つことなく、次の処理が実行されます。よって、複数の DOTween の処理を続けてかくと、すべて同じタイミングで処理されてしまいます

 DOTween の処理を1つずつ、処理が終わってから次の DOTween の処理を行うために、DOTween には Sequence(シーケンス)という機能が用意されています。
Sequence に用意されている Append(アペンド) メソッドを活用することにより、Append メソッドの引数に指定した DOTween の処理が終了してから、
次の Append メソッドの引数に指定している DOTween の処理を実行する、という処理が実装出来ます

 そのため、今回の場合には、次のようなアニメ演出を順番に1つずつ処理したいため、Append メソッドを活用して処理を記述しています。

<リザルトの表示処理の順番>
 1.Canvas 表示。この時点では Result の文字だけ出る

  2.リザルト表示用のフレームをアニメ表示(横方向に伸ばす)
  
 3.EXP 表示

  4.EXP 加算アニメ

  5.コンボ数 表示

  6.コンボ数 加算アニメ

 これをすべて一緒に処理せずに、上から順番に、前の処理が終了してから次の DOTween の処理を実行するようにしています。
実装動画も確認してみて、イメージをつかんでください。

 処理の内容を理解しながら、プログラムを書いていってください。

 新しい DOTweeen のメソッドもいくつか出てきていますので、自分で調べてみましょう。


NormalResultCancas.cs

<= クリックすると開きます



Canvas_Result ゲームオブジェクトに NormalResultCanvas スクリプトをアタッチして設定する




インスペクター画像



BattleManager スクリプトを修正する


 スクリプト内にある、下記の命令部分を探してください。
倒したエネミーの数とバトルのクリア目標値とを判定している部分にあります。


 SceneStateManager.instance.PreparateStageScene(SceneName.Main);

 この命令部分を下記の命令文に書き換えて、エネミーを全滅させてても、すぐにシーン遷移は発生させないようにします。

  // バトル終了時の処理
  StartCoroutine(OnExit());

 新しい変数の追加と、OnExit メソッドの追加を行います。



BattleManager.cs

<= クリックすると開きます



<考えよう!> EnemyController スクリプトを修正する


 EnemyController クラスは BattleManager クラスの情報を変数で管理している状態になっています。
また、EnemyData クラスには Exp の情報が、エネミーごとに設定されています。

 ''EnemyController クラスに、EnemyData の情報を設定してください。DataBaseManager クラスに EnemyDataSO スクリプタブル・オブジェクトを登録してありますので、そちらを利用しましょう。
そうすることで、Exp の情報がエネミーごとにデータから設定されます''。


EnemyData についてのヒント

<= クリックすると開きます




 EnemyData が準備できたら、処理を完成させましょう
 適宜なタイミングで、BattleManager クラス内に用意した EXP を加算するメソッドを実行し、エネミーを倒すたびに、獲得した EXP を加算するロジックを完成させてください


ゲームを実行して動作を確認する


 エネミーを倒すたびに、BattleManager クラスの currentBattleTotalExp 変数が加算されているかを確認します。
ゲーム内の処理がどの部分とつながっているかを理解した上でデバッグを行うことが重要です。そうすることで、不具合がある場合に見つけやすく、修正箇所を特定しやすくなります。

<実装動画>
動画ファイルへのリンク


 すべてのエネミーを倒した際、シーン遷移の前にリザルト表示が行われて、獲得した Exp の値がカウントアップアニメをして表示されれば制御成功です。


<実装動画>
動画ファイルへのリンク




 この動作が問題なく動いたら、クリティカルなどの回数についても、適宜なタイミングに処理を追加してみてください。