前提
UnityでタイマーをUniRxを利用し作成することで終了後の処理が簡単に書けるのではないかと思いましたが、思いのほかうまくいかないのでこちらに質問させて頂きました。
実現したいこと
- UniRxを利用したタイマーを制作
- 終了時に好きな動作を追加できるようにする
- 好きなタイミングで好きなだけ呼べる形にしたい
該当のソースコード
TimerScript
1 public class TimeSet : MonoBehaviour 2 { 3 [SerializeField] public int reserveTime; 4 5 6 public IConnectableObservable<int> _connectableObservable; 7 8 public IObservable<int> ReserveCountTime => _connectableObservable.AsObservable(); 9 10 11 private void Awake() 12 { 13 _connectableObservable = CreateCountDownObservable(reserveTime).Publish(); 14 } 15 16 private void Start() 17 { 18 _connectableObservable.Connect(); 19 } 20 21 /// <summary> 22 /// タイマー 23 /// </summary> 24 /// <param name="countTime">計測時間</param> 25 /// <returns></returns> 26 private static IObservable<int> CreateCountDownObservable(int countTime) 27 { 28 return Observable 29 .Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1)) 30 .Select(x => (int)(countTime - x)) 31 .TakeWhile(x => x > 0); 32 }
public class WaveManager : MonoBehaviour { [SerializeField] private MainView mainView; [SerializeField] private TimeSet timeSet; readonly ISubject<Unit> _onSomethingRequested = new Subject<Unit>(); private void Awake() {// `Subscribe`初期化位置以外に書かない方がよいとのことなのでこちらにまとめました。 _onSomethingRequested .SelectMany((IEnumerator)timeSet.ReserveCountTime.First(time => time <= 0) .Subscribe(_ => mainView.WeaponBarHide()).AddTo(this)); } public void ReserveCountTimeStart() { Debug.Log("CountStart"); //タイマー始動 timeSet._connectableObservable.Connect(); //タイマー終了後の処理を追加 _onSomethingRequested.OnNext(Unit.Default); } }
###エラー文
InvalidCastException: Specified cast is not valid.
InvalidOperationException: sequence is empty System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at <695d1cc93cca45069c528c15c9fdd749>:0)
試したこと
timeSet._connectableObservable.Connect();
こちらからタイマーを始動させ
_onSomethingRequested.OnNext(Unit.Default);
こちらからタイマー終了後の処理を呼び出しています。
UniRxでカウントダウンタイマーを作る
こちらの記事を参考にタイマーを制作しました。
リアクティブスパゲティを避けるための2つの原則
こちらの記事を参考にタイマー終了後の処理をできるようにさせようと思いました。
補足情報(FW/ツールのバージョンなど)
Unity 2020.3.20f1
UniRx Ver 7.1.0

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。