Usage with UniRX
Variables and Events exposes methods that returns IObservables
. Atom Variables exposes ObserveChange
and ObserveChangeWithHistory
, while Atom Events exposes Observe
. This makes it possible to use Unity Atoms seamlessly together with UniRx.
Simple example
The HealthBar.cs
script from the Variables tutorial could be rewritten like this using UniRx:
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class HealthBarUniRx : MonoBehaviour
{
[SerializeField]
private IntVariable _health = null;
void Awake()
{
_health.ObserveChange().Subscribe(health =>
{
GetComponent<Image>().fillAmount = 1.0f * health / _health.InitialValue;
});
}
}
Advanced example
Here is another example of a PlayerMove.cs
script that is a little bit more advanced. Horizontal and vertical input is only getting a value from the Input
class as long as the UI state is in the state of _uiStatePlaying
.
NOTE: This example is also using Marvelous for its Fuse
method.
using System;
using UnityEngine;
using Marvelous;
using UniRx;
using UnityAtoms.BaseAtoms;
public class PlayerMoveUniRx : MonoBehaviour
{
[SerializeField]
private StringVariable _uiState;
[SerializeField]
private StringConstant _uiStatePlaying;
private void Awake()
{
float _horizontal = 0f, _vertical = 0f;
string HORIZONTAL = "Horizontal", VERTICAL = "Vertical";
Observable.EveryUpdate().Fuse<long, string>(
_uiState.ObserveChange(),
initialValue2: _uiState.Value
).Subscribe(t =>
{
var (_, state) = t;
_horizontal = state == _uiStatePlaying.Value ? Input.GetAxis(HORIZONTAL) : 0f;
_vertical = state == _uiStatePlaying.Value ? Input.GetAxis(VERTICAL) : 0f;
});
Observable.EveryFixedUpdate().Subscribe(t =>
{
GetComponent<Rigidbody2D>().velocity = new Vector2(_horizontal, _vertical) * 5f;
});
}
}
Using Unity Atoms together with UniRx and Marvelous (for its Fuse
) makes your scripts really data driven.