1、知识目标知识目标能力目标能力目标任务引入任务引入第第6 6章章 脚本语言开发基础脚本语言开发基础Tuesday,August 09,2022第1页知识目标知识目标了解了解 Unity Unity 脚本的生命周期脚本的生命周期了解了解 Unity Unity 脚本与游戏对象和组件的交互方法脚本与游戏对象和组件的交互方法了解了解 Unity Unity 中的常用类中的常用类Tuesday,August 09,2022第2页能力目标能力目标 掌握基本的脚本编程方法掌握基本的脚本编程方法 掌握游戏对象操作和相关类应用掌握游戏对象操作和相关类应用 掌握掌握 Time Time 类应用类应用Tuesday
2、,August 09,2022第3页任务引入任务引入 脚本也是 Unity3D 的一种组件;脚本编程可以控制模型对象的生命周期循环;脚本开发是增强现实应用开发的核心部分之一。Tuesday,August 09,2022第4页6.1 认识脚本开发认识脚本开发 脚本是一个游戏的灵魂,有了脚本程序,游戏才变得有可玩性;脚本的任务有处理输入、操作各个 Game Object、维护状态和管理逻辑等;在 Unity3D 中,有两种编程语言,分别是 C#和 JavaScript,C#在 Unity3D 开发的游戏中的使用比例超过了 80%。Tuesday,August 09,2022第5页选中 Script
3、s 文件夹,在其中右键,选择 Create-C#Script。图 6-1 创建一个 Scripts 文件夹并在其中新建一个 C#脚本Tuesday,August 09,2022第6页双击脚本,默认打开 Unity 的 MonoDevelop 编辑器。可以看到有一个继承自MonoBehaviour 类的NewBehuaviourScript 类,这个类名和脚本的名字是一样的。文件名和类名必须保持一致,所以如果修改了脚本的文件名就要同步修改类名。Start 函数中的内容将会在一开始就被执行,所以一些需要初始化的变量都可以写在 Start 函数内;Update 函数,在运行的每一帧都会调用,可以理解
4、为这个函数无时无刻不在调用。Tuesday,August 09,2022第7页6.2 Unity 脚本的生命周期脚本的生命周期 Start 和 Update 函数都叫做生命周期函数。脚本的生命周期分为多个阶段,在各个阶段中有各自的事件函数。(1)阶段一:编辑Reset:当脚本第一次依附在 Game Object 上或使用了 Reset 命令时调用,用来初始化脚本的属性。(2)阶段二:第一场景加载Awake:在任何 Start 函数之前调用,也是在 prefab 被实例化之后调用的。OnEnable:此对象启用后才调用此函数。OnLevelWasLoaded:执行该功能以通知游戏已经加载了一个新
5、的级别。Tuesday,August 09,2022第8页 Unity 脚本的生命周期脚本的生命周期 (3)阶段三:在第 1 帧更新之前Start:仅在脚本实例启用后才在第 1 帧更新前调用启动。(4)阶段四:帧之间OnApplicationPause:在正常的帧更新之间检测到暂停的帧的末尾被调用。(5)阶段五:更新FixedUpdate:FixedUpdate 通常比 Update 更频繁地被调用。Update:每帧调用一次更新。它是帧更新的主要功能。LateUpdate:Update 更新完成后,每帧调用 LateUpdate 一次。Tuesday,August 09,2022第9页 Un
6、ity 脚本的生命周期脚本的生命周期 (6)阶段六:渲染OnPreCull:在相机剔除场景之前调用,剔除哪些对象对于相机是可见的。OnBecameVisible/OnBecameInvisible:当对象对于任何相机变为可见/不可见时调用。OnWillRenderObject:如果对象可见,则为每个摄像机调用一次。OnPreRender:在相机开始呈现场景之前调用。OnRenderObject:在所有常规场景渲染完成后调用。OnPostRender:在相机完成渲染场景后调用。OnRenderImage:场景渲染完成后允许屏幕图像后期处理调用。OnGUI:每帧调用多次以响应 GUI 事件。首先处
7、理布局和重绘事件,然后处理每个输入事件的布局和键盘/鼠标事件。OnDrawGizmos:用于在场景视图中绘制 Gizmos 以进行可视化。Tuesday,August 09,2022第10页Unity 脚本的生命周期脚本的生命周期 (7)阶段七:协同程序yield:在下一帧调用所有更新功能后,协调程序继续。yield WaitForSeconds:在指定的时间延迟之后,在为帧调用所有更新功能之后继续。yield WaitForFixedUpdate:在所有脚本上调用了所有 FixedUpdate 之后继续。yield WWW:在一个 WWW 下载完成后继续。yield StartCorouti
8、ne:链接协同程序,并等待 MyFunc 协同程序首先完成。(8)阶段八:对象毁灭OnDestroy:在对象存在的最后一帧的所有帧更新之后调用此函数。(9)阶段九:退出OnApplicationQuit:在应用程序退出之前,所有游戏对象都调用此函数。在编辑器中,当用户停止播放模式时被调用。OnDisable:当该行为被禁用或不活动时,调用此函数。Tuesday,August 09,2022第11页6.3 访问游戏对象和组件访问游戏对象和组件 脚本需要挂载在 Game Object 上运行,例如在 Update 函数中添加以下代码。这两行代码用来检测鼠标左键是否按下,如果鼠标左键按下就会在控制台
9、输出“Pressed left click”。代码编辑完成以后按下 Ctrl+S 保存代码,将窗口切换回Unity3D 编辑器,可以看到窗口右下角有一个“风火轮”在旋转,这个图标代表代码正在进行编译,需要等待代码编译完才能开始播放模式。Tuesday,August 09,2022第12页打开 Console(控制台)面板来调试代码。代码编译完之后如果控制台没有提示错误就可以单击播放按钮开始调试。新建一个 Cube,并且把脚本拖动至 Cube 的 Inspector 上。图 6-2 将编辑好的脚本挂载在一个对象上Tuesday,August 09,2022第13页再次进入播放模式,鼠标左键单击
10、Game 视图的任意位置,控制台就会输出信息。单击 Console 视图中的 Clear 按钮可以清空控制台消息。图 6-3 控制台的输出Tuesday,August 09,2022第14页脚本一个重要的功能就是操作 Game Object,操作 Game Object 需要先获取到要操作的 Game Object。获取游戏对象的第一种方法就是使用 gameObject 对象。GameObject 与 gameObject 不同,前者表示游戏对象类,后者表示当前脚本所挂载的游戏对象,如在一个 Cube 下挂载以下代码。这行代码执行以后,给 Cube 添加了一个球形碰撞器。图 6-4 通过脚本添
11、加一个球形碰撞器Tuesday,August 09,2022第15页如果想要获取其他对象而不是脚本挂载的对象,可以通过 GameObject.Find方法来获取。输出结果如下图。图 6-5 控制台输出和这个方法类似的还有 GameObject.FindWithTagGameObject.FindGameObjectWithTag,GameObject.FindGameObjectsWithTag 方法,这些方法都是根据 tag 来寻找对象的。Tuesday,August 09,2022第16页要查看对象/类所有的成员变量和方法,可以通过 Scripting Reference(脚本手册)查看,
12、位于 Help-Scripting Reference。图 6-6 使用 Scripting Reference 获取编程帮助Tuesday,August 09,2022第17页还有一种通过声明共有变量的方法来获取内容,如:可以看到在 Inspector 面板中有声明的变量,数组可以自定义长度。在 Inspector 面板中拖入值,脚本中的变量就能访问对应的变量。图 6-7 脚本中定义的 Public 变量可以在属性面板中编辑Tuesday,August 09,2022第18页6.4 Time 类简介类简介 Time 类是获取 Unity 内时间信息的接口;Time.DeltaTime 表示完成上一帧所需要的时间;Time.time 代表从游戏开始到当前所经过的时间;Time.timeSinceLevelLoad 表示从当前场景加载完成到目前为止的时间;Time 类有近 20 个变量,详细内容可以查看 Scripting Reference(脚本手册)。Tuesday,August 09,2022第19页 本章小结本章小结 Tuesday,August 09,2022第20页