SyncSortedSet must be declared readonly and initialized in the constructor.
Note that by the time you wire up the Action handlers, the sorted set will already be initialized, so they will not get invoked for the initial data, only updates.
using UnityEngine;
using Mirror;
public class SyncSortedSetExample : NetworkBehaviour
{
public readonly SyncSortedSet<string> namesSortedSet = new SyncSortedSet<string>();
public override void OnStartClient()
{
// Add handlers for SyncSortedSet Actions
namesSortedSet.OnAdd += OnItemAdded;
namesSortedSet.OnRemove += OnItemRemoved;
namesSortedSet.OnClear += OnSortedSetCleared;
// OnChange is a catch-all event that is called for any change
// to the SortedSet. It is called after the specific events above.
// Strongly recommended to use the specific events above instead!
namesSortedSet.OnChange += OnSortedSetChanged;
// SortedSet is populated before handlers are wired up so we
// need to manually invoke OnAdd for each element.
foreach (string value in namesSortedSet)
namesSortedSet.OnAdd.Invoke(value);
}
public override void OnStopClient()
{
// Remove handlers when client stops
namesSortedSet.OnAdd -= OnItemAdded;
namesSortedSet.OnRemove -= OnItemRemoved;
namesSortedSet.OnClear -= OnSortedSetCleared;
namesSortedSet.OnChange -= OnSortedSetChanged;
}
void OnItemAdded(string value)
{
Debug.Log($"Element added {value}");
}
void OnItemRemoved(string value)
{
Debug.Log($"Element removed {value}");
}
void OnSortedSetCleared()
{
// OnSortedSetCleared is called before the SortedSet is actually cleared
// so we can iterate the SortedSet to get the elements if needed.
foreach (string value in namesSortedSet)
Debug.Log($"Element cleared {value}");
}
// OnSortedSetChanged is a catch-all event that is called for any change
// to the SortedSet. It is called after the specific events above.
//
// NOTE: It's strongly recommended to use the specific events above instead!
//
// For OP_ADD, the value param is the NEW entry.
// For OP_REMOVE, the value param is the OLD entry.
// For OP_CLEAR, the value param is null / default.
void OnSortedSetChanged(SyncSortedSet<string>.Operation op, string value)
{
switch (op)
{
case SyncSortedSet<string>.Operation.OP_ADD:
// value is the new entry
Debug.Log($"Element added {value}");
break;
case SyncSortedSet<string>.Operation.OP_REMOVE:
// value is the old entry
Debug.Log($"Element removed {value}");
break;
case SyncSortedSet<string>.Operation.OP_CLEAR:
// value is null / default
// we can iterate the SortedSet to get the elements if needed.
foreach (string name in namesSortedSet)
Debug.Log($"Element cleared {name}");
break;
}
}
}