2016-08-30 3 views
1

Unity에서 SyncVar 속성을 사용할 때처럼 네트워크를 통해 List을 동기화하려고합니다. 그렇게 할 수 있습니까?Unity에서 SyncVar와 같은 List를 어떻게 동기화 할 수 있습니까?

우리는 우리가 변수에 대한 SyncVar 사용할 수 있습니다 NetworkBehaviour를 확장하는 클래스 쓸 때 : 그것은 List와 비슷한 뭔가를 할 수 있습니다 같은 방법으로

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

를? 이 작동하지 않습니다

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

희망을! 궁금한 점이 있으면 알려주세요.

관련 문제