为什么访问修饰符在unity3D中不重要

时间:2017-11-16 12:39:47

标签: c# .net unity3d unityscript

Unity有一组方法可用于实现Start, Awake, Update这样的行为,这种方法没有访问修饰符,这意味着它们在C#类中是私有的。

据我所知,C#中没有办法在不使用反射的情况下调用另一个类的私有方法。

public class TestClass : MonoBehaviour {
    private void Start () {
       // How is unity able to call this method if it's private and I'm not calling it anywhere
    }

    void Update () {    
    }
}

所以我的问题是,如果他们是私人的,团结能够如何称呼他们?为什么他们只是protected virtual,所以你可以使用override

1 个答案:

答案 0 :(得分:4)

Unity本身是用C ++编写的,仅将C#用于用户创建的脚本。文档中的某处提到了所有这些"魔术"方法(如Start()Update()等通过注册具有此"魔法"方法的脚本从C ++端调用。对于这种方法,哪些访问修改了你并不重要使用公共或受保护他们将被呼叫。

至于为什么这些方法不受虚拟保护我可以说你拥有的方法越少 - 你获得的性能就越好。如果脚本没有Update()方法,Unity不必在其脚本系统中注册此脚本,也不必每帧都调用它。

MonoBehaviour派生的脚本在比较常规C#类时会产生巨大的开销。这是因为Unity必须管理除C#内存之外的所有资源(图形,游戏对象,物理等)(它为此目的使用单一垃圾收集)。因此,最好使用较少的MonoBahaviour派生类,而不是常规的C#类。

更新:here是评论的一个很好的解释。