i-school - パズルゲーム 発展8

選択している干支を消した際の獲得スコアをアップさせ、スコア表示に演出を追加する


 ここからは、ゲームを面白くするためのロジックを考えていきます。最初に、選択した干支を利用したロジック作りです。
ユーザーが自分で選択した干支の情報がゲームに反映されるようになりましたので、これをさらに活用して、ゲームに深みを持たせていきます。



 選択している干支と、他の干支との差別化を図るために、選択している干支を消した場合には、獲得できるスコアを多くし、さらに、UIのスコア加算時の演出も追加していきます。

 前回までの手順でGameDataスクリプトに EtoRate 変数を用意してあります。選択している干支を消した場合には、この値をスコアに掛けるようにします。

<通常のスコア計算>
 GameDataに用意した EtoPoint変数の値 * 消した干支の数

<選択した干支のスコア計算>
 GameDataに用意した EtoPoint変数の値 * 消した干支の数 * GameDataに用意したEtoRate 

 例えば、GameDataの EtoPoint = 100、EtoRate = 3 としておきます。

 干支を1回あたりにまとめて4つ消した場合、選択していない干支は 100 * 4 = 400 ですが、選択している干支の場合には 100 * 4 * 3 = 1200 と、スコアにかなりの差が生まれます。
 
 このようなシステムがあればユーザーは積極的に選択した干支を消すことを考えてゲームをプレイするようになりますし、ハイスコアを目指すための方法を考えてくれるはずです。
ゲームに幅が生まれますので、このロジックを実装していきましょう。


完成動画(選択している干支は巳。最初に亥を消すと普通に加算。次に巳を消すとスコアがアニメして加算し、加算数も多い)
https://gyazo.com/b1c16483c97fb73a2c51a1270047c442


設計と実装の手順


 GameDataスクリプトにスコアの倍率である EtoRate 変数は用意してありますので、こちらの値を、スコアが加算する際に反映することができればゲーム内に処理を実装できます。

 GameManagerスクリプトにAddScoreメソッドがありますので、こちらを修正して、選択している干支だった場合には、このEtoRate変数を利用する、という設計にします。
またスコアを表示する際にも、選択している干支であったかどうか、という判定値があれば、選択している干支に合わせた分岐の演出が可能になりますので
UIManagerスクリプトのUpdateDispayScoreメソッドを修正して、選択している干支という情報を反映できる処理を追加していきます。

 実装の手順です。

 1.UIManagerスクリプトを修正する
 2.GameManagerスクリプトを修正する
 3.txtScoreゲームオブジェクトのインスペクターを修正する
 4.ゲームを実行して動作を確認する



 新しく学習する内容です。

・省略可能な引数を持つメソッドを定義する方法と使用方法


1.UIManagerスクリプトを修正する


 UpdateDispayScoreメソッドを修正して、選択している干支という情報を反映できる処理を追加していきます。
このメソッドに引数を追加し、選択している干支かどうか、という情報を取得できるようにしましょう。この情報があれば、メソッド内に分岐を作ることで
選択している干支かどうかをその都度自動で反映して、選択している干支のときにだけスコアにアニメ演出を施すという処理を追加できます。
DoTweenを使用しますので、 using で忘れずに宣言をしておきます。


UIManager.cs

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


<省略可能な引数を持つメソッドを定義する方法と使用方法>


 省略可能な引数とはデフォルト引数とも呼ばれます。メソッドに引数を用意する際に、あらかじめ初期値を設定(初期化)しておくことで
その引数を省略した場合には初期値を使用し、省略せずに記述した場合にはその値を使用する、という定義になっています。

 <今回のケースの場合のメソッドの定義>
public void UpdateDisplayScore(bool isChooseEto = false)

 通常の引数とは異なり、型、変数名の宣言に加えてイコールで初期化を行っています。
これが省略した引数の定義の方法になります。なお、複数の引数を持つメソッドの場合、この省略書式は、省略していない引数の宣言が終わってから書かないとエラーになります。

 <複数の引数を持つ場合のメソッドでの省略引数の定義>

 1.エラーにならない場合(省略していない引数を書いた後に省略引数を定義する)
 public void UpdateDisplayScore(int x, GameObject obj, bool isChooseEto = false)

 2.エラーになる場合(省略していない引数が省略引数よりも後ろに定義されている)
  public void UpdateDisplayScore(int x, bool isChooseEto = false, GameObject obj)

 省略引数を持つメソッドを呼び出す命令には2つの方法があります。
1つは省略引数を書かないで呼び出す方法と、省略引数を書いて呼び出す方法です。

  isChooseEto = true;

 <省略引数を省略しない場合の命令>
 uiManager.UpdateDisplayScore(isChooseEto);

 <省略引数を省略する場合の命令>
 uiManager.UpdateDisplayScore();

 上記の場合には、trueが引数として渡されます。
 下記の場合には引数が省略されていますので、省略引数で初期化して宣言している false が引数として渡されます。

 省略引数の値を利用することがほとんどで、たまに引数を指定して渡すようなメソッドの場合には、
引数の値が必要な場合にだけメソッドの引数を記述すればよいことになりますので、その都度、引数を書く手間が省けます。


2.GameManagerスクリプトを修正する


 AddScoreメソッドを修正して、GameDataスクリプトの EtoRate 変数を反映できるようにしましょう。
メソッドには引数として EtoType がすでに用意されています。この引数情報は消された干支の種類が入っていますので
この干支の種類と選択している干支とを照合して、合致している場合には、EtoRateを適用したスコアになるようにします。
そうでない干支の種類のときは今までと同じ処理を行います。

 この際、選択している干支であった場合には isChooseEto という変数が True になるようにしておきます。
この値をUIManagerのUpdateDispayScoreメソッドを呼び出す処理に追記します。そうすることによって、UIManager側で自動的に選択している干支かどうかを判定して
スコア加算時の演出を実行してくれるようにしています。


GameManager.cs

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



3.txtScoreゲームオブジェクトのインスペクターを修正する


 いままでのスコア表示の位置のままだとスケールを大きくした場合にうまく表示されません。
txtScoreゲームオブジェクトを選択して、インスペクターを確認します。

 RectTransformコンポーネントの Position.x の位置を 0 => 30 に変更します。

 またTextコンポーネントの Paragraph プロパティの Alignment の設定を 右詰め => 中央揃え に変更します。


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



 以上で修正は完了です。


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


 どちらのスクリプトもアサイン情報の追加はありませんので、修正が終了したら、ゲームを実行して動作を確認していきます。
GameDataスクリプトのEtoRate は以前の作成時に 3 が初期値でアサインされているはずです。

 選択している干支と、そうでない干支とを消してみてください。選択している干支の際にスコアが一瞬大きくなるアニメをして、加算される値も通常の3倍になっていれば成功です。
また、それ以外の干支を消した場合には以前と同じでスコアの演出はなく、加算される値も同じになります。

 もしもうまくいかない場合には、修正したスクリプトを見直してみましょう。また、GameDataスクリプトの EtoRate の値が 0 になっていないか確認してみましょう。


完成動画(選択している干支は巳。最初に亥を消すと普通に加算。次に巳を消すとスコアがアニメして加算し、加算数も多い)
https://gyazo.com/b1c16483c97fb73a2c51a1270047c442


 アニメ処理をもっと派手にしたい場合には、スコアの表示のスケールを大きな数字に変更してみましょう。
その場合には画面からはみ出ないように大きさや、スコア表示の位置に注意して調整してください。



 以上でこの手順は終了です。

 次は 発展9 です。