英文原文:
hook 属性可用于指定当客户端上的 SyncVar 更改值时要调用的函数。
- Hook 方法必须有两个与 SyncVar 属性类型相同的参数。一个用于旧值,一个用于新值。
- 设置属性值后始终调用 Hook。你不需要自己设置。
- Hook 只对更改的值触发,在 Inspector 中更改值不会触发更新。
- 从版本 11.1.4(2020 年 3 月)及更高版本开始,挂钩可以是虚拟方法并在派生类中被覆盖。
下面是一个简单的例子,当每个玩家在服务器上生成时为他们分配随机颜色。所有客户都将看到所有玩家的正确颜色,即使他们稍后加入。
using UnityEngine;
using Mirror;
public class PlayerController : NetworkBehaviour
{
[SyncVar(hook = nameof(SetColor))]
Color playerColor = Color.black;
// 每次使用 GetComponent().material 时,Unity 都会克隆材质。
// 在这里缓存它并在 OnDestroy 中销毁它以防止内存泄漏。
Material cachedMaterial;
public override void OnStartServer()
{
base.OnStartServer();
playerColor = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
}
void SetColor(Color oldColor, Color newColor)
{
if (cachedMaterial == null)
cachedMaterial = GetComponent().material;
cachedMaterial.color = newColor;
}
void OnDestroy()
{
Destroy(cachedMaterial);
}
}
Hook 调用顺序
按照文件中定义同步变量的顺序调用挂钩。
public class MyBehaviour : NetworkBehaviour
{
[SyncVar]
int X;
[SyncVar(hook = nameof(Hook1))]
int Y;
[SyncVar(hook = nameof(Hook2))]
int Z;
}
如果 X、Y 和 Z 同时设置在服务器上,则调用顺序为:
- X value is set
- Y value is set
- Hook1 is called
- Z value is set
- Hook2 is called