许多统一类是通过反射创建的,并且没有办法统一到非默认的构造函数。因此限制。
@卡尔文的回答指出了一个非常好的选择:创建不是从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程序员都生活在有人做更糟糕的事情的可能性,似乎大部分时间工作得很好:)