[游戏开发]Unity游戏脚本_概述与生命周期

1. 脚本概述

(1)脚本 – 用于来处理游戏或者编辑器等进程。

我们写脚本和完整的程序编写不同的是,我们不用去完整的控制整个程序的进程,通常我们只需要写对应内容的处理,交由 unity 在约定时间内调用即可。

(2)脚本与脚本语言 – 不知道有没有同志会混淆这个两个概念

脚本语言对应的是编译型语言。我们写的编程语言要处理成为计算机懂的语言是要先进行编译的。那编译语言可以简单理解为是提前编译好了,运行的时候计算机就看着它懂的东西在运行,比如C++。而脚本语言就是运行时再每句去解释给计算机听,比如JS。
C#是编译型语言,只是在Unity中,用作来写控制游戏等进程的文件而已,而这种也就是我们常规中说的脚本,Script。

(3)EC框架-- Entity-Component

unity 中实例通过组件来决定他的行为,GameObject 为实例,Component 为组件。理解这个概念,估计会对写Unity脚本有所帮助。
比起面向对象用继承等方法来处理游戏逻辑的方式,EC框架要更灵活得多。比如要让人会飞这个功能,面向对象就比较难处理,因为通常这个能力可能会写在鸟这个基类中,而人可能会继承灵长类这个基类,而多继承带来的问题就更麻烦了。如果说是EC的话,我们可以写个飞行的脚本来控制对象,我们给这个对象挂上这个脚本就可以让他获得飞行的能力,这种情况下就显得更加灵活了。而对于游戏这种,需求多变,角色能力复杂的情况下,EC还是非常有用的。
ECS的概念也很有趣,这里就不多赘述了,等使用到了再去了解也不迟。

2. 脚本生命周期

MonoBehaviour作为一个基类,所有 Unity 脚本都派生自该类,了解脚本的生命周期还是非常有必要的,这个时候就需要这个经典的图了。
在这里插入图片描述
完整的所有函数可以见官方地址:https://docs.unity.cn/cn/current/ScriptReference/MonoBehaviour.html,这里讲一下一些重要的函数。

(1)Awake、OnEnable 、Start

初始化函数,有严格的前后顺序,所有脚本Awake之后,在进行OnEnable,之后再Start。
Awake 和 OnEnable 不可使用协程,但 start 中可以。
Awake 和 Start只会调用一次,而OnEnable 可以在每次启用时被调用。

(2)Update、FixUpdate、LateUpdate

更新函数,Update在每一帧执行时被调用,LateUpdate随后被调用。
FixUpdate跟随物理引擎的更新而被调用,时间为0.02s(Editor-ProjectSettings-Time中可以更改)。
避免空 Update 等,即使是空的,只要写了,就会被 unity 所反射每帧调用,影响运行时间。

  • Update:常用来处理游戏更新逻辑,因为通常游戏只要在帧绘制之前给出运算结果就可以了,只需要及时更新即可。而更新频率不固定的问题调用问题,可以用Time.deltaTime来做一个修复,比如速度= speed*Time.deltaTime。
  • LateUpdate:因为在Update之后也就是业务逻辑之后,常用来做相机跟随角色等处理(因为角色在Update中移动完了)。
  • FixUpdate:对物理要求高的系统上的更新处理。

(3)OnDisable、OnDestory

销毁函数,OnDisable对应OnEnable会在每次禁用时被调用,OnDestory对应Awake,在销毁的时候才被调用。

(4)Reset

非运行模式下才会调用,可以在编辑器内对组件Reset时调用,当脚本挂上游戏对象时会调用,可以用作绑定物体时监听

	#if UNITY_EDITOR
	void Reset () 
	{
		Debug.LogFormat ("GameObject:{0} 绑定 Script_04_02.cs 脚本", gameObject.name);
	}
	#endif

(5)协程和异步

Unity是单线程的,协程和异步都只是unity在每帧的时候,去收集这些待处理的协程和异步来模拟达到效果的,使用会带来额外的开销。但好处在于,不用在Update中很麻烦的处理所有逻辑了,简洁而优雅,在不使用过多的前提下。

  • Coroutine:简单可以理解为将这个函数分成多段来执行。使用的时候就需要StartCoroutine调用,StopCoroutine停止。yeild在函数中做暂缓处理,等待下次再执行。之前做AI五子棋对战的时候,要运算很久,又不能占着进程一直卡着,就可以用协程,算一会就停一下,至少可以让UI等系提正常运行。
  • Async:真好用呀,优雅。只要在函数前标记这个关键字就可以了,如果需要等待这个函数执行完,可以用await。

Coroutine应该会比Async更多人使用因为支持的时间更早,且unity支持度更高,开销更低。但协程问题也比较多,比如协程不能返回值,异常处理以及调试都比较麻烦。

Coroutine和Async是可以相互转换的,可以看这个 :
Unity Async - Await 代替协程:https://blog.csdn.net/u013716859/article/details/124108763

(6)多脚本执行先后顺序

Inspector/ScpritExecutionOder 中额外调整。如果不调整则按照添加时间,对于场景,按照从上到下执行。

3. 结束咯

所有内容就结束咯,若有讲得不对的地方,可以私信我或者在评论区指出。主要参考为雨松大大的《unity3d游戏开发》第四章。另外Unity官网文档,https://docs.unity.cn/cn/current/Manual/index.html。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值