关于继承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方法。

时间: 2024-11-09 16:55:57

关于继承MonoBehaviour的一些记录的相关文章

如果你想让继承MonoBehaviour的类变成Singleten

单例是指只有一个实例的类 通常创建单例的方法是 using System; public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton Instance { get { if (instance == null) { instance = new Singleton(); } return instance; } } }但是由于MonoBeha

SSIS 属性LoggingMode和日志记录配置的继承

在配置Package的logging时,左边的Containers,Execute SQL Task前面灰色的“√”表示Execute SQL Task继承Test Log Package的日志记录的配置.Package内的Task,Container的属性LoggingMode有三种选项:UseParentSetting,Enable和Disable. UseParentSetting表示继承Package的设置,Enable表示启动日志记录,但是需要单独配置,Disable表示不记录组件的日

Unity3d学习 基础-关于MonoBehaviour的生命周期

其实在刚接触Unity3D,会有一个疑问,关于Unity3D游戏运行的初始入口在哪?不像Cocos2dx还有个AppDelegate文件可以去理解.而且在刚开始就接触Unity3D时,看到所有脚本中编写的类 几乎都继承了MonoBehaviour这个父类,那么MonoBehaviour这个类是干什么的? 首先我们看一关于MonoBehavior这个类的继承关系: 从上图可以看出,MonoBehaviour是间接继承自Component,说明继承自MonoBehaviour的脚本充当的角色是组件的

innodb 锁分裂继承与迁移

innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记录之前的间隙 LOCK_INSERT_INTENTION: 插入意向锁,用于insert时检查锁冲突 每个行锁由锁类型和GAP类型组成例如:LOCK_X|LOCK_ORDINARY 表示对记录和记录之前的间隙加排他锁LOCK_S|LOCK_GAP 表示只对记录前的间隙加共享锁 锁的兼容性:值得注意的

Unity3d中默认函数调用顺序(MonoBehaviour)

首先要明确的是MonoBehaviour是每个脚本的基类.每个Javascript脚本自动继承MonoBehaviour.使用C#或Boo时,需要显式继承MonoBehaviour. Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不同的游戏对象身上,他们各自都在执行自己的生命周期感觉像是多线程,并行执行脚本的,它是如何执行的呢? 我们做一个小小的实验来验证它.如下图所示,在Hierarchy视图中创建三个游戏对象,在Proj

【Unity3D基础教程】给初学者看的Unity教程(二):所有脚本组件的基类 -- MonoBehaviour的前世今生

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全局变量.GameObject是游戏中的基本物件.GameObject是由Component组合而成的,GameObject本身必须有Transform的Component,这也加深了我们

C++继承意义梳理

C++的继承属性理解和记录 常用的继承方式:{公有继承} . {保护继承} . {私有继承} Public           Protected         Private 总结出三种不同继承方式的基类特性和派生类特性[即可见/不可见  访问权限] 继承方式  Public     Protected   Private 公有继承          Public           Protected          不可见 保护继承          Protected     Pro

SylixOS文件记录锁使用

1. 文件记录锁介绍 文件锁锁定的是整个文件,而记录锁定还可以锁定文件的某一特定部分,即从文件的某一相对位置开始的一段连续的字节流. 当一个进程正在读取或者修改文件的某个部分时,使用文件记录锁可以阻止其他进程修改同一文件的相同区域.它可以用来锁定文件的某个区域或者整个文件,SylixOS 支持多种文件记录锁 API. 注:SylixOS 支持多种设备驱动模型,但是目前只有 NEW_1 型设备驱动支持文件记录锁功能,此类驱动文件节点类似于UNIX 系统的 vnode. 2. 文件记录锁设置 Syl

Android4.4 Telephony流程分析——拨号应用(Dialer)的通话记录加载过程

本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. Android系统通话记录存储在联系人数据库contacts2.db中的calls表中,通话记录(calllog)存储到数据库的时机可查看我之前的一篇博客Android4.4 Telephony流程分析--电话挂断step39,系统提供了CallLogProvider这个ContentProvider来供外界访问.我们来看本文将会使用到的CallLogProvider的代码片段: /** *