Unityに関連する記事です

 手順23の続きです。こちらではリザルトポップアップ用のスクリプトを新しく作成し、他のスクリプトを修正していきます。120 18:35-

 完成画像と動画は以下のようになります。


リザルト表示ポップアップ



<動画> ゲームの終了後、リザルト表示ポップアップを生成し、ゲーム結果を反映して表示する(この例ではステージクリア時に表示)
https://gyazo.com/5b39ddd2793c6ee793ddd2e3bb5e4b12



 以下の内容で順番に実装を進めていきます。

手順24 −リザルトポップアップ生成処理を実装−
51.ResultPopUp スクリプトを作成する
52.BattleManager スクリプトを修正する



 新しい学習内容は、以下の通りです。

・プラットフォーム依存コンパイル −プラットフォームに合わせて処理を変える機能−
・if文による制御文の書式
・プロパティの利用 −private 修飾子の値を外部クラスで参照(ゲット)する−



51.ResultPopUp スクリプトを作成する

設計


 ResultPopUpゲームオブジェクトには複数のTextコンポーネントを扱うゲームオブジェクトが設置されています。
これらはそれぞれ、ゲーム内で獲得したMoneyの値がその都度プレイの内容に応じて変更される必要があります。

 そのために、ResultPopUp ゲームオブジェクト用にスクリプトを1つ新しく作成し、そのスクリプトから、これらのTextコンポーネントの操作を行うことで
ゲーム内のプレイ内容を反映して、リザルトの表示を行えるように制御を行います。


 ゲーム内で獲得できるMoneyは的球である敵を破壊したときに獲得できますが、その他にもゲーム内容に応じたボーナス要素があった方が
ユーザーはその更新を目標として継続的に遊んでくれる要因の1つになります。

 そこで、残り時間の値と手球の残数にボーナスの要素を付与します。これらの値はゲームクリアにも密接にかかわる値ですので、
ユーザーがゲームを何回もプレイし、上手くなっていくことによってMoneyの値を高く獲得できるボーナス要素となりえます。

 両方の値用に、ボーナス倍率を用意します。残り時間×ボーナス倍率、手球の残数×ボーナス倍率をそれぞれの追加の獲得できるMoneyとします。
敵を倒すことで獲得できるMoneyに加えて、これらのボーナスMoneyを用意することで、リザルトの表示はユーザーがプレイ結果を楽しみにできる場所の1つになります。

 ただし、ボーナス要素ですので、ステージクリアしたときしか獲得できないように制御を行います。
ゲームオーバーの場合にはMoneyしか獲得できず、ステージクリアした場合にはMoneyに加えてこのボーナスの値が2つ獲得できるようにします。


 設置したボタンの制御もこのResultPopUpスクリプトにより行います。ボタンに対応するメソッドを用意し、それをボタンのタップに合わせて呼び出すことで
再度ゲームを始めるか、ゲームを終了するかを選択できるようにします。
 すでにゲームのサイクル化は出来ていますので、このボタンを追加することで何回でもサイクルを繰り返し、遊んでもらえるようになります。


 ResultPopUpゲームオブジェクトにアタッチされている CanvasGroupコンポーネントも利用します。
こちらの alpha をスクリプトより操作することによって、生成されたリザルトポップアップが徐々に見えてくる演出や、徐々に見えなくなっていく演出を行うことが出来ます。


ResultPopUp スクリプトを作成する


 Textコンポーネント、Buttonコンポーネントへのアサイン用の変数を複数用意します。
それにより、ゲームのプレイ結果をスクリプトを通じてそれぞれのTextコンポーネントのText欄へ表示します。

 またボーナス倍率用の変数を2つ用意し、CanvasGroupコンポーネント用の変数も用意しています。

 DisplayResultメソッドの内容のほとんどはDoTweenによる、Moneyの値をドラム式に演出させるための処理です。
コメントを補記していますが、この処理の内容を正確に理解できるかどうか、確認しながら書いてみてください。
ステージクリアした場合とゲームオーバーの場合で、2つのボーナス値の更新内容が分岐します。

 また各処理にはSetEaseメソッドを追加してEaseTypeによって補間処理の制御方法を指定しています。
この内容を変更するとドラム表示のアニメが変わりますので、色々なEaseTypeを設定して試してみてください。


ResultPopUp.cs

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



ResultPopUp ゲームオブジェクトに ResultPopUp スクリプトをアタッチして設定を行う


 プレファブになっている ResultPopUpゲームオブジェクトを選択し、インスペクターの一番上にある Open Prefab を選択して編集モードにします。

 ResultPopUpスクリプトをドラッグアンドドロップして、ResultPopUpゲームオブジェクトにアタッチしてください。
インスペクターにアサイン情報が表示されます。


