Notifying State Changes
It is often useful to know when a synchronized variable has changed its value. It can be easily achieved using the OnValueSyncedAttribute. This attribute lets you define a method that will be called each time a value of a synced member (field or property) changes in the non-simulated version of an entity.
Let's start with a simple example:
Whenever the value of the Health field gets updated (synced with its simulated version) the UpdateHealthLabel will be called automatically, changing the health label text and printing a log with a health difference.
This comes in handy in projects that use authoritative . The Client code can easily react to changes in the Player entity state introduced by the Simulator, updating the visual representation (which the Simulator doesn't need).
The OnValueSyncedAttribute requires using .
The OnValueSynced feature can be used only on members of user-defined types, that is, there's no way to be notified about a change in the value of a Unity type member, like transform.position. This might however change in the future, so stay tuned!
using Coherence.Toolkit;
using UnityEngine;
using UnityEngine.UI;
public class Player : MonoBehaviour
{
[OnValueSynced(nameof(UpdateHealthLabel))]
public float Health;
public Text HealthLabel;
public void UpdateHealthLabel(float oldHealth, float newHealth)
{
HealthLabel.text = newHealth.ToString();
Debug.Log($"Player HP changed by: {newHealth - oldHealth}");
}
}