Unity:在编辑器和播放器之间保留静态对象/数据

时间:2014-12-04 17:51:24

标签: scripting unity3d unity3d-editor

我制作了离线Waypoints网络生成器,它能够在编辑器中构建航点网络,这样我们就可以在编辑过程中移动或删除航点。但是我需要一些方法来在播放模式中从不同对象引用航点网络,我真的很喜欢单例方法。我的想法是:

我有3个脚本: WNNetwork WNNetworkObject WNNetworkData

WNNetworkData 是简单的ScriptableObject,它保存计算出的数据。

[System.Serializable]
public class WNNetworkData : ScriptableObject {

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

}

WNNetworkObject 是附加到GameObject的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;
    }

}

问题是,当我创建Waypoints网络时,一切都在编辑器中运行,每个对象似乎都成功创建,我可以编辑航点。但是只要我点击播放按钮, WNNetwork 就会重置,并且所有静态变量都等于 null 。网络本身似乎得到了保留,因为每个航路点仍然引用其所有邻居,但我无法访问数据。

我知道我做了一件可怕的错事,但我无法确定是什么,我对Unity仍然不太熟悉。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

简单统一并不会对静态字段进行序列化(即使它们是可序列化的类型)。

当您从编辑器切换到播放模式时,您正在反序列化/序列化数据,因此最终会丢失存储在静态字段中的所有内容。