多くのユニティ クラスはリフレクションによって作成されます。ユニティをデフォルト以外のコンストラクタに適切に適用する方法はありません。したがって、制限。
@Calvin の回答は、1 つの非常に優れたオプションを指摘しています。MonoBehaviour から派生していないクラスを作成します。これらは、他の C# と同様にコンストラクターを持つことができます。コードがインスタンスの欠落を許容できる限り、これらのクラスを MonoBehaviours のフィールドに配置できます。@Calvinの回答の典型的な準シングルトンパターンを使用すると、インスタンスが必要なときに常にインスタンスを取得し、「初めてインスタンスを与える」ロジックを派生クラスでオーバーライドできるメソッドにプッシュできます動作をカスタマイズします。
定数のような動作が必要な場合は、派生クラスで異なる値を使用するオプションを使用して、フィールドではなくメソッドを定義する方が簡単な場合があります。メソッドは事実上読み取り専用であり、@ Jerdak の回答によると、より予測可能な突然変異があります。
コンストラクターが必要な場合、最後のオプションは、monobehavior を最小限のプレースホルダーとして使用し、すべての興味深いものを独自のクラスに記述してから、Monobehavior でのすべての作業をクラスに委任することです。
using UnityEngine;
using System.Collections;
public class OuterPlaceholder: MonoBehaviour {
public InnerBehavior _Inner;
public void Awake() {
if (_Inner == null) {
_Inner= new InnerBehavior(4);
}
}
public void Update()
{
_Inner.DoUpdate(this);
}
}
public class InnerBehavior
{
public readonly int UpConstant;
public InnerBehavior (int up)
{
UpConstant = up;
}
public void DoUpdate(MonoBehaviour owner)
{
owner.transform.Translate(Vector3.up * UpConstant * Time.deltaTime);
}
}
このオプションは、プロジェクトが進化するにつれて多くの複雑な継承を取得することが確実な場合に最適です。
最後に: フィールドに _ReadOnlyField や _DoNotWrite などの名前を付けて、ユーザーにいじらないように指示しても問題ありません。すべての Python プログラマーは、誰かがもっと悪いことをする可能性を抱えていますが、ほとんどの場合はうまくいくようです :)