Unity Atoms

Unity Atoms

  • Installation
  • Tutorials
  • Github

›Advanced

Introduction

  • Installation
  • Philosophy
  • Overview
  • Preferences
  • FAQ

Tutorials

    Basics

    • Creating Atoms
    • Variables
    • Events
    • Listeners
    • Actions
    • Mono Hooks

    Intermediate

    • Variable Pre Change Transformers
    • Variable Instancer
    • Event Instancer
    • Generator
    • Conditions

    Advanced

    • Advanced example
    • Usage with UniRX

Subpackages

  • Base Atoms
  • FSM
  • Input System
  • Mobile
  • Mono Hooks
  • Scene Mgmt
  • Tags
  • UI

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.

← Advanced exampleBase Atoms →
  • Simple example
  • Advanced example
Unity Atoms
Docs
InstallationTutorialsSubpackages
Community
DiscordGitter
More
BlogGitHubStar
Copyright © 2023 Adam Ramberg