作成したジャンプ用のボタンを制御するために、UIManager スクリプトを修正して、制御する処理を追加します。
ジャンプ用の処理自体は PlayerController スクリプト内に Jump メソッドとして用意されています。
このメソッドを外部のクラス(今回は UIManager)より利用できるように、前回の PlayerController スクリプトの修正で Jump メソッドの修飾子を public に変更してありますので、
UIManager 内では、PlayerController の Jump メソッドを実行するための仲介役のメソッドを準備して、ボタンの制御と連動させてボタンによるジャンプを実装します。
また、プレイヤーが着地しているかどうかも判定する必要がありますので、こちらも、前回の PlayerController スクリプトの修正で
GetIsGrounded メソッドを作成してあります。このメソッドを実行することで、外部のクラスが private 修飾子である isGrounded 変数の情報を取得できる状態にしています。
どちらの処理も実装にあたり PlayerController スクリプトの情報が必要になります。
スクリプトの情報を取得する場合、ヒエラルキーにある penguin ゲームオブジェクトを探して、GetCopmponent メソッドで PlayerController を取得することが出来ますが、
今回は、メソッドの引数として PlayerController スクリプトの情報を設定し、
外部のクラスから PlayerController の情報を譲りうけて取得する処理で実装をしています。
複数のスクリプトにまたがって処理を実行していくことになりますので、処理を書く際には、理解しながら書いていくように心がけてください。
UIManager.cs
<= クリックすると開きます
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
[SerializeField]
private Text txtScore;
[SerializeField]
private Text txtTime;
////* ここから追加 *////
[SerializeField]
private Button btnJump;
private PlayerController playerController;
////* ここまで *////
/// <summary>
/// スコアの表示更新
/// </summary>
/// <param name="score"></param>
public void UpdateDisplayScore(int score) {
txtScore.text = score.ToString();
}
/// <summary>
/// ゲーム時間の表示更新
/// </summary>
/// <param name="time"></param>
public void UpdateDisplayGameTime(int time) {
txtTime.text = time.ToString();
}
////* ここからメソッドを2つ追加 *////
/// <summary>
/// 初期設定
/// </summary>
/// <param name="playerController"></param>
public void SetUpUIManager(PlayerController playerController) {
// 引数を通じて PlayerController の情報を受け取り、用意しておいた変数に代入
this.playerController = playerController;
// ボタンの OnClick にメソッドを登録
btnJump.onClick.AddListener(OnClickJump);
}
/// <summary>
/// ジャンプボタンを押した際の処理
/// </summary>
private void OnClickJump() {
// プレイヤーが接地している場合(前回の手順で追加しているメソッドを通じて、isGrounded 変数の情報を取得し、接地しているかを確認する)
if (playerController.GetIsGrounded()) {
// ジャンプ(前回の手順で Jump メソッドを public 修飾子に変更しているのは、ここで呼び出し命令を行うため)
playerController.Jump();
}
}
////* ここまで *////
}
スクリプトを修正したらセーブを行い、UIManager スクリプトがアタッチされている UIManager ゲームオブジェクトのインスペクターを確認します。
新しく SerializeField属性で宣言した btnJump 変数が表示されていれば問題ありません。
ヒエラルキーにある btnJump ゲームオブジェクトをドラッグアンドドロップしてアサインします。
UIManager ゲームオブジェクト インスペクター画像