Mirror/doc/Guides/Sync/SyncVarHook.md

48 lines
1.9 KiB
Markdown
Raw Normal View History

2019-01-07 17:00:09 +00:00
# SyncVar Hook
2019-12-16 21:51:53 +00:00
[![SyncVar hook video tutorial](../../images/video_tutorial.png)](https://www.youtube.com/watch?v=T7AoozedYfI&list=PLkx8oFug638oBYF5EOwsSS-gOVBXj1dkP&index=5)
2020-03-24 12:39:08 +00:00
The hook attribute can be used to specify a function to be called when the SyncVar changes value on the client.
- The Hook method must have two parameters of the same type as the SyncVar property. One for the old value, one for the new value.
- The Hook is always called after the property value is set. You don't need to set it yourself.
2020-02-23 07:48:21 +00:00
- The Hook only fires for changed values, and changing a value in the inspector will not trigger an update.
2020-03-24 12:39:08 +00:00
- As of version 11.1.4 (March 2020) and later, hooks can be virtual methods and overriden in a derived class.
2019-06-25 05:41:22 +00:00
Below is a simple example of assigning a random color to each player when they're spawned on the server. All clients will see all players in the correct colors, even if they join later.
2020-03-21 16:47:05 +00:00
> Note: The signature for hook methods was changed in version 9.0 (Feb 2020) to having 2 parameters (old and new values). If you're on an older version, hook methods just have one parameter (new value).
2020-01-28 07:48:21 +00:00
2019-07-07 05:52:37 +00:00
```cs
2019-01-07 17:00:09 +00:00
using UnityEngine;
using Mirror;
2019-01-07 17:00:09 +00:00
2019-06-25 05:41:22 +00:00
public class PlayerController : NetworkBehaviour
2019-01-07 17:00:09 +00:00
{
2019-06-25 05:41:22 +00:00
[SyncVar(hook = nameof(SetColor))]
2019-07-20 00:00:49 +00:00
Color playerColor = Color.black;
2019-01-07 17:00:09 +00:00
2019-07-20 00:00:49 +00:00
// Unity makes a clone of the Material every time GetComponent<Renderer>().material is used.
// Cache it here and Destroy it in OnDestroy to prevent a memory leak.
Material cachedMaterial;
public override void OnStartServer()
{
base.OnStartServer();
playerColor = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
}
2019-06-25 05:41:22 +00:00
void SetColor(Color oldColor, Color newColor)
2019-01-07 17:00:09 +00:00
{
2019-07-20 00:00:49 +00:00
if (cachedMaterial == null)
cachedMaterial = GetComponent<Renderer>().material;
2019-06-25 05:41:22 +00:00
cachedMaterial.color = newColor;
2019-01-07 17:00:09 +00:00
}
2019-07-20 00:00:49 +00:00
void OnDestroy()
2019-01-07 17:00:09 +00:00
{
2019-07-20 00:00:49 +00:00
Destroy(cachedMaterial);
2019-01-07 17:00:09 +00:00
}
}
```