class EnemyModel { public ReactiveProperty CurrentHp { get; private set; } public ReactiveProperty IsDed { get; private set; } public EnemyModel(int initialHp) { CurrentHp = new ReactiveProperty(initialHp); IsDead = CurrentHp.Select(x => x <= 0).ToReactiveProperty(); } } class ReactivePresenter : MonoBehaviour { // Inject these dependencies in the Inspector. public Button MyButton; public Toggle MyToggle; // State-change events from model. Enemy enemy = new Enemy(1000); void SubscribeToModel() { enemy.CurrentHp.SubscribeToText(MyText); enemy.IsDead.Where(isDead => isDead).Subscribe(HandleIsDeadChange); } void HandleIsDeadChange() { MyToggle.interactable = false; MyButton.interactable = false; } void SubscribeToUI() { MyButton.OnClickAsObservable().Subscribe(HandleButtonClick); MyToggle.OnValueChangedAsObservable().SubscribeToInteractable(MyButton); } void HandleButtonClick() { enemy.CurrentHp.Value -= 99; } void Start() { SubscribeToModel(); SubscribeToUI(); } }