【问题标题】:Unity: Preserving static object/data between editor and playUnity:在编辑器和播放之间保留静态对象/数据
【发布时间】:2014-12-04 17:51:23
【问题描述】:

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

我有 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 是附加到 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;
    }

}

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

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

感谢您的帮助。

【问题讨论】:

    标签: scripting unity3d unity3d-editor


    【解决方案1】:

    Unity 不会序列化静态字段(即使它们是可序列化的类型)。

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

    【讨论】:

    • 哦,很糟糕。所以唯一的选择是使用实例化对象而不是静态字段来保存所有内容并使用标签或名称查询它?您认为还有其他简单的方法可以解决吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多