我制作了离线航点网络生成器,它能够在编辑器中构建航点网络,因此我们可以在编辑过程中移动或删除航点。但是我需要一些方法来在播放模式下从不同的对象引用航点网络,我真的很喜欢单例方法。我的想法是:
我有 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,它基本上是一个包含对 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 不太熟悉。
谢谢你的帮助。