SyncSortedSet

SyncSortedSet are sets similar to C# SortedSet that synchronize their contents from the server to the clients.

Unlike SyncHashSets, all elements in a SyncSortedSet are sorted when they are inserted. Please note this has some performance implications.

A SyncSortedSet can contain any supported mirror type

Usage

SyncSortedSet must be declared readonly and initialized in the constructor.

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;
        }
    }
}

Last updated