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 Inspector

Последний сценарий - это 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 ответ

Решение

Простое единство не сериализует статические поля (даже если они имеют сериализуемый тип).

Когда вы переключаетесь из редактора в режим воспроизведения, вы десериализуете / сериализуете данные, так что в итоге вы потеряете все, что хранится в статических полях.

Другие вопросы по тегам