游戏开发与 Unity 实践
初阶
v 0 . 8 . 0
更新: 2 0 1 3 - 0 1 - 11
更多网 站 : http : / /www.g l top.com
新 浪 微 博 : http : / /weibo.com/g l top
腾 讯 微 博 : http : / / t .qq .com/
g l top_gamedev
QQ 群 : 242500383
Emai l : [email protected]
教程说明
概念介绍对游戏开发中的一些概念和基本应用进行简要说明。
Unity 实践在 Uni ty 中的使用方法和注意事项。
游戏生产线概要艺术内容制作
艺术内容导出
游戏内容制作
游戏内容构建
游戏内容打包
游戏内容加载
游戏内容表现
游戏对象模型游戏开发与 U n i t y 实践
游戏对象 (Game Object)
游 戏 对 象
介 绍
游戏对象是对场景中物体进行管理的基本单元。 通过游戏对象可对场景中的物体进行定位、查找、访问等操作。
对象有级联关系,对一个对象的操作会影响到其子对象。如,移动一个对象,其子对象也跟随其移动。
游 戏 对 象
在 U n i t y 中
游戏对象在” Hierarchy”中管理。 所有的游戏对象及其所引用的资源,会被构建入游戏数据中。
游 戏 对 象 – 主 要 属性
在 U n i t y 中
Transformation
物体的位置、旋转、缩放属性。
Parent
其层级关系中的父对象。
游 戏 对 象 – 主 要 方法
在 U n i t y 中
Start()
对象被实例化后执行一次。
Update()
对象被激活后,每帧执行。
部件( Component )
部 件
介 绍
类似于插件概念的模块化的结构 游戏对象需要哪些特性,就把对应的部件挂上去。
如 Collision、 Audio Source、 Light、Material等。
部 件
在 U n i t y 中
选中一个 Game Object,从 Component
菜单中可以添加一个所需的 Component
到这个 Game Object上。
游戏资源游戏开发与 U n i t y 实践
Assets
Assets
介 绍
Assets可理解为用于制作、加工游戏所需的各类源数据。
这些数据不会被直接构建入游戏,即这里数据的多少不会对游戏应用的大小有影响。
制作游戏(场景)时需要哪些数据,从Assets中选取、构建。
Assets
在 U n i t y 中
Asset在“ Project”中管理。 将资源文件放置 Asset目录下, Unity回自动检测并将其导入” Project”中。
Prefab
Prefab
介 绍
Prefab是 Asset的一种。 Prefab相当于游戏对象的模版,对于有相同或者相似特性的游戏对象,可以用Prefab来对其实例化,这样就不用反复的配置其属性。
Prefab
在 U n i t y 中
可将Game Object实例直接拖到 Asset中,就会自动生成一个 Prefab。
如果一个对象引用其它对象,被引用的对象又不在 Prefab中,生成 Prefab后引用关系会丢失。
用 Prefab实例化多个游戏对象,如果修改Prefab的属性,这些游戏对象的属性也会跟着改变。
数据加载
数 据 加 载 – 打 包
介 绍
说明在 Build游戏数据时,应将游戏(编辑期)数据打包,即将零散的数据资源打入一个或多个压缩包中。
目的数据加密。压缩数据,节省应用尺寸。提高加载速度。
数 据 加 载 – 序 列 化
介 绍
说明将数据转换为其在运行时内存中的格式,这样数据只需从文件加载入内存即可直接使用,而不用对加载进来得数据进行解析,也不需要用解析出来的数据来逐成员的构造和初始化游戏对象。
目的提高数据加载与游戏初始化速度。
数 据 加 载 – 同 步
介 绍
在主线程中一次性的(在一个 loop中)执行完所有加载逻辑。
如果界面也在调用加载操作的线程中,在加载过程中界面将停止更新与响应。
数 据 加 载 – 异 步
介 绍
多线程即多线程的加载,不影响其它逻辑的执行,如界面渲染、输入操作等。
“伪”异步自己管理资源加载,即在循环中一次加载一个或者一批资源,保证每个循环 CPU可以执行其他的逻辑。
数 据 加 载 - H ierarchy 中 的 资 源
在 U n i t y 中
普通的(即不通过 Resource或WWW)场景资源加载时, Hierarchy中的 Game
Object及其所引用的 Project中的资源会被自动的全部加载进内存。
数 据 加 载 - Resources
在 U n i t y 中
Resource目录下所有资源被打成一个包中。
可以有选择的加载数据到内存中。
数 据 加 载 - WWW
在 U n i t y 中
可将不同数据打成不同的包,在运行时动态加载。
可从 web上下载并加载包,也可加载本地的包。
3D 图形游戏开发与 U n i t y 实践
模型( Model )
模 型 – 顶 点
介 绍
顶点(位置)信息 (x,y,z)所使用的数据类型决定精度和数据大小。
提示要考虑好场景中模型的最大尺寸和最小尺寸,顶
点数值过小或过大都会引起精度丢失问题。精度丢失可能会引起 Z 闪烁。“大尺寸”数据类型比较占用内存。
模 型 – 法 线
介 绍
法线属性可以表现表面方向,影响物体的光影效果。
提示如果某个面的一块很黑,打灯光也无法照亮,可以考虑现在数据中检查一下模型法线。
模 型 - UV
介 绍
顶点与贴图的坐标映射。
模 型 – 顶 点 色
介 绍
记录顶点的颜色。 通常用于静态光照,也可用于多层贴图混
合。
模 型 - Index
介 绍
多边形是有方向的, Index的顺序决定面的方向。
模 型 – 备 注
介 绍
顶点的数量直接影响模型精细度和顶点色过渡的细致程度。
(可见的)模型的面的数量对渲染性能有直接影响,对于目前大多数设备( PC、Console、 Pad等),应将其控制在几万到几十万( <30 万)之间。
模 型 – 使 用
在 U n i t y 中
将模型文件放置 Asset目录中的某个位置,Unity会自动检测并将其导入到“ Project”中。
模 型 – 模 型 文 件
在 U n i t y 中
支持的格式有 fbx, collada, ma等。 FBX - Autodesk的一种数字内容文件格式,
很多数字内容制作工具都支持对这种格式数据的导入、导出。
Unity 支持 Maya文件导入,但需要安装Maya。
贴图( Texture )
贴 图
介 绍
为游戏中的元素的颜色显示或者运算提供颜色输入。例如,模型表面的图像,用于运算材质的颜色,用户界面上的图像等等。
贴 图 – 格 式
介 绍
Tga – 32位,有 8位 Alpha通道。 Png – 压缩格式,有透明色。 Jpg – 压缩格式,无半透。 DXT – 有不同的压缩格式。
贴 图 – 尺 寸
介 绍
不同的设备对渲染用贴图的尺寸有所限制。 如某些设备上要求贴图宽高是 2的幂;有些设备将最大尺寸限制到 2048*2048。具体限制请查看文档。
贴 图 - Mipmap
介 绍
如果场景有纵深,mipmap可让远处贴图看着不“花”(这是由多个贴图像素投影到同一个屏幕像素上造成的)。
并且可提高渲染性能。
贴 图 – 优 化
介 绍
对于 3D游戏,贴图通常都是游戏内存使用大户,所以在贴图的使用上尽量优化的使用。不影响效果的情况下尽量使用尺寸小的格式。只加载需要的贴图。
贴 图 – 优 化 举 例
介 绍
可使用 24位色(无半透)的就不要使用 32位色。 可使用压缩格式( 3D物体)的就不要使用非压缩格式。
渲染物体总在同一深度的就不要声称 mipmap。 颜色简单的可使用索引色。
贴 图 – 打 包
介 绍
将贴图打包的好处优化内存 – 贴图文件在内存中占用 2的幂宽高的空间,打包后可移除这些空间。
优化性能 - 可节省材质数量(即可优化渲染的提交次数)
优化尺寸 - 减少贴图的总的大小。提高制作效率 - 可统一的对贴图进行格式转换等处理。
贴 图
在 U n i t y 中
支持的贴图文件格式Png, tga, jpg, psd…
将贴图复制到 Asset目录,这个贴图就可被导入。
贴图压缩 – 设置贴图的压缩方式可在内存和 CPU 间进行平衡。
贴 图 – 打 包
在 U n i t y 中
可选择 Texture Packer对贴图进行打包。
材质( Material )
材 质
介 绍
作用 为游戏中的模型的“表面”提供属性。例如,颜色或光照的属性
和运算、物理属性、声音属性等等,使用最为广泛的是用于渲染
的材质。
渲染材质的映射模式有 Diffuse
Normal
Specular
材 质 – Diff use Map
介 绍
材质的漫反射颜色表示的是在所有方向平均反
射的入射光量。 值 (1,1,1) 表示所有方向可以
反射 100% 的入射光。 Diffuse 映射从各个方
向上看上去都不会有光影变化。漫反射颜色将
只会在受一些无阴影的光照影响时显示,因为
它会缩放入射光照。
材 质 – Normal Map
介 绍
法线贴图可以指定每个像素的法线属性,
它可以同时对漫反射和高光光照产生影响。
材 质 – Specular Map
介 绍
高光颜色可以表现在某个方向反射的入射光线多少。 高
光反应在您的眼睛与反射的入射光线的方向对齐的时候
是最亮的,所以高光是根据视图进行变化的。
法线也会影响高光,因为它会影响反射的光源方向。 高
光强度可以控制表全面的光泽或光泽程度。 非常高的高
光强度可以表现如镜面一般的表面,而低强度可以表现
比较粗糙的表面。
材 质
在 U n i t y 中
Unity中的材质是非 Graph编辑的,只能根据 shader进行属性设置。
如果需要实现特殊的效果,需要写对应的shader文件来支持。
摄像机( Camera )
摄 像 机
介 绍
透视投影 – 有景深,近大远小,可参考真实照相机的效果。
正交投影 – 无景深,无近大远小的效果,大多用于 2D表现,例如 GUI。
FOV – 镜头广度,也可理解为“近大远小”的程度。
摄 像 机
在 U n i t y 中
Projection
投影模式 – 可设置正交投影、透视投影。
Target Texture
可将此摄像机中的内容渲染到一张贴图上。可用于实现画中画、镜面等效果。
灯光( Light )
灯 光
介 绍
环境光(Ambient Light) 照亮整个场景,无方向(或者说来自四面八方)。
点光源(Point Light) 灯泡的效果。
方向光(Directional Light) 太阳光的效果。
聚光(Spot Light) 舞台上聚光灯的效果。
灯 光 – 备 注
介 绍
尽量减少同时激活的动态光源的数量以提高渲染性能。
灯 光
在 U n i t y 中
Light Component
给对象赋予 Light Component,对象就具有了光照属性
类型可设置 Light Component的类型有
Spot、 Directional、 Point、 Area 光。环境光在“ Edit->Render Settings”中设置。
动画游戏开发与 U n i t y 实践
帧动画( Frame Animation)
帧 动 画
介 绍
帧动画是游戏开发中最主要的一种动画表现方式。 Animation通常是指按照时间变化对某游戏对象及其属性进行的改变。
帧动画可改变的内容可能包括: Transform属性 颜色属性 声音属性等等…
帧 动 画 – 应 用
介 绍
物体运动 – 如场景中的机关。 角色动画 – 如骨骼动画。 特效表现 – 如粒子效果。 其它特效 - 如流水、岩浆等。
帧 动 画
在 U n i t y 中
Unity有个动画编辑器,点击菜单Window->Animation打开。
选中一个 Game Object后,可对其绑定的动画进行编辑。
Unity动画支持在指定帧处产生回调。
UI游戏开发与 U n i t y 实践
菜单 / 窗体( Menu/Window)
菜 单 / 窗 体
介 绍
控件( Control)可复用的界面上的元素,如按钮、滚动条、下
拉列表等。
事件 / 消息( Event/Message)处理用户的操作,如点击、拖拽等。
菜 单 / 窗 体
在 U n i t y 中
NGUI
NGUI是一款为 Unity开发的GUI 库,有完备的Menu/Window 支持。
提供了很多常用的 UI 控件、界面行为、事件响应。
事件模型NGUI提供了一些消息脚本,将所需脚本拖到对应的 UI对象上,就可设置此对象的事件响应。
HUD
HUD
介 绍
HUD - Head Up Display
屏幕上向用户反馈信息的图形、文字元素。
HUD - Sprite
介 绍
HUD的一个重要的元素,其特性有:Transformation – 移动、旋转、缩放。Animation – 可通过播放帧动画来表现 2D 角
色动作。Behavior – 各种行为表现,如淡入、淡出、
翻转、按指定轨迹运动等。
HUD
在 U n i t y 中
NGUI
NGUI对 HUD有很好的支持。
行为( Behavior)NGUI中有个名为 Tweening的脚本库,提供
了各种用于控制 UI对象如何动态变化的脚本。
HUD – 数 据 生 产 线
在 U n i t y 中
Texture Packer
一款贴图打包工具,可将贴图素材打包。
Atlas maker
生成 Atlas(相当于各类 Sprite的仓库)。
字体( Font )
字 体 – 矢 量 字 体
介 绍
改变字体大小不影响字体渲染效果。 很多游戏引擎或 GUI并不支持运行时预生成的字体。
字 体 – 贴 图 字 体
介 绍
字体样式可自定。 文字内容、颜色可动态改变。 不宜缩放,渲染质量会下降。
字 体 – 文 字 贴 图
介 绍
画到贴图上的文字 可高度定制文字的样式。 内容不能动态改变。 适用于游戏中的小量文字使用。
字 体 - NGUI
在 U n i t y 中
NGUI 支持贴图字体,可支持描边或阴影效果。
字体的材质 shader要使用 Unlit/
Transparent Colored。
字 体 - 矢 量 字 体
在 U n i t y 中
ScaleForm生成支持矢量字体渲染,与Unity的集成正在开发当中。
Unity的 TTF导入是在编辑期预生成字体贴图的。
字 体 – 生 产 线
在 U n i t y 中
BMFont
一款字体文件制作工具,支持简单的命令行操作。可导出字体描述文件( fnt)和字体贴图文件。Unity使用字体描述文件要将扩展名由 fnt改成 txt。
Font Maker
NGUI的字体制作工具,生成Unity中可用的数据。
本地化游戏开发与 U n i t y 实践
文本本地化
本 地 化 的 内 容
介 绍
可能需要本地化的内容有文字(也涉及字体)贴图(通常也是为了文字)语音
文 本 本 地 化 - 编 辑工 具
介 绍
如果游戏的文字量比较大,就需要工具来辅助管理本地化文字来提高编辑效率。
工具Excel - 很多游戏项目是用 Excel进行字符串本
地化管理。其它独立工具 – 也有一些第三方的本地化编辑工
具。如 POEditor、 poedit等。
文 本 本 地 化 - 转 换工 具
游戏加载本地化信息需要一种比较容易解析的文件格式,通常就需要有工具将本地化文本数据进行格式转换。
文 本 本 地 化 – 文 本提 取 工 具
对于有的项目,游戏中可能有大量的文本信息,并且在开发过程中文本信息经常变动,这就需要有工具能将代码中的文本提取出来合并到文本本地化信息库中去。
此类工具有 xgettext等。
文 本 本 地 化
在 U n i t y 中
NGUI 支持 Label的本地化,但不方便大量文本的本地化编辑。
第三方资源TextManager类 – 可加载、解析 po格式的本
地化文件。
字体本地化
文 本 本 地 化 – 贴 图字 体
介 绍
启动游戏时,根据语言确定资源所在路径。 如果游戏内的文字量比较大,对于像中文、
日文等语言,字体贴图的数据量会比较大。
文 本 本 地 化 – 矢 量字 体
介 绍
可使用矢量字库来使游戏支持某语言的字体。
如果使用的文字量很少,使用字库反而会增加应用的尺寸。
注,不是所有引擎都支持运行时矢量字体渲染。
文 本 本 地 化
在 U n i t y 中
第三方资源TextManager – 可加载、解析 po格式的本地化文件。
屏幕游戏开发与 U n i t y 实践
多分辨率支持
多 分 辨 率 支 持 – 适配 策 略
介 绍
完全缩放 画面会被拉伸。
高度、宽度适配(等比) 两侧或上下会留空或者超出屏幕。这种情况下就要考虑
画面的安全区。
完全适配(等比) 根据计算结果决定是高度还是宽度适配,使得画面内容完全在屏幕内。这种情况只会在两侧或上下留空。
多 分 辨 率 支 持 – 安 全区
介 绍
对于高度或宽度适配的模式,在不同分辨率的设备上能显示出来的区域会有不同,这样在设计的时候就要确定好最小可视区域,制作时要将必须显示和响应的内容制作到这个区域中。
多 分 辨 率 支 持 – 适配
在 U n i t y 中
Unity没有设置项直接设置屏幕适配,需要写脚本来实现。
如果使用的是 NGUI,可根据情况设置UIRoot上的Manual Height的值。
素材适配
素 材 适 配
介 绍
目前的移动设备分辨率差异很大,内存资源也有差异。大多情况下,内存资源的大小跟分辨率的大小有一定的关系,所以为了节省内存使用,可能需要根据分辨率(或者 dpi)区分开贴图资源的加载。比如,大分辨率用大贴图,小分辨率用小贴图。运行时根据设备情况加载不同的资源。
素 材 适 配 – 动 态 切换
在 U n i t y 中
NGUI可以在运行时切换 Atlas。 但这种方法会使内存的高峰值会较高。 建议编辑时默认使用低分辨率资源,运行时按照需要替换成高分辨率资源。
可改进生产线,编译前去掉关联,遍以后恢复关联。
物理游戏开发与 U n i t y 实践
碰撞( Collision )
碰 撞
介 绍
物理材质影响物体间的相互作用,如摩擦力、弹性系数等。
分组(空间分割)预知的不可能相互碰撞的物体置入不同的分组中,碰撞检测时就不用对这两个分组中的物体进行碰撞运算,以节省大量的运算。
碰 撞
在 U n i t y 中
给 Game Object添加一个Collision
Component,这个Game Object就具有了(被)碰撞属性。
Unity可绑定的碰撞体有Box、 Sphere、 Capsule、 Mesh、 Wheel、
Terrain
注,Unity中无碰撞分组设置,需要在脚本中实现。
刚体( Rigid Body )
刚 体 – 特 性
介 绍
质量、速率、力、加速度、旋转。 (参考物理学中关于刚体的说明) 场景的尺寸对物理表现会有影响。
刚 体 – 形 状 与 性 能
介 绍
球体 – 性能最高。 立方体、圆柱体、胶囊、轮子 – 性能适中,通过组合可用于略复杂的物理碰撞。
凸多边形 – 可表现任意形状的碰撞体,性能由面数决定,但相对来说性能最低。
刚 体 – 碰 撞 检 测 类型
介 绍
有连续碰撞和非连续碰撞检测 如果不是连续碰撞检测,物体速度较快时可能会穿过另一碰撞物体。
刚 体
在 U n i t y 中
如果需要一个Game Object 按照物理特性运动,就给这个Game Object 绑定一个RigidBody
Component。 Mass – 质量,影响物体的碰撞效果。 Drag – 阻滞系数,用于表现物体被空气、水等物质阻滞的效果。
Constrains – 给物体某个方向上的约束。
刚 体 – Coll ision Detection
在 U n i t y 中
Discrete – 性能高、适合低速运动物体,物体高速运动时可能穿过其它碰撞体。
Continuous – 连续的碰撞检测,保证物体不会穿过其它碰撞体。但性能较低。
Continuous Dynamic – 针对静态网格碰撞器(不带刚体),用于快速移动的物体。
声音游戏开发与 U n i t y 实践
样本( Sample )
样 本 – 格 式
介 绍
格式(音频文件)wav – 支持无压缩。mp3, ogg – 压缩格式。
格式(在内存中)Native – 相对省 CPU,但耗内存。Compress - 相对省内存,但耗 CPU。具体如何选择要看内存和 CPU使用情况而定。
样 本 – 加 载 方 式
介 绍
Streaming
省内存、通道数有限;适合游戏音乐、语音对话等长音频。
In memory
性能高、费内存;适合短小的音效。
样 本 – 立 体 声 、 单声 道
介 绍
立体声自身有空间感。适合于高质量的 2D 音频播放需求。
单声道自身没有空间感。适合于 3D场景中的音效播放。
样 本
在 U n i t y 中
Wav Asset,即AudioClip。 音频格式
Native(WAV) – 省CPU、费内存。 Compressed(MPEG) – 省内存、费CPU。
加载类型 Load into memory – 预先将样本加载到内存中、播放时从内存播放。
Stream from disc – 不加载样本,播放时边缓存边播放。
声源( Sound Source )
声 源
介 绍
音源,用来播放样本,决定声音播放时的属性。
声 源 – 特 性
介 绍
优先级 – 所有设备可以同时播放声音的通道数都是有限的,当同时播放的声音太多时,低优先级的(通常是相对不重要的)声音就会被停止播放。
音量 – 样本在播放时的音量。
声 源 – 2D/3D
介 绍
2D 声音跟方位、距离无关。 3D 声音更容易模拟现实 (3D)世界的声音
效果。
声 源
在 U n i t y 中
给 Game Object添加 Audio Source
Component,这个 Game Object就有了Sound Source的特性。
可在 Inspector中设置静音(Mute)、 优先级、 音量( Volume)、
音调( Pitch)等。
声 源 – 备 注
在 U n i t y 中
同一时刻,一个 Audio Source只播放一个样本。但可用一个 Audio Source去播放不同的 Audio Clip。
3D Sound
3D Sound
介 绍
方位3D 声音有方向、有位置,玩家在场景中移动、转向时会更身临其境。
速度速度对多普勒效果产生影响。通常用于表现高速运动的发声体。
3D Sound – 衰减 曲 线
介 绍
对数衰减 – 声音随着距离的增大,迅速减弱,相对接近现实世界中的声音表现。
线性衰减 – 声音随着距离的增大,均匀的减弱。
自定义衰减曲线
3D Sound
在 U n i t y 中
要播放 3D 声音,首先要勾选 Audio Clip的 3D
Sound属性。 注,游戏场景的尺寸设定会直接影响到 3D 声音。
3D Sound – 衰减
在 U n i t y 中
可以选择或者自定义声音衰减曲线。
Max Distance 决定衰减曲线中横轴的长度。
脚本游戏开发与 U n i t y 实践
状态机( State Machine )
状 态 机
介 绍
说明状态机是对逻辑的模块化封装,在状态内部执行相应的逻辑,由外界条件触发状态切换。
通常一个状态有:进入、执行、退出三个阶段。
目的划分逻辑模块,理清逻辑关系。
状 态 机 – 应 用
介 绍
游戏状态控制 游戏场景切换 角色动画 等…
状 态 机 – 实 现
在 U n i t y 中
与 Unreal Engine不同, Unity中没有可视化的状态机编辑功能,需要写 Script来实现。
状 态 机 – 参 考
在 U n i t y 中
可以从互联网上找到共享的代码,如 http://wiki.unity3d.com/index.php?title=Finite_State_Machine
http://www.playmedusa.com/blog/2010/12/10/a-finite-state-machine-in-c-
for-unity3d
/
通信( Communication )
通 信
介 绍
游戏中的各个模块之间需要相互影响,这就需要一种通信机制。
模块间通信有多种形式,不同的通信机制各有利弊:Object reference
Delegate
Message中心
通 信 – Object reference
介 绍
引用者依赖于被引用者。 耦合较强。
通 信 – Delegate
介 绍
事件接收者与消息发送者建立明确的关联关系。
由于这种关系是靠抽象的接口建立的,所以耦合较弱。
通 信 – Message中 心
介 绍
通知者向消息中心发消息,接收者从消息中心取消息。
两个通信模块无耦合关系。
通 信 - Delegate
在 U n i t y 中
C# 语言的一个特性。 效率较高
通 信 – Object reference
在 U n i t y 中
对于 public的引用, Unity 支持在编辑器中编辑关联关系。
是 Unity开发中的一种常用做法。
通 信 – Message - 1
在 U n i t y 中
Unity提供 Message Broadcast。 此方法效率较低。
通 信 – Message - 2
在 U n i t y 中
还可用 C#来自定义消息系统。 参考
http
://www.unifycommunity.com/wiki/index.php?tit
le=
CSharpMessenger
参考 http://www.gltop.com/index.php?q=node/3
http://unity3d.com/support/documentation/
http://forum.unity3d.com/
http://game.ceeger.com/
结束
GLTOP游戏开发