-1

Unity 3D のコンポーネント ベースのデザイン モデルに少し問題があります。

私の問題を示す例を次に示します。

class MyComponent : MonoBehaviour
{
    MyType entity;

    void Start() 
    {
        entity = (MyType)FindObjectsOfType(typeof(MyType)).First();
    }

    void MyMethod() 
    {
        var x = entity.SomeProperty; // <= NullReference exception
    }
}

// ....

var clone = (GameObject)Instantiate(original);
clone.GetComponent<MyComponent>().MyMethod();

常にではありませんが、MyMethod前に実行されるStartことがあるので、最終的に行うことは、通常行うすべての初期化を移動することですStartMyMethodこれは非常に醜い回避策です。

    void Start() { }

    void MyMethod() 
    {
        entity = (MyType)FindObjectsOfType(typeof(MyType)).First();
        var x = entity.SomeProperty; // <= now it's fine.
    }

私の質問は、このパターンを (コンストラクターなしで) 使用する正しい方法は何ですか?

4

2 に答える 2

3

Awake はゲームの開始前に呼び出されるため、別のコンポーネントの Awake から MyMethod を呼び出したときに発生する可能性があります。私が見る唯一の解決策は、Awake() イベントではなく、Start() イベントで他のコンポーネント (この場合は MyMethod) のメソッドを呼び出さないようにすることです。

于 2013-07-09T13:29:18.997 に答える