i-school - 3Dスライダーゲーム 発展5
 プレイヤーの移動に続いて、ジャンプの処理をスマホ端末で行えるように、ジャンプ用のボタンの作成と制御処理を実装します。



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

発展5 ースマホでのジャンプの制御機能の実装ー
 8.Canvas内にジャンプ用のボタンを作成する
 9.ジャンプ用のボタンをプログラムと連携して操作できるようにする



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

 ・Button.onClick.AddListenerメソッド ースクリプトからボタン用メソッドの登録ー



 8.Canvas内にジャンプ用のボタンを作成する

ジャンプ用ボタンのゲームオブジェクトを作成する


 Stage ゲームオブジェクト内にある Canvas ゲームオブジェクト内に子オブジェクトとして、ジャンプ用のボタンを作成します。
Canvas ゲームオブジェクトの上で右クリックをしてメニューを開き、UI => Button を選択して、新しい Button ゲームオブジェクトを作成します。
名前は btnJump にし、ジャンプ用のボタンであると判別しやすいようにしておきます。
 
 btnJump ゲームオブジェクトの子オブジェクトとして一緒に作成される Text ゲームオブジェクトは今回は不要ですので、削除してください。


ヒエラルキー画像




 前回の JouStick とは逆に、ゲーム画面の右半分をすべておおうように、bntJump ゲームオブジェクトの大きさを変更してください。
こうすることにより、画面の右半分はすべてボタンとして動作するようになります。

 Image コンポーネント内の Color の設定を開き、Alpha の値を 0 に変更してください。
これで透明なボタンが作成できます。


インスペクター画像



Sceneビュー画像



 以上で設定は完了です。


9.ジャンプ用のボタンをプログラムと連携して操作できるようにする

UIManager スクリプトを修正する


 作成したジャンプ用のボタンを制御するために、UIManager スクリプトを修正して、制御する処理を追加します。

 ジャンプ用の処理自体は PlayerController スクリプト内に Jump メソッドとして用意されています。
このメソッドを外部のクラス(今回は UIManager)より利用できるように、前回の PlayerController スクリプトの修正で Jump メソッドの修飾子を public に変更してありますので、
UIManager 内では、PlayerController の Jump メソッドを実行するための仲介役のメソッドを準備して、ボタンの制御と連動させてボタンによるジャンプを実装します。

 また、プレイヤーが着地しているかどうかも判定する必要がありますので、こちらも、前回の PlayerController スクリプトの修正で
GetIsGrounded メソッドを作成してあります。このメソッドを実行することで、外部のクラスが private 修飾子である isGrounded 変数の情報を取得できる状態にしています。
 
 どちらの処理も実装にあたり PlayerController スクリプトの情報が必要になります。
スクリプトの情報を取得する場合、ヒエラルキーにある penguin ゲームオブジェクトを探して、GetCopmponent メソッドで PlayerController を取得することが出来ますが、
今回は、メソッドの引数として PlayerController スクリプトの情報を設定し、外部のクラスから PlayerController の情報を譲りうけて取得する処理で実装をしています。

 複数のスクリプトにまたがって処理を実行していくことになりますので、処理を書く際には、理解しながら書いていくように心がけてください。


UIManager.cs

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


 スクリプトを修正したらセーブを行い、UIManager スクリプトがアタッチされている UIManager ゲームオブジェクトのインスペクターを確認します。
新しく SerializeField属性で宣言した btnJump 変数が表示されていれば問題ありません。
ヒエラルキーにある btnJump ゲームオブジェクトをドラッグアンドドロップしてアサインします。


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



<Button.onClick.AddListenerメソッド ースクリプトからボタン用メソッドの登録ー>


 ButtonコンポーネントにはOnClickというイベントを登録する場所があります。ここにゲームオブジェクトのアサインを行うことで、
アサインしたゲームオブジェクトにアタッチされているスクリプトに宣言されている public 修飾子のメソッドを登録することができます。





 この処理をスクリプトから制御して追加して行う処理が、onClick.AddListenerメソッドです。引数のない場合と引数のある場合で書式が変化します。

 利点は、private 修飾子のメソッドでも登録できること、スクリプトから登録しているので、Unity内の上記の画像のButton部分への登録作業や、確認をする必要がなくなること、などがあります。

 今回は引数のないメソッドを登録していますので、引数にはそのままメソッド名を記述します。メソッドの()を書くとエラーになるので、メソッド名のみを記述します。

 // ボタンの OnClick にメソッドを登録
  btnJump.onClick.AddListener(OnClickJump);

 詳細については公式のリファレンスを参考にしてください。またネットには記事が多くありますので調べてみましょう。

参考サイト

Unity公式スクリプトリファレンス
Button.on.Click.AddListener
https://docs.unity3d.com/2019.1/Documentation/Scri...


PlayerController スクリプトを修正する


 UIManager スクリプト内に追加した SetUpUIManager メソッドを Start メソッド内で呼び出して実行します。
引数を利用して、UIManager 側に PlayerController スクリプトの情報を渡すようにしています。

 この処理を行うことで、UIManager スクリプトは、プレイヤーのゲームオブジェクトを探して PlayerController を GetComponent することなく
情報を取得することができるロジックになっています。


PlayerController.cs

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



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


 この処理は前回とは異なり、エディターでも確認ができます。
ゲームを実行して、ゲーム画面の右半分をマウスの左クリックを行ってください。
見えないボタンが反応し、ジャンプの処理が実行されれば制御成功です。

 問題がなければ、ビルドを行い、デバイスでの実機テストを行います。
画面の右半分をタップしてください。エディターと同様にジャンプの処理が実行されれば制御成功です。



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

 => 次は 発展6 −ログ表示機能の実装− です。