int, , , , etc.) can be serialized. Instead, you should create a field for each property on the object that you’d like to sync. Only primitives (----------------------, , , , etc.) can be serialized, so if you need to sync a specific kind of object like a TextMesh Pro object, you should create a field for each property on the object that you’d like to sync.int
1 is the unique identifier for the property, and true indicates that the property should be synced reliably.false for a boolean. However, in the Normcore model synchronization system, a property is only synced when its value changes. So if the initial value of is false, and you set it to false again, it won't be synced because the value didn't change.true in the . This way, when you set it to false, it will be considered a change and will be synced.true, and the property only updates if the new value is different from the current value.true. When a new instance of is created, the field is initialized to its default value. If this value is true, all GameObjects with the component will be enabled when they are created.false in the . This way, GameObjects will be disabled by default when they are created.false, so GameObjects will be disabled by default when they are created.floatfloatVector3Vector3stringstringTMP_TextSyncModel.csTMP_TextSyncModel.csTMP_TextSyncModel.csTMP_TextSyncModel.csTMP_TextSync.csTMP_TextSync.csTMP_TextSync.csTMP_TextSync.csTMP_TextSync.cs``
In this example, TMP_TextSyncModelTMP_TextSyncModelGetComponent<TMP_Text>()Awake()TMP_TextSyncTMP_TextSyncTMP_TextSyncTMP_TextSyncUpdateModel()Start()GameObjectSyncModel.csGameObjectSync.csGameObjectSyncModelGameObjectSyncModelGameObjectSyncModelGameObjectSyncModelgameObject.SetActive()meshRenderer.enabled = currentModel.enabled;MeshRendererSyncModelMeshRendererSyncModelMeshRendererSyncModelMeshRendererSyncModelMeshRendererSyncModel[RealtimeModel][RealtimeProperty]_enabled_enabled_enabled_enabled_enabled_enabled_enabled_enabled_enabled_enabled_enabled_enabledenabledenabledRealtimePropertyRealtimePropertyRealtimePropertyGameObjectSync[RealtimeModel]
public partial class TMP_TextSyncModel {
[RealtimeProperty(1, true)]
private string _text;
}using UnityEngine;
using Normal.Realtime;
using TMPro;
public class TMP_TextSync : RealtimeComponent<TMP_TextSyncModel> {
private TMP_Text _text;
private void Awake() {
_text = GetComponent<TMP_Text>();
}
protected override void OnRealtimeModelReplaced(TMP_TextSyncModel previousModel, TMP_TextSyncModel currentModel) {
if (previousModel != null) {
// Unregister from events
}
if (currentModel != null) {
// Register for events and update the TMP_Text object to match the current state of the model
_text.text = currentModel.text;
}
}
// Call this method to update the model when the TMP_Text object changes
public void UpdateModel() {
model.text = _text.text;
}
}[RealtimeModel]
public partial class GameObjectSyncModel {
[RealtimeProperty(1, true)]
private bool _enabled;
}using UnityEngine;
using Normal.Realtime;
public class GameObjectSync : RealtimeComponent<GameObjectSyncModel> {
protected override void OnRealtimeModelReplaced(GameObjectSyncModel previousModel, GameObjectSyncModel currentModel) {
if (previousModel != null) {
// Unregister from events
}
if (currentModel != null) {
// Register for events and update the GameObject to match the current state of the model
gameObject.SetActive(currentModel.enabled);
}
}
// Call this method to update the model when the GameObject's state changes
public void UpdateModel() {
model.enabled = gameObject.activeSelf;
}
}using UnityEngine;
using Normal.Realtime;
public class MeshRendererSync : RealtimeComponent<MeshRendererSyncModel> {
private MeshRenderer _meshRenderer;
private void Awake() {
_meshRenderer = GetComponent<MeshRenderer>();
}
protected override void OnRealtimeModelReplaced(MeshRendererSyncModel previousModel, MeshRendererSyncModel currentModel) {
if (previousModel != null) {
// Unregister from events
}
if (currentModel != null) {
// Register for events and update the Mesh Renderer to match the current state of the model
_meshRenderer.enabled = currentModel.enabled;
}
}
// Call this method to update the model when the Mesh Renderer's state changes
public void UpdateModel() {
model.enabled = _meshRenderer.enabled;
}
}using Normal.Realtime.Serialization;
[RealtimeModel]
public partial class MeshRendererSyncModel {
[RealtimeProperty(1, true)]
private bool _enabled;
}[RealtimeModel]
public partial class MeshRendererSyncModel {
private bool _enabled = true;
[RealtimeProperty(1, true)]
private bool enabled {
get { return _enabled; }
set {
if (_enabled == value) return;
_enabled = value;
}
}
}[RealtimeModel]
public partial class MeshRendererSyncModel {
[RealtimeProperty(1, true)]
private bool _enabled = true;
}[RealtimeModel]
public partial class GameObjectSyncModel {
[RealtimeProperty(1, true)]
private bool _enabled = false;
}