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

这段代码的功能是实现摄像机围绕屏幕中心旋转、缩放和平移的功能。具体实现是通过控制摄像机的 position 和 rotation 来实现的。 首先,定义了一些变量:thetaSpeed 表示旋转速度。接下来是一个类的定义,起名为 text。这个类继承MonoBehaviour 类,也就是说它是一个 Unity 组件类,可以挂载到场景中的 GameObject 上。 在这个类中,定义了一些变量,包括一个公有的 Transform 类型的变量 target,一个公有的 float 类型的变量 distance,一个公有的 float 类型的变量 zoomSpeed,用于控制缩放速度。还有一些私有变量,包括一个 Vector3 类型的变量 dragOrigin,用于记录鼠标拖拽的起始位置;一个 bool 类型的变量 dragging,表示鼠标是否正在拖拽。 在 Start() 方法中,首先获取了 Unity 中的 Camera 组件,并将它的 position 和 rotation 初始化为摄像机在场景中的位置和旋转角度。 在 Update() 方法中,首先检测鼠标是否按下了左键,如果按下了左键,则记录鼠标的位置,并将 dragging 设为 true。如果鼠标松开了,那么将 dragging 设为 false。 接下来,根据鼠标的移动来控制摄像机的旋转、缩放和平移。如果鼠标正在拖拽,那么首先计算出鼠标移动的距离,然后根据这个距离计算出摄像机需要旋转的角度,然后根据旋转角度和旋转速度来转换成摄像机的旋转矩阵。 如果鼠标滚轮滚动了,那么根据滚轮的滚动值来计算缩放比例,并根据缩放比例来更新摄像机的位置。 最后,如果按下了 F 键,那么将摄像机的位置和旋转角度重置为初始值。如果按下了 Esc 键,那么退出程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值