using System; using UniRx; using UniRx.Triggers; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; public class Variable : MonoBehaviour { [SerializeField, Tooltip("計算機に変数追加ボタン")] private Button btnVariable; [SerializeField, Tooltip("変数名表示テキスト")] private Text textVariableName; [SerializeField, Tooltip("変数の値表示テキスト")] private Text textVriableValue; public ReactiveProperty<string> variableName { get; set; } = new(); public ReactiveProperty<int> VariableValue { get; set; } = new(); void Start() { // デバッグ用 GenerateSetup("Sample", 0); } public void GenerateSetup(string viewText, int index, UnityAction<int> buttonActionAddCalcView = null) { btnVariable.OnClickAsObservable() .ThrottleFirst(System.TimeSpan.FromSeconds(0.5f)) .Subscribe(_ => { buttonActionAddCalcView?.Invoke(index); }) .AddTo(this); // UniRx を利用したマウスの長押し処理 // OnPointerDownをtrueに変換 btnVariable.OnPointerDownAsObservable().Select(_ => true) // OnPointerUpをfalseに変換 // OnPointerDownとOnPointerUpを1つのストリームに合成 // この後には押した時にtrueが、離した時にfalseが流れるようになる .Merge(btnVariable.OnPointerUpAsObservable().Select(_ => false)) // 1秒間新しい値が来なかったら最後に来た値を流す .Throttle(TimeSpan.FromSeconds(0.5f)) // trueだけを流す .Where(b => b) // このboolは利用しない値なので、通知発行のみを行っていることを明確にするため、Unitに変換する .AsUnitObservable() // 上記の処理により、最終的にマウスの長押しを購読する .Subscribe(_ => { // TODO 長押し時の処理を実装 }) .AddTo(this); variableName .Subscribe(message => { SetVariableName(message); }) .AddTo(this); variableName.Value = viewText; VariableValue.Subscribe(x => { SetVariableValue(x.ToString()); }) .AddTo(this); VariableValue.Value = 0; } public void SetVariableName(string value) { textVariableName.text = value; } public void SetVariableValue(string value) { textVriableValue.text = value; } }
// UniRx を利用したマウスの長押し処理 // OnPointerDownをtrueに変換 btnVariable.OnPointerDownAsObservable().Select(_ => true) // OnPointerUpをfalseに変換 // OnPointerDownとOnPointerUpを1つのストリームに合成 // この後には押した時にtrueが、離した時にfalseが流れるようになる .Merge(btnVariable.OnPointerUpAsObservable().Select(_ => false)) // 1秒間新しい値が来なかったら最後に来た値を流す .Throttle(TimeSpan.FromSeconds(0.5f)) // trueだけを流す .Where(b => b) // このboolは利用しない値なので、通知発行のみを行っていることを明確にするため、Unitに変換する .AsUnitObservable() // 上記の処理により、最終的にマウスの長押しを購読する .Subscribe(_ => { // TODO 長押し時の処理を実装 }) .AddTo(this);