Unityに関連する記事です

 ここからは、基礎編をベースに処理の発展・応用を行っていきます。
難しいと感じたら一旦終了して、復習をしっかりと行ってから進めるようにしましょう。

 教材を進めることが目的ではありません。教材を通じて学習し、理解を深め、ロジックを考えられるようにすることが目的です。
エラーを出ないように進めれば教材を終了することはできますが、それでは知識や技術は備わりません。
わかったつもりでは先々に自分ひとりで処理を考える際に詰まってしまいますので、是非、自分の力を養うためのツールとして上手に活用をしてください

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

発展1 −UI関連処理の統合−
 1.UIManager スクリプトを修正し、耐久力ゲージの制御処理を追加する
 2.DefenseBase スクリプトの耐久力ゲージの更新処理を修正し、UIManager スクリプトに用意したメソッドを呼び出す処理に変更する



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

 ・リファクタリングを行い、関連する処理を1つのスクリプトにまとめる方法
 ・スクリプトを経由して別のスクリプトの処理を実行していく方法



1.UIManager スクリプトを修正し、耐久力ゲージの制御処理を追加する

1.設計


 UIManager スクリプトを作成したことにより、ユーザー情報を表示する UI 関連の処理をすべてこのスクリプトに管理させるように設計を見直します。
不具合の修正ではなく、スクリプトの処理を見直して、別のスクリプトに処理を移行したり、読みやすく改善する作業を行います。
この作業をリファクタリングといいます。

 リファクタリングの定義は「プログラムの外部から見た動作を変えずにソースコードの内部構造を整理する」ということになっています。
つまり、ゲーム上の動作には変化はありません。あくまでも内部的なプログラムを改善する作業のことを指します。
不具合がない状態で始めて行うことができる作業になります。



 現在 UI の制御を行っているスクリプトは UIManager スクリプトと、DefenseBase スクリプトの2つがあります。
DefenseBase スクリプトでは、拠点の耐久力の値の数字表示の制御と、耐久力のゲージの表示制御が行われています。
こちらが UI 関連の処理になりますので、この処理と、この処理で利用している変数を UIManager スクリプトへと移動して、
今まで通りに処理が正常に動作するかを確認します。
 
 DefenseBase スクリプトの管理している情報のうち、どの部分が UI 関連の情報になっているかを見極めて、必要となる情報を UIManager スクリプトの方に転記します。
見極めるとはすなわち、DefenseBase スクリプトに残す変数と処理、UIManager スクリプトに移行してよい変数と処理を切り分けることを言います。

 処理の多くは一連の処理でまとめてメソッド単位で分けて記述してありますので、こういった作業の際にも見分けやすくなります。
対象となるメソッドを見つけて、その中で利用している情報に変数があるならば、それも移行対象の変数となります。
ただし、利用している変数は、DefenseBase スクリプトで管理をすべきものもあります。これを見極めることが重要です。



 UI の表示制御を行っている変数であれば、それはつまり、using UnityEngine.UI; の宣言が必要な型を持っています。
これが UI 関連の変数になりますので、Text、Image、Button、Slider といった型はこの対象になります。

 それ以外の変数は、UI の制御に利用されているものではなく、あくまでも情報として DefenseBase スクリプトが UI の変数に提供しているものになります。
つまり、耐久力の値そのものや、最大値などがこの対象になりますので、これは移行させない情報となります。

 この部分をしっかりと切り分けて見極めてください。

 なお、UIManager スクリプトに移行対象となるメソッドは、処理の流れとしては、DefenseBase スクリプトより実行の命令が届くようになる設計です。
そのため、メソッドの修飾子にも注意を払う必要があります。なぜなら private 修飾子では、外部のスクリプトからの実行命令が行えないためです。

 また、耐久力などの値の情報も DefenseBase スクリプトが管理を続けるということは、これらの情報もメソッドに届かないと
画面上の表示が更新されなくなります。こういった場合には引数を利用してください。
UIManager スクリプトに移行するメソッドに耐久力などの値を受け取る引数を窓口として用意することで、
DefenseBase スクリプトがこの表示の制御処理を行うメソッドを呼び出す際に耐久力などの値を渡すことが可能になります。

 以上のことを参考にしながら、ロジックを組んでみてください。
どのような処理の順番であれば今まで通りに動作をするのかを、現在の処理を見ながら考えることが大切です。
 
<ロジックの流れ>

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


 この処理を実装するためには、どのスクリプトから修正を行えばよいか、処理を見ながら考えて実装方法を変更してください。


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


 設計の処理の順番を確認しながら、このスクリプトに用意するべき情報や処理を考えて実装していきましょう。
DefenseBase スクリプトより、こちらに移行する変数やメソッドを考えて記述してください。
その際には、修飾子や引数にも注視して、処理を考えてください。


UIManager.cs

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


 スクリプトを作成したらセーブします。
UIManager ゲームオブジェクトのインスペクターを確認し、新しく SerializeField 属性で宣言した変数が表示されているか確認しておきます。


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



3.UIManager ゲームオブジェクトの設定を行う


 UIManager ゲームオブジェクトのインスペクターを確認すると、UIManager スクリプトに txtDurability 変数と slider 変数が表示されていますので、
こちらに対象となるコンポーネントがアタッチされているゲームオブジェクトをドラッグアンドドロップしてアサインしてください。


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



 以上で設定は完了です。


2.DefenseBase スクリプトの耐久力ゲージの更新処理を修正し、UIManager スクリプトに用意したメソッドを呼び出す処理に変更する

1.設計


 先ほどの設計でロジックを実行するための準備が整いました。
ここでは DefenseBase スクリプトを修正し、処理の命令をロジックの方式に変更するとともに、
UIManager スクリプトへと移行して不要になった変数やメソッドを削除します。

<ロジックの流れ>

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


 リファクタリングのポイントは、外部的な機能の変更はない、という部分ですので、処理を変更してもゲーム内容には変更がないということです。
処理を改善して今まで通りに処理が動かなくなってしまわないように気を付けて変更を行います。


2.DefenseBase スクリプトを修正して、UIManager スクリプトに移行する処理と書き換える処理を追加する


 設計に基づいて、UIManager スクリプトに移行する変数やメソッドを切り分けて、不要になった処理については削除しましょう。
また、処理が UIManager スクリプトに移行しているので、いままでのメソッドの呼び出し方法では命令が実行できません

 どのようにすれば DefenseBase スクリプトから UIManager スクリプトに命令が出せるように出来るのかを考えてみてください。
後述していますが、GameManager スクリプトの情報がありますので、それを上手く活用することがポイントです。


DefenseBase.cs

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


 スクリプトを修正したらセーブします。
DefenseBase ゲームオブジェクトのインスペクターを確認し、削除した変数がなくなっていることを確認します。


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



3.<スクリプトを経由して別のスクリプトの処理を実行していく方法>


 DefenseBase スクリプトには UIManager スクリプトを利用するための変数や、取得した情報がありません
では、どのようにして、取得していない情報の UIManager スクリプトにある DisplayDurability メソッドを実行できているのでしょうか?

 スクリプトでは、外部のスクリプト(コンポーネント含む)の型と変数を用意することで、そのスクリプトの情報を取得し変数に代入することで、
そのスクリプトへの参照や、メソッドを実行することが出来るようになります。この処理にはさらに応用が利くようになっています。

 外部のスクリプトを取得した場合、そのスクリプトで宣言している public 修飾子の情報も、そのまま利用可能になります。

 // 耐久力の表示更新
 gameManager.uiManager.DisplayDurability(durability, maxDurability);   // <= UIManager には durability と maxDurability の情報がありませんので、引数として渡します

 DefenseBase スクリプトには、GameManager スクリプトの情報を代入して利用できる gameManager 変数があります。
そのため、この gameManager 変数では、GameManager スクリプトの public 修飾子の情報をすべて扱うことができます。これは変数とメソッドの両方が対象です

 GameManager スクリプトの、public 修飾子で宣言されている情報を見てみましょう。

<GameManager スクリプトの public 情報 (竸堯
    [Header("ゲーム終了判定値")]
    public bool isGameUp;

    public UIManager uiManager;

 続いて、メソッドも見てみます。メソッド名のみ記述します。

<GameManager スクリプトの public 情報◆(竸堯
 public void SwitchGameUp(bool isSwitch) {
  }

  public void PreparateGameClear() {
  }

  public void PreparateGameOver() {
 }

 全部で5つの public の情報がありました。
つまり、GameManager スクリプトの情報が代入されている変数や、GameManager スクリプトを取得できれば、この5つの情報に対して処理の実行命令が行えるということになります。



 public 情報の変数をみてください。UIManager スクリプトの情報が uiManager 変数に代入されていることが分かります。
先ほどの GameManager スクリプトの public 情報と同じで、UIManager スクリプトの情報が uiManager 変数に取得できているということは、
GameManager スクリプトは、UIManager スクリプトにある public 情報に対して処理の実行命令が行える、ということになります。

 これは、GameManager スクリプト自体が実行するだけではなく、GameManager スクリプトの情報が代入されている gameManager 変数からでも処理が実行出来ます。
スクリプトを経由して、間接的に別のスクリプトに対しても、処理を実行することが出来ます。



 この場合、GameManager スクリプトにおいて public 修飾子で宣言している UIManager スクリプトの代入されている uiManager 変数に対して命令を出し、
UIManager スクリプトに新しく追加した DisplayDurability メソッドを実行することが出来ることになるのです。

 今回のように、取得したスクリプトがどのような情報を扱えるのかを把握して設計しておくことで、今回の処理のように、
DefenseBase スクリプトが変数を用意して UIManager スクリプトを取得せずとも、すでに変数で情報を取得している GameManager スクリプトを通じて処理命令を実行することが可能です。

 設計が重要といわれる所以です。そして非常に重要な処理の1つです。
どのスクリプトがどのスクリプトとつながっているか(依存関係にあるか)をしっかりと理解しておく、
変数間でどういった処理が実行できるようになっているのかを合わせて理解しておくことで、こういった処理が実行できます。

 この処理が今後のプログラムには頻繁に出てきます。しっかりと学習しておきましょう。


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


 リファクタリングは不具合の修正とは異なり、プログラム内の処理を見直して整える目的で行います。
そのため、ゲーム上の内容(動作)は変わりません。変わってしまっていたら、それは不具合になります。

 ゲームを実行して、いままで同じように耐久力のゲージが減少するか確認を行いましょう。

 今後 UI 関連の処理を追加する場合には、すべて UIManager スクリプトへと記述するようにします。
このように役割をしっかりと持たせて設計を行っておくことで、スクリプトの内容が明確かつ、適切な内容になります。
また、UI の場合、UI 関連の型を扱うために必要な using 宣言が1つのスクリプトに記述するだけで良くなります。

 スクリプトを作成したり、処理を追加していく際には、全体の設計を考えてイメージを作り、作成してくことが大切です。
今回のように、後程改善することも可能ですので、最初から1つにまとめることが難しい場合には、どこかのタイミングで改善するように考えておきます。
1つの考えに縛られずに、固定観念は持たないように、柔軟な対応を心がけてください。


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

 次は 発展2 −エネミー用のデータベース作成− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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