gpt4 book ai didi

c# - 为什么访问修饰符在 unity3D 中无关紧要

转载 作者:行者123 更新时间:2023-11-30 20:28:29 24 4
gpt4 key购买 nike

Unity 有一组方法,您可以使用它们来实现 Start、Awake、Update 等行为,这些方法没有访问修饰符,这意味着它们在 C# 类中是私有(private)的。

据我所知,在 C# 中,不使用反射就无法调用另一个类的私有(private)方法。

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 () {
}
}

所以我的问题是,如果它们是私有(private)的,unity 如何调用它们?为什么它们不只是 protected virtual 以便您可以使用 override

最佳答案

Unity 本身是用 C++ 编写的,并且仅将 C# 用于用户创建的脚本。在文档中的某处提到所有这些“魔法”方法(如 Start()Update() 等)都是通过注册具有这种“魔法”的脚本从 C++ 端调用的"方法。对于此方法,无论您使用 public 还是 protected 修改了哪种访问权限,它们都会被调用。

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

与常规 C# 类相比,MonoBehaviour 派生脚本具有巨大的开销。这是因为 Unity 必须自己管理除 C# 内存之外的所有资源(图形、游戏对象、物理等)(为此目的使用单声道垃圾回收)。因此,最好使用尽可能少的 MonoBahaviour 派生类,而更喜欢常规 C# 类。

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

关于c# - 为什么访问修饰符在 unity3D 中无关紧要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com