前提
※UniRxを初めて日が浅いため、用語が間違っている可能性がございます。
UniRxでステートパターンを実現しようとしています。
public abstract class State{ private IObservable<T> _onStay<T>(IObservable<T> source){return source;} //中身省略 public IObservable<Unit> onStay }
onStay
は、キャラクターがその状態のときのみ発行されます
使用方法例
public class RunState : State void Start(){ onStay.Subscribe(_=>{ Debug.Log("running"); }); } }
実現したいこと
onStay
が発行されている間に、別の変数を変更を検知したいです。
例えば、走っている最中に空中フラグの変更を検知したいです。
色々やり方はあると思いますが、UniRxを活かした方法が分からず、悩んでいます。
public class RunState : State //空中にいるか private ReactiveProperty<bool> _isAir = new ReactiveProperty<bool>(false); public IReadOnlyReactiveProperty<bool> isAir { get { return _isAir; } } void Start(){ //毎フレーム空中にいるかチェック this.UpdateAsObservable() .Subscribe(x => { _isAir.Value = checkAir(); }); //このストリームを活用して、検知する方法が分からないです onStay.Subscribe(_=>{ Debug.Log("running"); }); //これだと、キャラクターがRun状態になっていない時も検知してしまう isAir .DistinctUntilChanged() .Subscribe(x => { //空中フラグが変更されました }); } }
試したこと
Stateクラスにフラグ(例isStateStay
)を持たせた上で、
isAir .DistinctUntilChanged() .Where(x => isStateStay == true) .Subscribe(x => { //空中フラグが変更されました });
なことをすれば実現できますが、onStay
があるのに、わざわざ変数を増やすのが気持ち悪いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/04 09:50