Unity3d中的c#方法覆盖

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.运行时检查一个名为Updateexists 的方法是否存在(使用反射),如果存在,则调用它,但是你没有覆盖基础实现

更新

既然你问了一个如何实现这个问题的例子,我在这里做了一个样本:https://dotnetfiddle.net/UrpYkf