在Unity3D中,C#脚本的运行环境使用了Mono技术,Mono是由Novell公司致力于.NET开源的工程,利用Mono技术可以在Unity3D脚本中使用.NET所有的相关类。但Unity 3D 中C#的使用与传统的C#有一些不同。
Unity是一个面向组件的游戏引擎,每个游戏物体(GameObject)在检视面板上可以看到挂载了很多的组件,每个组件其实就是一个继承自MonoBehaviour 的类,只要是继承了MonoBehaviour 的类就可以挂载到游戏物体上,用户所编写的游戏脚本都是继承自MonoBehaviour 的类,所以可以挂载到游戏物体上,组件就是官方内置的脚本。
MonoBehaviour 类是所有脚本的基类,每个脚本都会自动继承Monobehaviour 类。Monobehaviour 的各个函数执行顺序如图5-1 所示。
unity 脚本从唤醒到销毁都有着一套比较完善的生命周期,添加任何脚本都要遵守生命周期法则,接下来介绍几种系统自调用的重要方法,它们的执行顺序为Awake→Start→Update→FixedUpdate →LateUpdate →OnGUI →Reset →OnDisable →OnDestroy。
下面针对每一个方法进行详细的说明。
(1)Awake:用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次。Awake 在所有对象被初始化之后调用,所以用户可以安全地与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,用户应该用Awake 来设置脚本间的引用,并用Start 来传递信息,Awake 总是在Start 之前被调用。
(2)Start:仅在Update 函数第一次被调用前调用。Start 在behaviour 的生命周期中只被调用一次。它和Awake 的不同是Start 只在脚本实例被启用时调用。用户可以按需调整延迟初始化代码。Awake 总是在Start 之前执行,这允许用户协调初始化顺序。在所有脚本实例中,Start 函数总是在Awake 函数之后调用。
(3)Update:正常帧更新,用于更新逻辑。每一帧都执行,处理Rigidbody 时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,用户必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧(两者帧长不同)。每固定帧绘制时执行一次FixedUpdate,和Update不同的是FixedUpdate是渲染帧执行,如果渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate 比较适用于物理引擎的计算,因为是跟每帧渲染有关,Update则比较适合做控制。
(www.xing528.com)
图5-1 Monobehaviour 各个函数执行顺序
(4)FixedUpdate:固定帧更新,在Unity导航菜单栏中,点击“Edit”→“Project Setting”→“Time”菜单项后,右侧的Inspector视图将弹出时间管理器,其中Fixed Timestep选项用于设置FixedUpdate()的更新频率,更新频率默认为0.02 s。
(5)LateUpdate:在所有Update函数调用后被调用,和Fixedupdate一样都是每一帧都被调用执行,这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate 里实现。LateUpdate 在每帧Update 执行完毕调用,它是在所有Update 结束后才调用,比较适合用于命令脚本的执行。官网上的例子是摄像机的跟随,都是在所有Update 操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
(6)OnGUI:在渲染和处理GUI 事件时调用。比如:画一个button 或label 时常常用到它,这意味着OnGUI 也是每帧执行一次。
(7)Reset:在用户点击检视面板的Reset 按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset 最常用于在检视面板中给定一个默认值。
(8)OnDisable:当物体被销毁时OnDisable 将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable 将被调用,OnEnable 在脚本被载入后调用。
(9)OnDestroy:当MonoBehaviour 将被销毁时,这个函数被调用。OnDestroy 只会在预先已经被激活的游戏物体上被调用。
使用C#编写脚本时还需要注意,类名要与脚本文件名相同,否则在添加脚本到游戏对象时会出现提示错误。这里要求与文件名同名的类指的是从MonoBehaviour 继承的行为类。只有序列化的成员变量才能显示在属性查看器,而private和protected类型的成员变量只能在专家模式中显示,而且其属性不被序列化或显示在属性查看器,如果属性想在属性查看器中显示,必须是public类型。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。