新しく Button コンポーネント用の変数を用意し、この変数が押下されたかどうかを購読(監視)します。
押下された場合、特定の条件を満たしている場合のみ、MainGame クラスにあるゲーム情報のリセットを行うメソッドを実行するようにセットしておきます。
またゲームのリスタートの際には、再度ボタンを押せない状態にする処理を追加しています。
どちらの処理も TODO の部分を実装しています。
どのような処理が、どのようなタイミングで実装されているのかを理解しながら書いていくように心がけてください。
なお今回は Presenter クラスに Button の変数宣言を追加していますが、こちらは別途 Model 用のクラスを作成しても構いません。
Presenter.cs
<= クリックすると開きます。
using UnityEngine;
using UnityEngine.UI;
using UniRx;
using System;
public class Presenter : MonoBehaviour
{
[SerializeField]
private MainGame mainGame;
[SerializeField]
private Result_View[] resultViews;
[SerializeField]
private Result_Model[] resultModels;
[SerializeField]
private Info_View infoView;
[SerializeField]
private Info_Model infoMode;
////* 新しい変数の宣言を1つ追加 *////
[SerializeField]
private Button btnRestart; // この宣言自体を新しい Model クラスを作成してそちらに持たせておき、ここでは、その Model クラスを宣言するようにする方法もある
////* ここまで *////
void Start()
{
// TODO ゲームの初期設定を行う。後程修正し、Grid_View の情報を配列で受け取る
mainGame.InitialSettings()
////* TODO の実装 *////
// リスタートボタンの設定
btnRestart.OnClickAsObservable()
.ThrottleFirst(TimeSpan.FromSeconds(1.0f))
.Subscribe(_ => mainGame.ResetGameParameters()).AddTo(gameObject);
////* ここまで *////
// InfoView の設定 Info_Model 内の ReactiveProperty である InfoMessage の購読を行い、値が更新された際の処理の設定を行う
infoMode.InfoMessage.Subscribe(x => infoView.UpdateDispayInfo(x)).AddTo(gameObject);
// ゲーム終了状態の監視
mainGame.IsGameUp.Subscribe(x => {
////* TODO の実装 *////
// リスタート用のボタンを押せる状態にする
btnRestart.interactable = x;
////* ここまで *////
PrepareResult(mainGame.winner);
}).AddTo(gameObject);
// ResultView と ResultModel の設定
SetUpResult();
/// <summary>
/// ResultView と ResultModel の設定するローカル関数
/// </summary>
void SetUpResult() {
// Model => View
// Result_Model の RectiveDictionary を購読して、Result_View を更新
for (int i = 0; i < resultViews.Length; i++) {
// Subscribe の値が Length に固定されてしまい、登録は成功するが、更新時に失敗するので、1回値を受ける
int a = i;
// Result_Model の RectiveProperty を購読し、加算結果に合わせて画面を更新
resultModels[a].WinCount.Subscribe(x => resultViews[a].UpdateDisplayWincount(x)).AddTo(gameObject);
// GridOwnerType の設定と勝利数の初期化
resultModels[a].SetUpResultModel((GridOwnerType)a + 1);
Debug.Log("勝利数 購読開始 : " + resultModels[a].CurrentGridOwnerType.ToString());
// Result_Model の RectiveProperty を購読し、勝敗結果に合わせて画面を更新
resultModels[a].ResultMessage.Subscribe(x => resultViews[a].UpdateDisplayResultGame(x)).AddTo(gameObject);
// 勝敗表示の初期化
resultModels[a].InitResultMessage();
Debug.Log("勝敗結果 購読開始 : " + resultModels[a].CurrentGridOwnerType.ToString());
}
}
// 勝利数の初期化、ゲーム情報の初期化
mainGame.ResetGameParameters();
// TODO Grid の購読を行う
}
/// <summary>
/// リザルトの準備
/// </summary>
/// <param name="winner"></param>
public void PrepareResult(GridOwnerType winner) {
// 結果表示
for (int i = 0; i < resultModels.Length; i++) {
resultModels[i].ShowResult(winner);
}
}
}