1

編集プロセス中にウェイポイントを移動または削除できるように、エディターでウェイポイント ネットワークを構築できるオフライン ウェイポイント ネットワーク ジェネレーターを作成しました。ただし、再生モードでさまざまなオブジェクトからウェイポイント ネットワークを参照する方法が必要であり、シングルトン アプローチが非常に気に入っています。私の考えは:

WNNetworkWNNetworkObject、およびWNNetworkDataの3 つのスクリプトがあります。

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 インスペクター エディター

最後のスクリプトは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