本日は 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 !"); } }