2016-08-30 11 views
1

UnityでSyncVar属性を使用した場合と同様に、ネットワーク上でListを同期させたいです。それは可能ですか?UnityでSyncVarのようなリストを同期するにはどうしたらいいですか?

我々はNetworkBehaviourを拡張するクラスを書くとき、それは私たちが変数にSyncVarを使用することができます。同じように

[SyncVar(hook = "OnHealthChange")] 
public int currentHealth = maxHealth; 

Listと似た何かをすることは可能ですか?これは動作しません:

[SyncVar(hook = "TimeDiff")] 
public List<RoomPlayerInfo> listRoomPlayerInfo = new List<RoomPlayerInfo>(); 

私はコードの行をしようとしたが、それは私に、コンソールに次のエラーを示した:

Error 1: UNetWeaver error: SyncVar [System.Collections.Generic.List`1 GameManager::listRoomPlayerInfo] cannot have generic parameters. UnityEngine.Debug:LogError(Object) Unity.UNetWeaver.Log:Error(String) (at C:/buildslave/unity/build/Extensions/Networking/Weaver/Program.cs:20) Unity.UNetWeaver.NetworkBehaviourProcessor:ProcessSyncVars() (at C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetBehaviourProcessor.cs:1838) Unity.UNetWeaver.NetworkBehaviourProcessor:Process() (at C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetBehaviourProcessor.cs:53) Unity.UNetWeaver.Weaver:ProcessNetworkBehaviourType(TypeDefinition) (at C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetWeaver.cs:1064) Unity.UNetWeaver.Weaver:CheckNetworkBehaviour(TypeDefinition) (at C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetWeaver.cs:1549) Unity.UNetWeaver.Weaver:Weave(String, IEnumerable`1, IAssemblyResolver, String, String, String) (at C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetWeaver.cs:1658) Unity.UNetWeaver.Weaver:WeaveAssemblies(IEnumerable`1, IEnumerable`1, IAssemblyResolver, String, String, String) (at C:/buildslave/unity/build/Extensions/Networking/Weaver/UNetWeaver.cs:1748) Unity.UNetWeaver.Program:Process(String, String, String, String[], String[], IAssemblyResolver, Action`1, Action`1) (at C:/buildslave/unity/build/Extensions/Networking/Weaver/Program.cs:34) UnityEditor.Scripting.Serialization.Weaver:WeaveUnetFromEditor(String, String, String, String, Boolean)

Error2: Failure generating network code. UnityEditor.Scripting.Serialization.Weaver:WeaveUnetFromEditor(String, String, String, String, Boolean)

Error3: MissingReferenceException: The object of type 'Object' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEditor.Editor.IsEnabled() (at C:/buildslave/unity/build/Editor/Mono/Inspector/Editor.cs:589) UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor editor, Int32 editorIndex, Boolean rebuildOptimizedGUIBlock, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1151) UnityEditor.InspectorWindow.DrawEditors (UnityEditor.Editor[] editors) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1028) UnityEditor.InspectorWindow.OnGUI() (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:352) System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)

答えて

1

documentation for SyncVarを見てみると、このラインは非常に関連すると思われる:

Only simple values can be marked as [SyncVars]. The type of the SyncVar variable cannot be from an external DLL or assembly.

したがって、汎用のListはUnityアセンブリ内に含まれていないため、SyncVarとしてマークすることはできません。しかし、他にもオプションがあります。Unityには、ネットワーク全体の同期に使用できるseveral collection typesが含まれています。

SyncListStructコレクションが必要なように聞こえる場合は、ユーザ定義のstructインスタンスのリストを同期させることができます。 (もちろん、それは、コードの書き換えのビットを伴うことがstruct、である必要がRoomPlayerInfoを意味します。)

例えば、あなたのコードは次のようになります。このことができます

// 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; 
    } 
} 

希望を!ご質問がある場合はお知らせください。

関連する問題