1、LOGO2022-12-161第三讲:第三讲:Unity引擎入门篇引擎入门篇 2游戏开发技术游戏开发技术2022-12-162二、二、脚本语言简介脚本语言简介三、脚本开发基础三、脚本开发基础本讲提纲本讲提纲一、一、创建基本游戏场景创建基本游戏场景四、讨论四、讨论2022-12-163一、创建基本游戏场景一、创建基本游戏场景2022-12-1641.1 摄像机摄像机 游戏场景中至少有一台摄像机,也可游戏场景中至少有一台摄像机,也可以有多台摄像机。以有多台摄像机。多台摄像机可以创建双人分屏效果或高级多台摄像机可以创建双人分屏效果或高级的自定义效果。的自定义效果。Unity中支持两种类型的摄像机中支
2、持两种类型的摄像机(Projection):Perspective 透视摄像机透视摄像机 Orthographic 正交摄像机正交摄像机2022-12-165摄像机类型摄像机类型 Perspective透视摄像机透视摄像机 四棱台:近大远小四棱台:近大远小 适合适合3D游戏游戏2022-12-166摄像机类型摄像机类型 Orthographic正交摄像机正交摄像机 长方体:大小一样长方体:大小一样 适合适合2D游戏游戏2022-12-167摄像机设置摄像机设置 剔除掩码剔除掩码 culling mask Layers设置设置2022-12-168摄像机设置摄像机设置 画中画画中画2022-12
3、-169摄像机设置摄像机设置 多相机切换多相机切换 按数字键按数字键1,2,3即可进行摄像机的即可进行摄像机的切换。切换。通过通过【脚本控制脚本控制】2022-12-16101.2 光源光源 Unity提供了提供了4种类型的光源,在合理种类型的光源,在合理设置的基础上可以模拟自然界中任何设置的基础上可以模拟自然界中任何的光源。的光源。1、Directional light:方向光源:方向光源 该类型光源可以被放置在无穷远出,可以影该类型光源可以被放置在无穷远出,可以影响场景的一切游戏对象响场景的一切游戏对象;类似于自然界中的日光的照明效果。类似于自然界中的日光的照明效果。方向光源是最不耗费图形
4、处理器资源的光源方向光源是最不耗费图形处理器资源的光源类型。类型。2022-12-16111.2 光源光源 2、Point light:点光源:点光源 点光源可从一个位置向四面八方发出光线,点光源可从一个位置向四面八方发出光线,影响其范围内的所有对象影响其范围内的所有对象;类似于灯泡的照明效果类似于灯泡的照明效果;点光源的阴影是较耗费图形处理器资源的光点光源的阴影是较耗费图形处理器资源的光源类型。源类型。3、Spotlight 聚光灯聚光灯 灯光从一点发出,在一个方向按照一个锥形灯光从一点发出,在一个方向按照一个锥形的范围照射,处于锥形区域内的对象受到光的范围照射,处于锥形区域内的对象受到光线
5、照射;线照射;类似射灯的照明效果。类似射灯的照明效果。2022-12-16121.2 光源光源 4、Area light:区域光:区域光/面光源面光源 该类似光源无法应用于实时光照,仅适用于该类似光源无法应用于实时光照,仅适用于光照贴图烘焙。光照贴图烘焙。2022-12-16131.3 创建角色创建角色 角色控制资源包角色控制资源包 Assets-Import Package-Character Controller2022-12-1614角色预设体角色预设体 第一人称第一人称 第三人称第三人称2022-12-16151.4 天空盒天空盒 天空盒资源包天空盒资源包 Assets-Import
6、Package-Skyboxes 资源包中包含资源包中包含9个天空盒个天空盒2022-12-1616创建天空盒创建天空盒 1)首先,准备)首先,准备6张纹理(前、后、左、张纹理(前、后、左、右、上、下等右、上、下等6个面);个面);2)然后,创建一个材质资源:)然后,创建一个材质资源:Assets-Create-Material 3)选中该材质,在)选中该材质,在Inspector视图中,视图中,单击单击Shader-RenderFX-Skybox 4)对天空盒材质赋予)对天空盒材质赋予6张纹理张纹理2022-12-1617设置天空盒设置天空盒 在在Unity中,天空盒的使用方法有两种:中,天
7、空盒的使用方法有两种:1、渲染设置、渲染设置 edit-Render Settings 2、为摄像机对象添加天空盒组件、为摄像机对象添加天空盒组件 Component-Rendering-Skybox2022-12-16181.5 雾效雾效 在在unity中,开启雾效的方法非常简单:中,开启雾效的方法非常简单:Edit-Render Settings项项2022-12-1619二、脚本语言简介二、脚本语言简介2022-12-16202.1 脚本介绍脚本介绍 游戏吸引人的地方在于它的游戏吸引人的地方在于它的可交互性可交互性。在在Unity中,游戏交互通过中,游戏交互通过脚本编程脚本编程来来实现。
8、实现。那什么是那什么是脚本脚本呢?呢?脚本可以理解为附加在脚本可以理解为附加在GameObject(游(游戏对象)上的用于定义游戏对象行为的指戏对象)上的用于定义游戏对象行为的指令代码。令代码。通过脚本,开发者可以控制每一个游戏对通过脚本,开发者可以控制每一个游戏对象的创建、销毁以及对象在各种情况下的象的创建、销毁以及对象在各种情况下的行为,进而实现预期的交互效果。行为,进而实现预期的交互效果。2022-12-16212.2 Unity脚本语言脚本语言 Unity支持支持3种脚本语言:种脚本语言:JavaSript C#Boo Unity的的3种脚本语言实际上在功能和种脚本语言实际上在功能和运
9、行速度上都是一样的,区别主要体运行速度上都是一样的,区别主要体现在语言特性上。现在语言特性上。2022-12-16222.2 Unity脚本语言脚本语言 三种脚本开发语言的对比三种脚本开发语言的对比 JavaScript相对来说语法较为简单,比较容易入相对来说语法较为简单,比较容易入门,门,Unity官方示例中的脚本基本都是用官方示例中的脚本基本都是用JavaScript写的。写的。C#对于有对于有C/C+基础的读者来说很容易学习,基础的读者来说很容易学习,C#本身有很多强大的语言特性,比本身有很多强大的语言特性,比JavaScript更适合进行深入开发。大多数的更适合进行深入开发。大多数的U
10、nity第三方插第三方插件都是用件都是用C#写的,商业游戏项目基本上都是使写的,商业游戏项目基本上都是使用用C#进行开发。进行开发。2022-12-16232.3 JavaScript基本语法基本语法 Unity使用的使用的JavaScript和网页开发中和网页开发中常用的常用的JavaScript一样吗?一样吗?不一样不一样 它经过编译后运行速度很快它经过编译后运行速度很快 语法方面也有不少区别。语法方面也有不少区别。也有人将其成为也有人将其成为UnityScript。2022-12-1624变量变量 JavaScript里变量需要先定义后才能里变量需要先定义后才能使用。使用。声明一个变量的
11、方法为:声明一个变量的方法为:var 变量名变量名:变量类型变量类型 例如:例如:2022-12-1625变量变量 变量前面可以添加访问修饰符,如:变量前面可以添加访问修饰符,如:public、protected、private来修饰。来修饰。Public的变量可以在的变量可以在Inspector视图中查视图中查看和编辑,不添加访问修饰符则默认为看和编辑,不添加访问修饰符则默认为public.2022-12-1626变量变量 JavaScript常用的变量类型:常用的变量类型:2022-12-1627数组数组 JavaScript里可以使用两种数组:里可以使用两种数组:内建数组内建数组 速度最
12、快;速度最快;可以在可以在Inspector视图里编辑;视图里编辑;不能动态调整大小不能动态调整大小 Array 数组数组 Array数组可以调整大小;数组可以调整大小;提供了常用的合并、排序等功能;提供了常用的合并、排序等功能;不能在不能在Inspector视图里编辑;视图里编辑;速度较内建素组慢;速度较内建素组慢;2022-12-1628数组数组 内建数组内建数组2022-12-1629数组数组 Array 数组数组2022-12-1630数组数组 内建数组和内建数组和Array 数组可以很方便的数组可以很方便的转换:转换:2022-12-1631运算、比较、逻辑操作符运算、比较、逻辑操作
13、符 运算操作符运算操作符2022-12-1632运算、比较、逻辑操作符运算、比较、逻辑操作符 比较操作符比较操作符2022-12-1633运算、比较、逻辑操作符运算、比较、逻辑操作符 条件操作符条件操作符2022-12-1634语句语句 JavaScript的所有语句均要以分号的所有语句均要以分号(;)结尾。结尾。语句的注释支持单行注释语句的注释支持单行注释/支持多行注释支持多行注释/*/。1、条件语句、条件语句 支持支持if、if-else条件判断以及条件判断以及if-else嵌套嵌套使用。使用。2022-12-1635语句语句 2、循环语句、循环语句 支持支持while、do-while、
14、for、for-in的循的循环操作。环操作。2022-12-1636语句语句 3、switch语句语句 Switch语句用来进行语句用来进行多条件判断,可以替多条件判断,可以替代冗长的代冗长的if-else嵌套嵌套语句语句 2022-12-1637函数函数 JavaScript里的函数格式为:里的函数格式为:function 函数名函数名(参数参数1:参数类型,参数类型,参数参数2:参数类型参数类型):返回值类型返回值类型 2022-12-1638函数函数 JavaScript中函数均可以视为中函数均可以视为Function类型的对象,可以像变量一样进行赋类型的对象,可以像变量一样进行赋值比较
15、等操作。值比较等操作。2022-12-1639JavaScript脚本脚本 对于对于JavaScript脚本,脚本,Unity会自动地会自动地为脚本添加一个与脚本文件名同名的为脚本添加一个与脚本文件名同名的类,并类,并自动自动地继承于地继承于MonoBehaviour。如果使用如果使用C#语言来开发,则需要在脚语言来开发,则需要在脚本里本里显式显式地写出类名和继承关系。地写出类名和继承关系。2022-12-16402.4 C#基本语法基本语法 函数函数 C#变量声明方式为:变量声明方式为:变量类型变量类型 变量名变量名;例如:例如:2022-12-1641函数函数 变量前面可以添加访问修饰符变
16、量前面可以添加访问修饰符public、protected、private 其中其中public的变量可以在的变量可以在Inspector视图视图中查看和编辑,中查看和编辑,不添加访问修饰符则默认不添加访问修饰符则默认为为private(在(在JavaScript中默认为中默认为public)。)。2022-12-1642数组数组 在在C#中只能使用内建数组中只能使用内建数组2022-12-1643数组数组 虽然不能使用虽然不能使用Array数组,但是可以使数组,但是可以使用用ArrayList、List等容器来达到同样等容器来达到同样的目的。的目的。2022-12-1644函数函数 C#里的函
17、数格式为:里的函数格式为:例如:例如:2022-12-1645函数函数 函数参数前可以使用关键字函数参数前可以使用关键字out实现返实现返回多个数值。回多个数值。例如:例如:2022-12-1646三、脚本开发基础三、脚本开发基础2022-12-16473.1 创建脚本创建脚本 Assets-Create-JavaScript (C#Script)2022-12-16483.1 创建脚本创建脚本2022-12-16493.1 创建脚本创建脚本C#ScriptJavaScript2022-12-16503.2 脚本必然事件脚本必然事件 必然事件必然事件 在在Unity的脚本中,可以定义一些特定的
18、的脚本中,可以定义一些特定的函数,这些函数会在满足某些条件时由函数,这些函数会在满足某些条件时由Unity自动调用,它们被称为必须事件。自动调用,它们被称为必须事件。2022-12-16513.3 MonoBehaviour类类 MonoBehaviour是是Unity中一个非常中一个非常重要的类,它定义了基本的脚本行为,重要的类,它定义了基本的脚本行为,所有的脚本类均需要从它直接或者间所有的脚本类均需要从它直接或者间接地继承。接地继承。脚本必然事件就是从脚本必然事件就是从MonoBehaviour继继承而来。承而来。除了必然事件,除了必然事件,MonoBehaviour定义了定义了对各种特定
19、事件(例如鼠标在模型上单击,对各种特定事件(例如鼠标在模型上单击,模型碰撞等)的响应函数,这些函数名称模型碰撞等)的响应函数,这些函数名称均以均以On作为开头。作为开头。2022-12-16523.3 MonoBehaviour类类2022-12-16533.4 访问组件访问组件 一个一个GameObject游戏组件可能由若干游戏组件可能由若干组件构成。组件构成。例如,在场景中新建一个立方体后,在例如,在场景中新建一个立方体后,在Inspector视图中可以看到一个简单的立方视图中可以看到一个简单的立方体包含了体包含了4个组件:个组件:Transform 用于定义对象在场景中的位置、用于定义对
20、象在场景中的位置、角度、缩放参数角度、缩放参数 Mesh Filter 用来从资源文件中读取模型用来从资源文件中读取模型 Box Collider 用来为立方体添加碰撞效果用来为立方体添加碰撞效果 Mesh Render 用来在场景中渲染立方体模型用来在场景中渲染立方体模型2022-12-16543.4 访问组件访问组件 如何访问游戏对象的各种组件并设置组如何访问游戏对象的各种组件并设置组件参数?件参数?对于系统内置的常用组件,对于系统内置的常用组件,Unity提供了非提供了非常便利的访问方式,只需要在脚本里直接常便利的访问方式,只需要在脚本里直接访问组件对应的成员变量即可,这些成员访问组件对
21、应的成员变量即可,这些成员变量定义在变量定义在MonoBehaviour中并被脚本中并被脚本继承了下来。继承了下来。2022-12-16553.4 访问组件访问组件 常用的组件及其对应的变量常用的组件及其对应的变量 注意:如果游戏对象上不存在某组件,则该组件对注意:如果游戏对象上不存在某组件,则该组件对应变量的值将为空值应变量的值将为空值null2022-12-16563.5 访问游戏对象访问游戏对象 在在Unity中,用户可以通过如下几种方中,用户可以通过如下几种方式来访问游戏对象。式来访问游戏对象。1、通过名称来查找、通过名称来查找 使用函数使用函数GameObject.Find 如果场景
22、中存在指定名称的游戏对象,那么返如果场景中存在指定名称的游戏对象,那么返回该对象的引用,否则返回回该对象的引用,否则返回null。如果存在多个重名的对象,那么返回第一个对如果存在多个重名的对象,那么返回第一个对象的引用。象的引用。2022-12-16573.5 访问游戏对象访问游戏对象 2、通过标签来查找、通过标签来查找 使用函数使用函数GameObject.FindWithTag 如果场景中存在指定标签的游戏对象,那么返如果场景中存在指定标签的游戏对象,那么返回该对象的引用,否则返回回该对象的引用,否则返回null。如果存在多个游戏对象使用同一标签,那么返如果存在多个游戏对象使用同一标签,那
23、么返回第一个对象的引用。回第一个对象的引用。GameObject.Find和和.FindWithTag是比较耗时的函数调是比较耗时的函数调用,因此不建议在用,因此不建议在Update函数中调用它们,而是应该在初始化函数中调用它们,而是应该在初始化中查找一次以后保持到变量中。中查找一次以后保持到变量中。2022-12-16583.5 访问游戏对象访问游戏对象 3、通过访问权限为、通过访问权限为public的变量,然的变量,然后将要访问的组件或者对象赋值给该变后将要访问的组件或者对象赋值给该变量,就可以在脚本中通过变量来访问组量,就可以在脚本中通过变量来访问组件或对象了。件或对象了。2022-12
24、-16593.6 常用脚本常用脚本API Transform组件组件 Transform组件决定了游戏对象的位置、组件决定了游戏对象的位置、方向和缩放比例。方向和缩放比例。在游戏中如果想更新玩家位置,设置相机在游戏中如果想更新玩家位置,设置相机观察角度都免不了要和观察角度都免不了要和Transform组件打组件打交道。交道。2022-12-1660Transform组件组件 Transform组件的成员变量组件的成员变量2022-12-1661Transform组件组件 Transform组件的成员函数组件的成员函数2022-12-1662Transform组件组件 应用示例应用示例 1)向前
25、方移动向前方移动 2)绕自身坐标轴绕自身坐标轴Y旋转旋转2022-12-1663Transform组件组件 应用示例应用示例 3)绕世界坐标的绕世界坐标的Y轴旋转轴旋转 4)使相机观察方向跟随物体移动使相机观察方向跟随物体移动2022-12-1664Time类类 在在Unity中可以通过中可以通过Time类用来获取类用来获取和时间有关的信息(可以用来计算帧和时间有关的信息(可以用来计算帧率,调整时间流逝速度等功能)率,调整时间流逝速度等功能)Time类的成员变量类的成员变量2022-12-1665Random类类 Random类可以用来生成随机数,随类可以用来生成随机数,随机点或旋转。机点或旋
26、转。Random类的成员变量:类的成员变量:Random类的成员函数:类的成员函数:2022-12-1666Mathf类类 Mathf类提供了常用的数学运算。类提供了常用的数学运算。Mathf类的变量:类的变量:2022-12-1667Mathf类类 Mathf类的常用方法:类的常用方法:2022-12-1668Coroutine类类 Coroutine也称为协同程序,协同程序也称为协同程序,协同程序可以和主程序并行运行,和多线程有可以和主程序并行运行,和多线程有些类似,但是在任一指定时刻只会有些类似,但是在任一指定时刻只会有一个协同程序在运行,别的协同程序一个协同程序在运行,别的协同程序则会
27、挂起。则会挂起。协同程序可以用来实现让一段程序等协同程序可以用来实现让一段程序等待一段时间后继续运行的效果,例如,待一段时间后继续运行的效果,例如,执行步骤执行步骤1,等待,等待3秒;执行步骤秒;执行步骤2,等,等待某个条件为待某个条件为true;执行步骤;执行步骤3.2022-12-1669Coroutine类类 Unity里和协同程序有关的函数有:里和协同程序有关的函数有:2022-12-1670Coroutine类类 在在JavaScript里使用协同程序的示例:里使用协同程序的示例:2022-12-1671Coroutine类类 在在C#中,协同程序的返回类型必须为中,协同程序的返回类型必须为IEnumerator,yield要用要用yield return来替代,并且启动协同程序用来替代,并且启动协同程序用StartCoroutine函数。函数。LOGO2022-12-1672游戏开发技术游戏开发技术
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。