许多统一类是通过反射创建的,无法正确统一非默认构造函数;因此限制。
@Calvin 的回答指出了一个非常好的选择:创建不是从 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 程序员都有可能做一些更糟糕的事情,而且大多数时候看起来都很好:)