关于继承MonoBehaviour的一些记录

本文探讨了在游戏开发中使用MonoBehaviour时,如何合理地继承与重写内置方法如Start、Update等,避免代码冗余,提高代码复用性和可维护性。通过示例展示了在子类中覆盖或重写这些方法的正确方式,以及如何在必要时实现虚函数以灵活调用父类方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发游戏中,为了减少不必要的代码量,我们经常会继承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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值