77 lines
2.6 KiB
C#
77 lines
2.6 KiB
C#
// for uGUI(from 4.6)
|
|
#if !(UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_4 || UNITY_4_5)
|
|
|
|
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace UniRx.Examples
|
|
{
|
|
public class Sample12_ReactiveProperty : MonoBehaviour
|
|
{
|
|
// Open Sample12Scene. Set from canvas
|
|
public Button MyButton;
|
|
public Toggle MyToggle;
|
|
public InputField MyInput;
|
|
public Text MyText;
|
|
public Slider MySlider;
|
|
|
|
// You can monitor/modifie in inspector by SpecializedReactiveProperty
|
|
public IntReactiveProperty IntRxProp = new IntReactiveProperty();
|
|
|
|
Enemy enemy = new Enemy(1000);
|
|
|
|
void Start()
|
|
{
|
|
// UnityEvent as Observable
|
|
// (shortcut, MyButton.OnClickAsObservable())
|
|
MyButton.onClick.AsObservable().Subscribe(_ => enemy.CurrentHp.Value -= 99);
|
|
|
|
// Toggle, Input etc as Observable(OnValueChangedAsObservable is helper for provide isOn value on subscribe)
|
|
// SubscribeToInteractable is UniRx.UI Extension Method, same as .interactable = x)
|
|
MyToggle.OnValueChangedAsObservable().SubscribeToInteractable(MyButton);
|
|
|
|
// input shows delay after 1 second
|
|
#if !(UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2)
|
|
MyInput.OnValueChangedAsObservable()
|
|
#else
|
|
MyInput.OnValueChangeAsObservable()
|
|
#endif
|
|
.Where(x => x != null)
|
|
.Delay(TimeSpan.FromSeconds(1))
|
|
.SubscribeToText(MyText); // SubscribeToText is UniRx.UI Extension Method
|
|
|
|
// converting for human visibility
|
|
MySlider.OnValueChangedAsObservable()
|
|
.SubscribeToText(MyText, x => Math.Round(x, 2).ToString());
|
|
|
|
// from RxProp, CurrentHp changing(Button Click) is observable
|
|
enemy.CurrentHp.SubscribeToText(MyText);
|
|
enemy.IsDead.Where(isDead => isDead == true)
|
|
.Subscribe(_ =>
|
|
{
|
|
MyToggle.interactable = MyButton.interactable = false;
|
|
});
|
|
|
|
// initial text:)
|
|
IntRxProp.SubscribeToText(MyText);
|
|
}
|
|
}
|
|
|
|
// Reactive Notification Model
|
|
public class Enemy
|
|
{
|
|
public IReactiveProperty<long> CurrentHp { get; private set; }
|
|
|
|
public IReadOnlyReactiveProperty<bool> IsDead { get; private set; }
|
|
|
|
public Enemy(int initialHp)
|
|
{
|
|
// Declarative Property
|
|
CurrentHp = new ReactiveProperty<long>(initialHp);
|
|
IsDead = CurrentHp.Select(x => x <= 0).ToReactiveProperty();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif |