我制作了离线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 ,它基本上是一个包含对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仍然不太熟悉。
感谢您的帮助。
答案 0 :(得分:0)
简单统一并不会对静态字段进行序列化(即使它们是可序列化的类型)。
当您从编辑器切换到播放模式时,您正在反序列化/序列化数据,因此最终会丢失存储在静态字段中的所有内容。