2014-12-04 58 views
1

我製作了離線Waypoints網絡生成器,它能夠在編輯器中構建航點網絡,以便在編輯過程中移動或移除航點。不過,我需要一些方法來從不同的對象在遊戲模式中引用航點網絡,我真的很喜歡單身方法。我的想法是:Unity:在編輯器和播放器之間保留靜態對象/數據

我有3個腳本:WNNetworkWNNetworkObjectWNNetworkData

WNNetworkData是簡單的ScriptableObject,它包含計算的數據。

[System.Serializable] 
public class WNNetworkData : ScriptableObject { 

    // Data of waypoints network 
    public List<WNWaypoint>  waypoints = new List<WNWaypoint>(); 
    public WNKDTree    tree  = null; 

} 

WNNetworkObject是附加到遊戲物體MonoBehaviour腳本,它是使用更新,重新生成或刪除航點網絡。

public class WNNetworkObject : MonoBehaviour { 

    #region Public Variables 

    // Properties of waypoints 
    public float size     = 1f; 
    public Color color     = Color.cyan; 
    public Color colorSelected   = Color.white; 
    public Color colorLine    = Color.white; 
    public float lineWidth    = 0.5f; 
    public WNWaypoint.GizmosType type = WNWaypoint.GizmosType.CUBE; 

    // Parameters for network generation 
    public float maxClusterRadius   = 2; 
    public float neighborsThreshold   = 10f; 
    public bool doNeighborsSimplification = true; 

    // Others 
    // public GameObject queryTarget; 

    #endregion 

    #region Life-cycle 

    void Awake() { 
     DontDestroyOnLoad (this.gameObject); 
    } 

    void Start() { 
     Debug.Log (WNNetwork.data); 
    } 

    #endregion 
... 
} 

這是它是如何看在督察編輯:

WNNetwork Inspector editor

的最後一個腳本是WNNetwork,這基本上是一個包裝類持有的靜態參考WNNetworkData和WNNetworkObject,這樣我就可以輕鬆訪問兩者。

public class WNNetwork { 

    public static WNNetworkObject root; 
    public static WNNetworkData data; 

... 
} 

我也創建了EditorScript,所以我可以從Menu創建所有對象,這裏是創建部分。

public class CreateWaypointsNetwork { 

    [MenuItem("GameObject/Create Other/Waypoints Network")] 
    public static void Create() 
    { 
     WNNetworkData data = ScriptableObject.CreateInstance <WNNetworkData>(); 
     GameObject  go = new GameObject ("WaypointsNetwork", new System.Type[]{typeof(WNNetworkObject)}); 
     WNNetworkObject root = (WNNetworkObject) go.GetComponent<WNNetworkObject>(); 

     WNNetwork.data = data; 
     WNNetwork.root = root; 

     AssetDatabase.CreateAsset (data, "Assets/WaypointsNetworkData"); 
     AssetDatabase.SaveAssets (); 

     EditorUtility.FocusProjectWindow(); 
     Selection.activeObject = go; 
    } 

} 

的事情是,當我創建的航點網絡一切都在編輯工作中,每個對象似乎是創建成功,我可以編輯的航點。但只要我點擊播放按鈕,WNNetwork重置和所有靜態變量等於null。網絡本身似乎被保留下來,因爲每個路點仍然有其所有鄰居的參考,但我無法訪問數據。

我知道我在做一些可怕的錯誤,但我無法確定是什麼,我對Unity仍然不是很熟悉。

感謝您的任何幫助。

回答

0

簡單的統一不會序列化靜態字段(即使它們是可序列化的類型)。

當您從編輯器切換到播放模式時,您是反序列化/序列化數據,因此最終會丟失存儲在靜態字段中的所有內容。

+0

哦,這很糟糕。所以唯一的選擇是使用實例化對象而不是靜態字段來保存所有內容並使用標記或名稱對其進行查詢?你認爲還有其他簡單的方法來解決它嗎? – Higgcz 2014-12-05 00:18:53

相關問題