• 关于继承MonoBehaviour的一些记录


    在开发游戏中,为了减少不必要的代码量,我们经常会继承MonoBehaviour,那么MonoBehaviour内部的内置方法Start、Update等等如果在父类中定义了,在子类中再次定义会发生什么事呢?

    我们来看看几个示例:

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 public class Test1 : MonoBehaviour
     5 {
     6     void Start()
     7     {
     8         Debug.Log("Test1 Start");
     9     }
    10     
    11     void Update()
    12     {
    13         Debug.Log("Test1 Update");
    14     }
    15 }
     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 public class Test2 : Test1
     5 {
     6     void Start()
     7     {
     8         Debug.Log("Test2 Start");
     9     }
    10 
    11     void Update()
    12     {
    13         Debug.Log("Test2 Update");
    14     }
    15 }

    我们将Test2.cs绑定到一个GameObject上,运行看看结果:

    我们会发现Test2的方法覆盖了Test1的方法,同时Start、Update等内置的方法不是虚函数,所以无法使用base.Start()来调用父类的方法。

    下面我们修改Test2如下:

    1 using UnityEngine;
    2 using System.Collections;
    3 
    4 public class Test2 : Test1
    5 {
    6 }

    运行看看:

    我们会发现如果在子类不定义Start、Update等方法会调用父类的对应方法,注意:定义了但函数体为空则不会调用父类的同名方法,类似于取消该方法的效果。

    如果我们需要Start、Update是虚函数该怎么办呢?很简单,自己写一个:

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 public class Test1 : MonoBehaviour
     5 {
     6     void Start()
     7     {
     8         OnStart();
     9     }
    10 
    11     protected virtual void OnStart()
    12     {
    13         
    14     }
    15     
    16     void Update()
    17     {
    18         OnUpdate();
    19     }
    20 
    21     protected virtual void OnUpdate()
    22     {
    23         
    24     }
    25 }

    这样我们在其子类直接override方法OnStart、OnUpdate就行了,当前前提是其子类不能再定义Start和Update方法。

  • 相关阅读:
    Java反射
    安装python
    查看网页加载速度,并优化
    模型按一个圈摆放(10等分)
    y = n*x 匀速,变速运动
    物体绕圆形做圆周运动
    three.js 相机跟随鼠标移动
    three.js 物体随鼠标移动
    three.js 画正多边形-线性
    ES6的JavaScript数据结构实现之队列
  • 原文地址:https://www.cnblogs.com/hammerc/p/4492434.html
Copyright © 2020-2023  润新知