Unity: сохранение статического объекта / данных между редактором и игрой
Я сделал автономный генератор сети путевых точек, который может построить сеть путевых точек в редакторе, чтобы мы могли перемещать или удалять путевые точки в процессе редактирования. Однако мне нужен какой-то способ ссылки на сеть путевых точек из разных объектов в режиме воспроизведения, и мне действительно нравится одноэлементный подход. Моя идея такова:
У меня есть 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 - это сценарии MonoBehaviour, которые прикреплены к GameObject и используются для обновления, повторного создания или удаления сети путевых точек.
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, так что я могу создавать все объекты из меню, вот часть создания.
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 сбрасывается, и все статические переменные равны нулю. Кажется, что сама сеть сохранена, потому что каждая путевая точка все еще имеет ссылку на всех своих соседей, но я не могу получить доступ к данным.
Я знаю, что делаю что-то ужасное неправильно, но я не могу определить, что, я все еще не очень знаком с Unity.
Спасибо за любую помощь.
1 ответ
Простое единство не сериализует статические поля (даже если они имеют сериализуемый тип).
Когда вы переключаетесь из редактора в режим воспроизведения, вы десериализуете / сериализуете данные, так что в итоге вы потеряете все, что хранится в статических полях.