0
点赞
收藏
分享

微信扫一扫

[Unity Mirror] SyncVar Hooks

水墨_青花 2022-03-22 阅读 91

英文原文:

  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 同时设置在服务器上,则调用顺序为:

  1. X value is set
  2. Y value is set
  3. Hook1 is called
  4. Z value is set
  5. Hook2 is called
举报

相关推荐

0 条评论