[英]How can I synchronize a List like a SyncVar in Unity?
我SyncVar
在Unity中使用SyncVar
屬性一樣在網絡上同步List
。 那有可能嗎?
當我們編寫擴展NetworkBehaviour
的類時,它允許我們對變量使用SyncVar
:
[SyncVar(hook = "OnHealthChange")]
public int currentHealth = maxHealth;
用同樣的方式可以對List
做類似的事情嗎? 這不起作用:
[SyncVar(hook = "TimeDiff")]
public List<RoomPlayerInfo> listRoomPlayerInfo = new List<RoomPlayerInfo> ();
我嘗試了該行代碼,但在控制台中向我顯示了以下錯誤:
錯誤1:UNetWeaver錯誤:SyncVar [System.Collections.Generic.List`1 GameManager :: listRoomPlayerInfo]不能具有通用參數。 UnityEngine.Debug:LogError(Object)Unity.UNetWeaver.Log:Error(String)(在C:/buildslave/unity/build/Extensions/Networking/Weaver/Program.cs:20)Unity.UNetWeaver.NetworkBehaviourProcessor:ProcessSyncVars() (在C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetBehaviourProcessor.cs:1838)Unity.UNetWeaver.NetworkBehaviourProcessor:Process()(在C:/ buildslave / unity / build / Extensions / Networking / Weaver / UNetBehaviourProcessor .cs:53)Unity.UNetWeaver.Weaver:ProcessNetworkBehaviourType(TypeDefinition)(在C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetWeaver.cs:1064)Unity.UNetWeaver.Weaver:CheckNetworkBehaviour(TypeDefinition)(在C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetWeaver.cs:1549)Unity.UNetWeaver.Weaver:Weave(String,IEnumerable`1,IAssemblyResolver,String,String,String)(在C:/ buildslave / unity / build / Extensions / Networking / Weaver / UNetWeaver.cs:1658)Unity.UNetWeaver.Weaver:WeaveAssemblies(IEnumerable`1,IEnumerable`1,IAssemblyResolver,String,St 環形字符串)(位於C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetWeaver.cs:1748)Unity.UNetWeaver.Program:Process(String,String,String,String [],String [],IAssemblyResolver ,動作1,動作1)(位於C:/buildslave/unity/build/Extensions/Networking/Weaver/Program.cs:34)UnityEditor.Scripting.Serialization.Weaver:WeaveUnetFromEditor(String,String,String,String,布爾)
錯誤2:生成網絡代碼失敗。 UnityEditor.Scripting.Serialization.Weaver:WeaveUnetFromEditor(String,String,String,String,Boolean)
錯誤3:MissingReferenceException:類型為“對象”的對象已被破壞,但您仍在嘗試訪問它。 您的腳本應檢查其是否為null或不破壞該對象。 UnityEditor.Editor.IsEnabled()(在C:/buildslave/unity/build/Editor/Mono/Inspector/Editor.cs:589)UnityEditor.InspectorWindow.DrawEditor(UnityEditor.Editor編輯器,Int32 editorIndex,布爾值rebuildOptimizedGUIBlock,System.Boolean& showImportedObjectBarNext,UnityEngine.Rect和importedObjectBarRect)(在C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1151)UnityEditor.InspectorWindow.DrawEditors(UnityEditor.Editor []編輯器)(在C:/ buildslave / unity / build / Editor / Mono / Inspector / InspectorWindow.cs:1028)UnityEditor.InspectorWindow.OnGUI()(在C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:352)System.Reflection。 MonoMethod.Invoke(System.Object obj,BindingFlags invokeAttr,System.Reflection.Binder綁定器,System.Object []參數,System.Globalization.CultureInfo文化)(在/ Users / builduser / buildslave / mono / build / mcs / class / corlib /的System.Reflection / MonoMethod.cs:222)
只能將簡單值標記為[SyncVars]。 SyncVar變量的類型不能來自外部DLL或程序集。
因此,通用List
不能標記為SyncVar
,因為它不包含在Unity程序SyncVar
。 但是,還有其他選項-Unity包含幾種可用於跨網絡同步的集合類型 。
在您的情況下,聽起來好像需要SyncListStruct
集合,該集合可讓您同步用戶定義的struct
實例的列表。 (當然,這意味着RoomPlayerInfo
需要是一個struct
,這可能需要重寫一些代碼。)
例如,您的代碼可能如下所示:
// Define a new class which inherits from the generic SyncListStruct
public class RoomPlayerInfoList : SyncListStruct<RoomPlayerInfo> {}
// [...]
public class PlayerNetworkingScript : NetworkBehaviour
{
public RoomPlayerInfoList listRoomPlayerInfo = new RoomPlayerInfoList();
// If necessary, define and attach a callback to the collection for when it changes
private void RoomPlayerInfoListChanged(Operation op, int itemIndex) {
}
void Start() {
listRoomPlayerInfo.Callback = RoomPlayerInfoListChanged;
}
}
希望這可以幫助! 如果您有任何疑問,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.