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.
SyncSortedSet must be declared readonly and initialized in the constructor.
Add a SyncSortedSet field to your NetworkBehaviour class. For example:
class Player : NetworkBehaviour
{
public readonly SyncSortedSet<string> skills = new SyncSortedSet<string>();
int skillPoints = 10;
[Command]
public void CmdLearnSkill(string skillName)
{
if (skillPoints > 1)
{
skillPoints--;
skills.Add(skillName);
}
}
}
You can also detect when a SyncSortedSet changes. This is useful for refreshing your character in the client or determining when you need to update your database. Subscribe to the Callback event typically during
Start
, OnClientStart
or OnServerStart
for that.Note that by the time you subscribe, the set will already be initialized, so you will not get a call for the initial data, only updates.
class Player : NetworkBehaviour
{
[SerializeField]
public readonly SyncSortedSet<string> buffs = new SyncSortedSet<string>();
// this will add the delegate on the client.
// Use OnStartServer instead if you want it on the server
public override void OnStartClient()
{
buffs.Callback += OnBuffsChanged;
// Process initial SyncSortedSet payload
foreach (string buff in buffs)
OnBuffsChanged(SyncSortedSet<string>.Operation.OP_ADD, buff);
}
// SyncSortedSet inherits from SyncSet so use SyncSet here
void OnBuffsChanged(SyncSortedSet<string>.Operation op, string buff)
{
switch (op)
{
case SyncSortedSet<string>.Operation.OP_ADD:
// Added a buff to the character
break;
case SyncSortedSet<string>.Operation.OP_REMOVE:
// Removed a buff from the character
break;
case SyncSortedSet<string>.Operation.OP_CLEAR:
// cleared all buffs from the character
break;
}
}
}
Last modified 1yr ago