👋

[Unity][R3]時間制限を実装する方法

2024/03/09に公開

はじめに

Unityで時間制限を実装する際、一般的にはUpdateメソッドを使うのが主流ですが、R3を用いることでより読みやすく分かりやすいコードを書くことができます。本記事では、R3を使った時間制限の実装方法について解説します。

R3で時間制限を再現

R3で時間制限を再現したコードが下記の通りになります。

GameTimer.cs
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が呼び出されます。

Start()
gameStartButton.onClick.AsObservable().Subscribe(_ => StartGame());

StartGameメソッドでは、gameStateTextの変更、remainingTimeTextの初期化、isGamePlayingをTrueにすることでゲームのスタートを表現しています。

StartGame()
private void StartGame()
{
    gameStateText.text = "ゲーム中です。";
    remainingTimeText.text = remainingTime.Value.ToString();
    isGamePlaying.Value = true;
}

次に、isGamePlayingがTrueに変化すると、StartCountdownメソッドが呼び出されます。

Start()
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を呼び出します。

StartCountdown()
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に設定することでゲームの終了を表現しています。

EndGame
private void EndGame()
{
    gameStateText.text = "ゲーム終了。";
    isGamePlaying.Value = false;
}

時間制限の成果物

上記のコードを使うことで、簡単に時間制限機能を実装したUnityアプリを作ることができます。
時間制限の成果物

さいごに

R3を使えば、シンプルかつ読みやすいコードで時間制限処理を実装できます。本記事が、R3を学ぶ方の学習の一助となれば幸いです。

Discussion