Mirror框架中SyncVar的hook方法是否支持传入额外整型参数?
答案
直接实现不可行,原因如下:
SyncVar的hook方法签名是引擎预定义死的,和你标记的SyncVar变量类型严格绑定:只能接收两个和SyncVar变量同类型的参数,顺序为「旧值、新值」,你额外加int类型的index参数会导致引擎运行时找不到匹配的hook方法,直接抛出异常。
你可以用以下两种方案实现同等需求:
方案1:新增单独的SyncVar存储整型值
如果这个整型值和玩家名称是可以分开同步的属性,直接新增一个int类型的SyncVar即可:
// 原玩家名称SyncVar [SyncVar(hook = nameof(CallUpdatePlayerName))] public string playerName; // 新增存储index的SyncVar [SyncVar(hook = nameof(CallUpdateIndex))] public int playerIndex; [Command] public void SetPlayerName(string nameValue, int indexValue) { // 注意:Command是服务端执行的,不需要判断isLocalPlayer playerName = nameValue; playerIndex = indexValue; } // 名称变化的hook private void CallUpdatePlayerName(string oldPlayerName, string newPlayerName) { // 处理名称更新逻辑 } // index变化的hook private void CallUpdateIndex(int oldIndex, int newIndex) { // 处理index更新逻辑 }
方案2:封装为自定义结构体同步
如果两个值必须绑定在一起同步,可以把字符串和int封装成可序列化的自定义结构体,作为SyncVar的类型:
[Serializable] public struct PlayerNameInfo { public string Name; public int Index; } [SyncVar(hook = nameof(CallUpdatePlayerName))] public PlayerNameInfo playerNameInfo; [Command] public void SetPlayerName(string nameValue, int indexValue) { playerNameInfo = new PlayerNameInfo { Name = nameValue, Index = indexValue }; } private void CallUpdatePlayerName(PlayerNameInfo oldInfo, PlayerNameInfo newInfo) { // 这里可以同时拿到新的名称和index值 string newName = newInfo.Name; int newIndex = newInfo.Index; }
现有代码补充说明
你当前写的Command方法里的isLocalPlayer判断是多余的:标记了[Command]的方法只会在服务端运行,服务端上只有发起请求的玩家对象isLocalPlayer才会为真,直接删除这个判断即可,SyncVar会自动把服务端的值同步到所有客户端。
内容的提问来源于stack exchange,提问作者Newboy11
相关产品推荐
相关产品推荐

