許多統一類是通過反射創建的,並且沒有辦法統一到非默認的構造函數。因此限制。
@卡爾文的回答指出了一個非常好的選擇:創建不是從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程序員都生活在有人做更糟糕的事情的可能性,似乎大部分時間工作得很好:)