簡體   English   中英

如何在Unity中像SyncVar一樣同步列表?

[英]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)

查看SyncVar文檔 ,這一行似乎很相關:

只能將簡單值標記為[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM