UIManagerでは、キャラ変更ボタンの管理を行います。ボタンを押した際に、最後に作成するChangeCharactersクラスのメソッドを呼び出して
キャラ変更へとつなげる役割を持っています。
キャラ変更用の2つのボタンについては、いずれかを選択した時点で、キャラ変更が終了するまでの間、両方のボタンを押せないように制御を入れています。
「キャラ変更が終了するまで」という状態は、bool型などの変数を用意して管理することもできますが、今回はOnClickChangeCharaメソッドをコルーチン化し、
キャラ変更を行う処理(ChangeCharactersクラスのChangeCharaメソッド)の呼び出しを yield return 付のStartCoroutine処理にすることによって、この処理が終了するまで
下の処理にはいかないように制御しています。
またボタンによって呼び出されるOnClickChangeCharaメソッドはコルーチンメソッドであるため、Startメソッド内で、それぞれのボタンにメソッドと引数を登録しています。
(UnityEditorのButtonコンポーネントにあるOnClickイベントは使わずに、スクリプトから呼び出すメソッドを設定します)
UIManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
(省略)
public Button btnChnageCharaPrev; // ☆ 追加。キャラ変更の戻る用ボタン
public Button btnChangeCharaNext; // ☆ 追加。キャラ変更の進む用ボタン
public ChangeCharacters changeCharacters; // ☆ 追加。キャラ変更用のクラス
private bool isClickable; // ☆ 追加。ボタンの重複クリック防止用
void Start() {
playerHpbar.value = 1.0f;
///* 以下を追加 *///
// キャラ変更ボタンにメソッドを登録
btnChnageCharaPrev.onClick.AddListener(()=> StartCoroutine(OnClickPlayerChange(-1)));
btnChangeCharaNext.onClick.AddListener(()=> StartCoroutine(OnClickPlayerChange(1)));
// キャラ変更ボタンを押せるようにする
InactivateCharaChangeButtons(true);
///* ここまで追加 *///
}
(省略)
///* 以下を追加 *///
/// <summary>
/// キャラ変更ボタンを押した際の処理(引数の値は違うが、どちらのボタンもここの処理になる)
/// </summary>
/// <param name="amount">キャラの番号を進めたり、戻したりする</param>
/// <returns></returns>
private IEnumerator OnClickPlayerChange(int amount) {
// キャラ変更中の場合には処理を行わない
if (!isClickable) {
yield break;
}
// キャラを変更するため、キャラ変更のボタンを押しても処理を行えなくする
InactivateCharaChangeButtons(false);
// ChangeCharactersクラスに用意したキャラ変更処理を呼び出す(yield return 付の StartCoroutine処理は、このChangeCharaメソッドの処理が終わるまで、下の処理にはいかないことを補償する)
yield return StartCoroutine(changeCharacters.ChangeChara(amount));
// 再度ボタンを押したときに、キャラ変更処理ができるようにする
InactivateCharaChangeButtons(true);
}
/// <summary>
/// ボタンの連打防止処理
/// </summary>
/// <param name="isSwitch"></param>
private void InactivateCharaChangeButtons(bool isSwitch) {
// ボタンを押せるか、押せないか制御
isClickable = isSwitch;
// ボタンの表示の活性化/非活性化
btnChnageCharaPrev.interactable = isSwitch;
btnChangeCharaNext.interactable = isSwitch;
}
///* ここまで追加 *///
}
修正が完了したら、UIManagerゲームオブジェクトのインスペクターを確認します。
新しく変数が3つ追加されていますので、Btn〜の方には、【1】で用意した各ボタンをヒエラルキーからドラッグアンドドロップしてアサインします。(同じ名前になるようにアサインしましょう)
もう1つのChangeCharactersの方はまだ作成していませんので、こちらは作成してからアサインしてください。