dav*_*ode 17 c# unity-game-engine
在最近几周,我使用c#作为脚本语言使用Unity3d.我从来没有在c#和Unity3d之前使用过,我试图理解方法覆盖在Unity框架中是如何工作的.让我感到奇怪的是,我可以扩展基类MonoBehavior
并重写方法Start ()
,Update ()
等等,而不必使用override
关键字,编译器也不会抱怨它!相反,在"普通"C#程序中,我必须使用override
关键字,否则我会收到编译器警告.例如:
public class BaseClass {
public virtual void MyMethod () {
Console.WriteLine("BaseClass.MyMethod()");
}
}
public class SubClass : BaseClass {
public override void MyMethod () {
Console.WriteLine("SubClass.MyMethod()");
}
}
class Program {
static void Main () {
SubClass obj = new SubClass ();
obj.MyMethod ();
}
}
Run Code Online (Sandbox Code Playgroud)
而在Unity中,我可以简单地做到:
class PlayerController : MonoBehaviour {
void Update () {
// code...
}
}
Run Code Online (Sandbox Code Playgroud)
幕后发生了什么?团结是否利用"动态技巧"或什么?
Jcl*_*Jcl 17
因为MonoBehavior
没有定义Update
.运行时检查一个名为Update
exists 的方法是否存在(使用反射),如果存在,则调用它,但是你没有覆盖基础实现
既然你问了一个如何实现这个问题的例子,我在这里做了一个样本:https://dotnetfiddle.net/UrpYkf