[Unity][R3]時間制限を実装する方法
はじめに
Unityで時間制限を実装する際、一般的にはUpdateメソッドを使うのが主流ですが、R3を用いることでより読みやすく分かりやすいコードを書くことができます。本記事では、R3を使った時間制限の実装方法について解説します。
R3で時間制限を再現
R3で時間制限を再現したコードが下記の通りになります。
using System;
using R3;
using UnityEngine;
using UnityEngine.UI;
public class GameTimer : MonoBehaviour
{
private ReactiveProperty<int> remainingTime = new ReactiveProperty<int>(10);
private ReactiveProperty<bool> isGamePlaying = new ReactiveProperty<bool>(false);
[SerializeField] private Button gameStartButton;
[SerializeField] private Text gameStateText;
[SerializeField] private Text remainingTimeText;
private void Start()
{
gameStartButton.onClick.AsObservable().Subscribe(_ => StartGame());
isGamePlaying.Where(x => x).Subscribe(_ => StartCountdown());
}
private void StartGame()
{
gameStateText.text = "ゲーム中です。";
remainingTimeText.text = remainingTime.Value.ToString();
isGamePlaying.Value = true;
}
private void StartCountdown()
{
Observable.Interval(TimeSpan.FromSeconds(1))
.TakeUntil(isGamePlaying.Where(x => !x))
.Subscribe(_ =>
{
remainingTime.Value--;
remainingTimeText.text = remainingTime.Value.ToString();
if (remainingTime.Value <= 0)
{
EndGame();
}
});
}
private void EndGame()
{
gameStateText.text = "ゲーム終了。";
isGamePlaying.Value = false;
}
}
コード解説
では、上記のコードを詳しく見ていきましょう。
StartGameメソッド
StartメソッドでgameStartButtonが押下されるとStartGameが呼び出されます。
gameStartButton.onClick.AsObservable().Subscribe(_ => StartGame());
StartGameメソッドでは、gameStateTextの変更、remainingTimeTextの初期化、isGamePlayingをTrueにすることでゲームのスタートを表現しています。
private void StartGame()
{
gameStateText.text = "ゲーム中です。";
remainingTimeText.text = remainingTime.Value.ToString();
isGamePlaying.Value = true;
}
次に、isGamePlayingがTrueに変化すると、StartCountdownメソッドが呼び出されます。
isGamePlaying.Where(x => x).Subscribe(_ => StartCountdown());
StartCountDownメソッド
StartCountdownメソッドでは、カウントダウンの処理とゲームオーバー処理を実装しています。Observable.Interval(TimeSpan.FromSeconds(1))
で1秒ごとにメッセージを送信し、TakeUntil(isGamePlaying.Where(x => !x))
でisGamePlayingがfalseになるまでカウントダウンを続けます。
Subscribeの中では、remaingTimeの値を減少させ、テキストを更新します。このSubscribeが毎秒呼び出され、remaingTimeが0になった時点でゲーム終了処理のEndGameを呼び出します。
private void StartCountdown()
{
Observable.Interval(TimeSpan.FromSeconds(1))
.TakeUntil(isGamePlaying.Where(x => !x))
.Subscribe(_ =>
{
remainingTime.Value--;
remainingTimeText.text = remainingTime.Value.ToString();
if (remainingTime.Value <= 0)
{
EndGame();
}
});
}
EndGameメソッド
ゲーム終了処理では、gameStateTextを変更し、isGamePlayingをFalseに設定することでゲームの終了を表現しています。
private void EndGame()
{
gameStateText.text = "ゲーム終了。";
isGamePlaying.Value = false;
}
時間制限の成果物
上記のコードを使うことで、簡単に時間制限機能を実装したUnityアプリを作ることができます。
さいごに
R3を使えば、シンプルかつ読みやすいコードで時間制限処理を実装できます。本記事が、R3を学ぶ方の学習の一助となれば幸いです。
Discussion