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.
usingUnityEngine;usingMirror;publicclassSyncSortedSetExample:NetworkBehaviour{publicreadonlySyncSortedSet<string> namesSortedSet =newSyncSortedSet<string>();publicoverridevoidOnStartClient() { // Add handlers for SyncSortedSet ActionsnamesSortedSet.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); }publicoverridevoidOnStopClient() { // Remove handlers when client stopsnamesSortedSet.OnAdd-= OnItemAdded;namesSortedSet.OnRemove-= OnItemRemoved;namesSortedSet.OnClear-= OnSortedSetCleared;namesSortedSet.OnChange-= OnSortedSetChanged; }voidOnItemAdded(string value) {Debug.Log($"Element added {value}"); }voidOnItemRemoved(string value) {Debug.Log($"Element removed {value}"); }voidOnSortedSetCleared() { // 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.voidOnSortedSetChanged(SyncSortedSet<string>.Operation op,string value) {switch (op) {caseSyncSortedSet<string>.Operation.OP_ADD: // value is the new entryDebug.Log($"Element added {value}");break;caseSyncSortedSet<string>.Operation.OP_REMOVE: // value is the old entryDebug.Log($"Element removed {value}");break;caseSyncSortedSet<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; } }}