1

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

我有 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 编辑器

最后一个脚本是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 不太熟悉。

谢谢你的帮助。

4

1 回答 1

0

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

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

于 2014-12-04T21:08:22.090 回答