MRが楽しい

MRやVRについて学習したことを書き残す

基底クラスでReactivePropertyを使ったサブスクライブの動きを確認する

本日は C# と UniRx の調査枠です。
基底クラスでwith式を使ったインスタンス生成の動きを確認したので記事に残します。

前回記事

本記事では以下の記事で作成した基底クラスと継承クラスを利用します。
bluebirdofoz.hatenablog.com

基底クラスでReactivePropertyを使う

今回は基底クラスで ReactiveProperty を登録し、継承先のインスタンスで ReactiveProperty を更新・監視したときの動作を確認しました。

以下のような MonoBehaviour を継承したクラスを新たに作成し、ステータスの基底クラスでインスタンスを監視する ReactiveProperty を設定しました。
・ContentStatusBehave.cs

using System;
using Cysharp.Threading.Tasks;
using UniRx;
using UnityEngine;

public abstract class ContentStatusBehave : MonoBehaviour
{
    private ReactiveProperty<ContentStatus> _StatusProp = new();

    protected IReadOnlyReactiveProperty<ContentStatus> GetStatusProp => _StatusProp;
    protected void SetStatusProp(ContentStatus status) => _StatusProp.Value = status;

    protected async void Start()
    {
        await UniTask.Delay(TimeSpan.FromSeconds(10.0f));
        SetStatusProp(_StatusProp.Value.WithContentStatusType(ContentStatusType.Toy));
        Debug.Log("Update ContentStatus !");
    }
}

更にこのクラスを継承するクラスを作成し、それぞれのクラスで異なるステータスの継承クラスで ReactivePropterty を編集します。
・ArtifactContentStatusBehave.cs

using System;
using Cysharp.Threading.Tasks;
using UniRx;
using UnityEngine;

public abstract class ArtifactContentStatusBehave : ContentStatusBehave
{
    protected async void Start()
    {
        base.Start();
        
        await UniTask.Delay(TimeSpan.FromSeconds(20.0f));
        var status = (ArtifactContentStatus)(base.GetStatusProp.Value);
        SetStatusProp(status.WithArtifactContentStatusType(ArtifactContentStatusType.Hold));
        Debug.Log("Update ArtifactContentStatus !");
    }
}

・HolomonArtifactContentStatusBehave.cs

using System;
using Cysharp.Threading.Tasks;
using UniRx;
using UnityEngine;

public class HolomonArtifactContentStatusBehave : ArtifactContentStatusBehave
{
    [SerializeField] private HolomonArtifactContentStatus _checkStatus;
    
    protected async void Start()
    {
        base.Start();
        
        SetStatusProp(new HolomonArtifactContentStatus(
            HolomonArtifactContentStatusType.Like,
            ArtifactContentStatusType.Free,
            ContentStatusType.Food));

        GetStatusProp.Subscribe(state =>
        {
            _checkStatus = (HolomonArtifactContentStatus)state;
        });
        
        await UniTask.Delay(TimeSpan.FromSeconds(30.0f));
        var status = (HolomonArtifactContentStatus)(base.GetStatusProp.Value);
        SetStatusProp(status.WithHolomonArtifactContentStatusType(HolomonArtifactContentStatusType.Hate));
        Debug.Log("Update HolomonArtifactContentStatus !");
    }
}

動作確認

コンポーネントを適当なオブジェクトに設定して動作を確認しました。
結果として、継承先のインスタンスで ReactiveProperty を更新・監視した場合も問題なく継承先のインスタンスの更新・監視が行えることが確認できました。