mirror of
https://github.com/unity-atoms/unity-atoms.git
synced 2025-01-22 16:18:24 -05:00
2.4 KiB
2.4 KiB
id | title | hide_title | sidebar_label |
---|---|---|---|
unirx | Usage with UniRX | true | Usage with UniRX |
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 Basic tutorial could be rewritten like this using UniRx:
using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class HealthBarUniRx : MonoBehaviour
{
[SerializeField]
private IntConstant _maxHealth = null;
[SerializeField]
private IntVariable _health = null;
void Awake()
{
_health.ObserveChange().Subscribe(health =>
{
GetComponent<Image>().fillAmount = 1.0f * health / _maxHealth.Value;
});
}
}
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;
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.