ResultPopUp ゲームオブジェクト インスペクター画像(見えませんが、CanvasGroupもアタッチされている状態です)



 UI関連のアサインが多いので、まずは変数名と同じ名前のゲームオブジェクトをヒエラルキーから選んでドラッグアンドドロップしてアサインしてください。
このように変数名とゲームオブジェクトを同名にしておくとアサインしやすく、また間違えた際に気づきやすくなります。Text、Button含めて8つのアサインがあります。

 こちらが終了しましたら、次は CanvasGroup コンポーネントをアサインします。
ResultPopUpゲームオブジェクトの持つCanvasGroupコンポーネントを代入しますので、ヒエラルキーよりドラッグアンドドロップしてアサインしてください。

 最後に magnifyingTimePoint 変数と magnifyingBallPoint 変数に値を代入します。どちらもゲームクリア時のボーナス倍率になります。
初期値はそれぞれ 0 ですので、magnifyingTimePoint = 100 と magnifyingBallPoint = 500 で設定してください。
その後、必要に応じてゲームをプレイしながら適宜な調整を加えてください。


ResultPopUp ゲームオブジェクト 設定後のインスペクター画像



<プラットフォーム依存コンパイル −プラットフォームに合わせて処理を変える機能−>


 Unityではプラットフォーム(PC、Androidなどの動作する環境)に合わせて処理を変更する機能があり、それをプラットフォーム依存コンパイルと呼びます。


    public void ExitGame() {

        //  ゲームのPlatform実行状況に合わせて処理を行う
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;

#elif UNITY_WEBGL
        Application.OpenURL("https://www.yahoo.co.jp/");

#else //UNITY_STANDALONE
        Application.Quit();

#endif
    }

 #if プラットフォーム名(Unityで定義されている)を指定することで、そのプラットフォームの場合のみ指定した処理を行うように設定できます。
また if / else 文と同じように #elif を追加する、あるいは else 文と同じように #else を追加することで別のプラットフォームの場合の分岐を作成できます。
そのため使用方法は通常のif文の制御と同様です。

 今回のケースでは、プラットフォームが UnityEditorの場合には、UnityEditor.EditorApplication.isPlaying = false にする処理を行い、この機能によってEditorが停止します。
プラットフォームが WebGL の場合には、Application.OpenURL("https://www.yahoo.co.jp/") を実行し、ブラウザ上で指定されたサイトを読み込みます。(ここでは yahoo を呼び出します)。
プラットフォームが上記以外の場合、例えば、PC、Andorid、iOSなどの上記のプラットフォームの場合には、Application.Quit()メソッドを実行してゲームを終了します。

 この機能を利用することにより、1つのメソッド内でプラットフォームに応じた処理を分岐して記述できます。
ゲームを終了するという処理にはプラットフォームに応じて方法が異なるため、一概に1つの処理ですべてをカバーすることが出来ないためです。


参考サイト
Unity公式スクリプトリファレンス
プラットフォーム依存コンパイル
https://docs.unity3d.com/ja/2018.4/Manual/Platform...
XR-Hub 様
【Unity】プラットフォームごとに処理を変更する方法
https://xr-hub.com/archives/13648


<if文による制御文の書式>


 OnClickClosePopUpメソッドとOnClickExitGameメソッドの最初には、ボタンの重複タップ・連続タップ防止の処理があります。
どちらか一方のボタンが1回タップされた時点で両方のボタンに制御が入り、常に1つのボタンの1つの処理しか動作しないように制御を行っています。

 このときの書式ですが、if 文の条件式を逆にして書いてあります。ですが処理の内容は同じで、ボタンの制御を行う内容になっています。


// まだボタンが押されていなければ
if (!isSelectBtn) {

    // ボタンの重複・連続タップ防止
    isSelectBtn = true;

    // ゲームを再度スタートする
    StartCoroutine(RestartGame());
}


// いずれかのボタンが押されているなら
if (isSelectBtn) {

    // このメソッドは処理しない
    return;
}

// ボタンの重複・連続タップ防止
isSelectBtn = true;
      
// ゲーム終了処理
ExitGame();    

 このように、条件式を逆にした場合であっても同様の制御処理を記述できる場合があります。
いろいろな書式の記述方法を覚えておくことで柔軟に対応することが出来ます。
1つの手法にとらわれることなく、上手く応用していくことを覚えておいてください。


52.BattleManagerスクリプトを修正する

設計


 ゲームの進行状態がゲーム終了状態(Result、あるいはGameOver)になった際にリザルトポップアップを生成するように処理を追加します。

 先ほどの手順でプレファブにしたResultPopUpゲームオブジェクトを変数に登録し、それを元にリザルトポップアップを生成します。
生成した直後に、リザルトポップアップにアタッチされている ResultPopUp クラスの SetUpResultPopUpメソッドを呼び出して、Moneyの値などを引数として渡します。
この値を利用して、リザルトポップアップにMoneyの値を反映させる処理を行います。


BattleManagerスクリプトを修正する


 ResultPopUp クラス型の resultPopUpPrefab 変数を宣言フィールドで宣言します。
これは後程、インスペクターからResultPopUpゲームオブジェクト(プレファブ)をアサインして代入します。
この情報を利用してリザルトポップアップを生成します。
 なおGameObject型ではなく、ResultPopUp型で変数を宣言をしているのは、リザルトポップアップを生成した際にその情報を ResultPopUp 型の戻り値として受け取ることで
GetComponentを不要にし、すぐにResultPopUp クラスのメソッドを実行出来るようにしているためです。


 そのリザルトポップアップを生成するための GenerateResultPopUpメソッドを新しく1つ作成します。
このメソッドを呼び出すことでリザルトポップアップを生成します。


 リザルトポップアップを生成するタイミングは、ステージクリアかゲームオーバーの時ですので、
それを管理しているCheckRemainingEnemiesメソッド、GameUpメソッド内でこの GenerateResultPopUpメソッドを呼び出します。
こうすることで適切なタイミングでリザルトポップアップを生成することが出来ます。


BattleManager.cs

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



BattleManagerゲームオブジェクトを確認する


 BattleManagerスクリプトの修正が終了したら、BattleManagerゲームオブジェクトを選択してインスペクターを確認します。
ResultPopUpPrefab 変数に、Prefabs フォルダにある ResultPopUp ゲームオブジェクトをドラッグアンドドロップしてアサインしてください。


BattleManagerゲームオブジェクト インスペクター画像



手順動画 ResultPopUp ゲームオブジェクト(プレファブ)のアサイン
https://gyazo.com/858bc4ce6016baed7ec13bc38e58f9c6


 他にアサイン漏れが発生していないか一緒に確認しておいてください。


BattleManagerゲームオブジェクト アサイン後のインスペクター画像



<プロパティの利用 −private 修飾子の値を外部クラスで参照(ゲット)する−>


 CharaBallクラスに追加した hp 変数を参照するためのプロパティ(Hp)を今回の処理では実装しています。


    private IEnumerator GenerateResultPopUp() {

        // 省略

        // リザルトポップアップを設定
        resultPopUp.SetUpResultPopUp(this, money, currentTime, charaBall.Hp);    // <= 第4引数がプロパティの参照
    }

 プロパティは public 修飾子ですので「クラスの代入されてる変数名.プロパティ名」と記述することで参照することが出来ます。(charaBall.Hp)
この機能によって、private 修飾子である hp 変数の値を外部のクラスで参照できるようになっています。

 プロパティはメソッドと同じように、名前の頭文字を大文字にしておくと、このように外部クラスで参照を記述する際にもプロパティであることと分かりやすくなります。


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


 以上で完成です。ゲームを実行して動作を確認してください。  

 ゲームをクリアした場合、ゲームオーバーになった場合の両方の処理の後に、リザルトポップアップが生成されて、徐々に見えてきます。

 リザルポップアップの内容がゲームのプレイ内容を反映しているか、確認してください。
Moneyの値、残り時間の値、手球の残数を参照できていれば正常にリザルポップアップのMoneyの値が更新されて、合計値も合うはずです。
 
 このとき、ステージクリアしている場合には、ボーナス値が2つとも更新されてボーナスMoneyが加算されます。
ゲームオーバーの場合にはボーナス値は更新されず、Moneyのみ更新表示されます。
どちらの処理も、リザルト表示後には GameDataゲームオブジェクトの TotalMoney の値が更新されます。


 もしも正常に動かない場合には、ResultPopUpスクリプトを見直して、動かない箇所の前後にDebug.Logを入れて値の参照が正常かどうかを確認してみましょう。


検証動画 .好董璽献リアした場合 = Moneyに加えて、ボーナスがどちらも更新される
https://gyazo.com/45bfce7ceb1cc9bcc0e8d019cdf80bc8


検証動画◆.押璽爛ーバーの場合 = Moneyしか更新されない。ボーナスはどちらも 0 のまま
https://gyazo.com/dbe7d55a8535cd73b38e401f516251a7


検証動画 Moneyの値のアニメ表示
https://gyazo.com/66678c9b29814018078a2759af096649


検証動画ぁ,發Π貪戮△修屬魏,靴疹豺腓法同じゲームシーンが再度読み込まれる
https://gyazo.com/8043ac84a77487f59eed787a2264adbd


検証動画ァ.押璽爐鬚笋瓩襪魏,靴疹豺腓縫押璽爐鮟了する
https://gyazo.com/6b03b7fb649494bb6d19cc70804277d0


画像 リザルト表示後にGameDataゲームオブジェクトを確認すると、TotalMoneyが更新されている



 以上で基礎部分の実装手順はすべて終了です。おつかれさまでした!

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます