Unityに関連する記事です

 前回に続いて、属性についての実装処理を行います。今回は以下の内容で順番に実装を進めていきます。

発展34 −属性の要素の運用−
68.GameData スクリプトと、EnemyController スクリプトを修正し、バレットの持つ属性情報と、エネミーの持つ属性情報を ElementCompatibilityHelper スクリプトを利用して相性判定し、相性が良い場合には与えるダメージを増やすようにする
69.DefenseBase スクリプトを修正し、選択しているバレットの属性情報とエネミーやエネミーのバレットの持つ属性情報を ElementCompatibilityHelper スクリプトを利用して相性判定し、相性が良い場合には受けるダメージを増やすようにする



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

 ・戻り値を持つメソッドの処理の実装例 −if 文の条件式、引数への指定、戻り値後の型に対して続けて記述する処理−



68.GameData スクリプトと、EnemyController スクリプトを修正し、バレットの持つ属性情報と、エネミーの持つ属性情報を ElementCompatibilityHelper スクリプトを利用して相性判定し、相性が良い場合には与えるダメージを増やすようにする

1.設計


 属性の情報を利用して判定を行う処理まで実装できましたので、次は、この処理を実際に呼び出して
属性間の相性を真偽値として判定し、弱点の場合とそうでない場合とで処理を分岐できるようにするロジックを考えます。

 弱点である場合には、ダメージの値を増やすような設計にします。
加算方式は色々な方法がありますが、今回は、指定した倍率をダメージ値に乗算する計算式を利用します。

 以上のことから、倍率の設定をどのスクリプトに記述するかも一緒に考えていきます。
 
 この情報も属性の判定メソッドと同じで、プレイヤー側、あるいはエネミー側、どちらでも利用する処理になります。
別々に乗算する値を用意してもよいですが、その場合であっても、設定値は一か所にまとめておいた方が管理は楽になります。

 特に GameData クラスのようなものに管理をさせることで、いずれのスクリプトからも変数の代入なしでの参照が可能になりますので、
利用方法を考えた上で実装を行っていく必要があります。

 1つずつ、設計した内容を書きだして、それを見ながらロジックを組み立ててていってください。
いままで学習してきた「設計」部分には様々な設計の手順がまとめられていました。
同じように自分で「設計」を行い、それをロジック化していく方法で処理の実装を進めてみてください。


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


 属性間の相性の判定により、ダメージを増やすための倍率用の変数とメソッドを用意します。
今までと同じように、ダメージ倍率用の変数と、その変数を参照できるメソッドをロジックとして検討してみてください。
メソッドではなく、プロパティにしてもよいでしょう。

 GameData クラスで管理しておくことにより、インスペクターより設定が出来るだけではなく、
いずれのスクリプトからも参照が容易になります。

 なお、public 修飾子で宣言して利用することが最も簡単な方法ですが、その実装方法以外で実装してください。
学習の目的は、変数を利用するだけではなく、しっかりとしたロジックを組み立てられるようになることです。


GameData.cs

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


 スクリプトを修正したらセーブします。

 GameData ゲームオブジェクトのインスペクターを確認します。
新しく SerializeField属性で宣言した damageRatio 変数が追加されています。


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



 damageRatio 変数に属性間の相性が良かった場合の倍率を設定します。
最初は 2 にしてください。相性がよいバレットがエネミーに接触した場合、ダメージが2倍になります。


3.EnemyController スクリプトを修正する


 設計に基づいて、処理の修正場所を特定して、処理を追加したり、削除したりしてください。
どんなロジックになっていればいいかを考えて、処理の流れをみながら実装を行うことを心がけてみてください。

 分岐内に同じ処理を書く場合、すべての処理を書いてからでよいので、その重複している処理を1箇所にまとめて書くことはできないか、
ロジックの流れを見直してみてください。見直しをすることでロジックの組み立て力が養われます

 属性間の相性がよく、エネミーにとって弱点となる属性であった場合には、Debug.Log メソッドを利用して、
その情報を Console ビューに表示するようにしておいてください。相性の良しあしを判定した結果が Console ビューで判別できるようになります。


EnemyController.cs


 スクリプトを修正したらセーブします。


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


 スクリプトの見直しが終了したら、ゲームを実行して、属性による弱点要素がゲーム内に反映されているか、確認します。


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


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



 ゲームを一時停止しながら、Console ビューの表示も確認しながら、弱点の効果がゲーム内に反映されているか確認してください。


ノーマルのバレット(どちらのエネミーも弱点ではない)



弱点ではない相性のバレット



弱点の相性のバレット(上記の2倍の値になっている)



69.DefenseBase スクリプトを修正し、選択しているバレットの属性情報とエネミーやエネミーのバレットの持つ属性情報を ElementCompatibilityHelper スクリプトを利用して相性判定し、相性が良い場合には受けるダメージを増やすようにする

1.設計


 先ほどの設計と同じような処理を、今度はプレイヤー側がダメージを受ける側として、ロジックを組み立ててください。

 エネミー側の属性情報と異なり、プレイヤー側の属性は、その時点で選択しているバレットの属性の情報を利用します。
このため、このゲームのプレイングには、エネミーに合わせて弱点となるバレットを切り替えるだけではなく、エネミー側から弱点となる属性のバレットをなるべく選ばないようにするという、
選択肢に対してのジレンマが生じる設計になっています。

 こうすることにより、何も考えずにバレットを切り替えて遊ぶという楽しみだけではなく、
プレイヤーはゲームを深く理解しようとし、より研究し、上手くなろうとするでしょう。
そのようなプレイヤーのスキルや、探求心に訴求し、色々な遊び方が出来ることを提案する仕掛け作りになっています。


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


 前回設計したロジックと同じように、エネミー側の属性と、現在選択しているバレットの属性の情報とを判定して、
弱点であるか、弱点ではないかを判定し、制御する処理を実装してください。

 現在使用しているバレットの情報は、GameData クラスにあるメソッドを実行することで情報を取得出来ます。

 またこれらの処理に合わせて、エネミーの発射するバレットのダメージ値について、BulletData から参照するように変更してください。
EnemyData の場合とおなじで、修正してバレットからのダメージ値を固定値ではなくなるようにします。

 自分の考えた実装を行った上で、上手くいっても、上手くいかなくても構わないので、何も見ずに、最後まで自分で書いてみてください
それから教材を確認しても遅くはありません。たくさん考えて、処理を書き直して、デバッグを繰り返すことがよりよい学習につながります

 複数の処理を一度に実装しようとはせず、1つの処理を記述してデバッグを行い、それが問題なければ次の処理、というように
複数の処理を積み重ねていって、実装を完成するようにしてください。


DefenseBase.cs

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


 スクリプトを修正したらセーブします。


3.<戻り値を持つメソッドの処理の実装例 −if 文の条件式、引数、戻り値後の型に対して続けて記述する処理−>


 今回実装している JudgeDamageToElementType メソッドでは戻り値を持つメソッドが3箇所で利用されています。

     if (ElementCompatibilityHelper.GetElementCompatibility(attackElementType, GameData.instance.GetCurrentBulletData().elementType)) {

            // エネミーの攻撃属性がプレイヤー側の弱点であるなら、被ダメージに倍率をかける
            lastDamage = Mathf.FloorToInt(attackPower * GameData.instance.GetDamageRatio());

            Debug.Log("弱点");
        }

 if 文の条件式には、判定の対象として、戻り値を持つメソッドを使用することができます。
その場合、そのメソッド内での処理の結果をもとに、if 文が判定を行います。

 今回処理されているメソッドは、ElementCompatibilityHelper クラスにある、GetElementCompatibility メソッドです。
この GetElementCompatibility メソッドの戻り値は bool 型ですので、if 文は戻り値の値の true か false を見て、処理の分岐を発生させています。
そして、true の場合に限り条件を満たし、lastDamage 〜の文節が実行されるようになっています。



 GetElementCompatibility メソッドの第2引数にも、戻り値を持つメソッドが実行されています。

  GameData.instance.GetCurrentBulletData().elementType

 こちらの処理になります。GameData クラスにある GetCurrentBulletData メソッドを実行することによって、
現在使用しているバレットの BalletData の情報を取得することが出来ます。
取得した BalletData の情報にはさらに変数が含まれており、その中の elementType という情報を、この部分では利用しています。
つまり、GetCurrentBulletData().elementType とは、現在使用している BulletData.elmentType という指定になります。
ピリオドの部分までが戻り値です。

 戻り値のあるメソッドは、処理の上辺を追いかけても処理の内容が読み解けません。
メソッドの名前が重要なのではなく、そのメソッド内で処理されて戻ってくる値と型が重要です。これは変数も同じです。
 
 戻り値のあるメソッドについては、その中の処理を読み解いて、どのような情報が値として戻されているのかを読み解いて始めて
そのあとに続く処理を読み解くことが出来ます。

 1つ1つの処理を細かく分けて、順番に読み解いていくようにしましょう。

 if 文内のメソッド、および、代入処理の右辺に書かれているメソッドは、すべて戻り値を持つメソッドになります。
そういった部分にも着目して処理を読んでみてください。



 3つ目の戻り値を持つメソッドについても書いておきます。

 // エネミーの攻撃属性がプレイヤー側の弱点であるなら、被ダメージに倍率をかける
  lastDamage = Mathf.FloorToInt(attackPower * GameData.instance.GetDamageRatio());

 メソッドの場所を確認しましょう。右辺に記載されているので、この GameData クラスにある GetDamageRatio メソッドも戻り値を持つメソッドです。
このメソッドの処理の結果が float 型で戻ってきますので、その値と attackPower を乗算し、Mathf.FloorToInt メソッドを利用して、端数に関しては切り捨てて int 型にキャストしています。

 特に今回の教材の場合、Get〜 で始まるメソッドはすべて戻り値を持つメソッド名に統一しています。そういった設計にしておくことで
メソッド名を見ただけでも戻り値を持つメソッドかどうか判断できます。是非、そういった観点でメソッド名も命名規則を自分なりに設計してください。

 この Get 〜 で始まるメソッド名の命名規則については多くの方が利用している、一般的な設計になります。


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


 スクリプトの見直しをして、処理の流れを確認してから、ゲームを実行して挙動を確認していきます。

 選択しているバレットのデータにある属性の情報が、プレイヤー側の属性になります。
その属性とエネミー側のデータにある属性の情報とを判定して、弱点か、弱点ではないか、によって
弱点と判定されたときだけ、被ダメージの値がダメージ倍率分加算されていれば制御成功です。


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


<弱点の属性ではないエネミーに侵入された場合>



<弱点の属性のエネミーに侵入された場合>



 属性の相性情報が邪魔にならない程度の大きさと位置で、画面上に常時表示しておいてもいいかもしれません。
その辺りの設計は自由に追加してください。

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

 次は 発展35 −フロート表示に属性の要素の運用− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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