More Related Content
Similar to Game development and unity practice (20)
Game development and unity practice
- 1. 初阶
v 0.8.0
更 新 : 2 0 1 3 - 0 1 - 11
- 3. 教程说明
概念介 绍
对游戏开发中的一些概念和基本应用进
行简要说明。
Uni ty 实践
在Unity中的使用方法和注意事项。
- 7. 介绍
游戏对象
游戏对象是对场景中物体进行管理的基本单
元。
通过游戏对象可对场景中的物体进行定位、
查找、访问等操作。
对象有级联关系,对一个对象的操作会影响
到其子对象。如,移动一个对象,其子对象
也跟随其移动。
- 12. 介绍
部件
类似于插件概念的模块化的结构
游戏对象需要哪些特性,就把对应的部件
挂上去。
如Collision、Audio Source、Light、
Material等。
- 13. 在Unity中
部件
选中一个Game Object,从Component菜
单中可以添加一个所需的Component到这
个Game Object上。
- 16. 介绍
Assets
Assets可理解为用于制作、加工游戏所需
的各类源数据。
这些数据不会被直接构建入游戏,即这里
数据的多少不会对游戏应用的大小有影响。
制作游戏(场景)时需要哪些数据,从
Assets中选取、构建。
- 17. 在Unity中
Assets
Asset在“Project”中管理。
将资源文件放置Asset目录下,Unity回自
动检测并将其导入”Project”中。
- 19. 介绍
Prefab
Prefab是Asset的一种。
Prefab相当于游戏对象的模版,对于有相
同或者相似特性的游戏对象,可以用
Prefab来对其实例化,这样就不用反复的
配置其属性。
- 20. 在Unity中
Prefab
可将Game Object实例直接拖到Asset中,就会
自动生成一个Prefab。
如果一个对象引用其它对象,被引用的对象又不
在Prefab中,生成Prefab后引用关系会丢失。
用Prefab实例化多个游戏对象,如果修改Prefab
的属性,这些游戏对象的属性也会跟着改变。
- 22. 介绍
数据加载 – 打包
说明
在Build游戏数据时,应将游戏(编辑期)数据打
包,即将零散的数据资源打入一个或多个压缩包中。
目的
数据加密。
压缩数据,节省应用尺寸。
提高加载速度。
- 23. 介绍
数据加载 – 序列化
说明
将数据转换为其在运行时内存中的格式,这样数据
只需从文件加载入内存即可直接使用,而不用对加
载进来得数据进行解析,也不需要用解析出来的数
据来逐成员的构造和初始化游戏对象。
目的
提高数据加载与游戏初始化速度。
- 24. 介绍
数据加载 – 同步
在主线程中一次性的(在一个loop中)执
行完所有加载逻辑。
如果界面也在调用加载操作的线程中,在
加载过程中界面将停止更新与响应。
- 25. 介绍
数据加载 – 异步
多线程
即多线程的加载,不影响其它逻辑的执行,如
界面渲染、输入操作等。
“伪”异步
自己管理资源加载,即在循环中一次加载一个
或者一批资源,保证每个循环CPU可以执行其
他的逻辑。
- 31. 介绍
模型 – 顶点
顶点(位置)信息(x,y,z)所使用的数据类型
决定精度和数据大小。
提示
要考虑好场景中模型的最大尺寸和最小尺寸,顶点
数值过小或过大都会引起精度丢失问题。
精度丢失可能会引起Z闪烁。
“大尺寸”数据类型比较占用内存。
- 32. 介绍
模型 – 法线
法线属性可以表现表面方向,影响物体的
光影效果。
提示
如果某个面的一块很黑,打灯光也无法照亮,
可以考虑现在数据中检查一下模型法线。
- 36. 介绍
模型 – 备注
顶点的数量直接影响模型精细度和顶点色
过渡的细致程度。
(可见的)模型的面的数量对渲染性能有
直接影响,对于目前大多数设备(PC、
Console、Pad等),应将其控制在几万
到几十万(<30万)之间。
- 38. 在Unity中
模型 – 模型文件
支持的格式有fbx, collada, ma等。
FBX - Autodesk的一种数字内容文件格式,
很多数字内容制作工具都支持对这种格式
数据的导入、导出。
Unity支持Maya文件导入,但需要安装
Maya。
- 40. 介绍
贴图
为游戏中的元素的颜色显示或者运算提供
颜色输入。例如,模型表面的图像,用于
运算材质的颜色,用户界面上的图像等等。
- 41. 介绍
贴图 – 格式
Tga – 32位,有8位Alpha通道。
Png – 压缩格式,有透明色。
Jpg – 压缩格式,无半透。
DXT – 有不同的压缩格式。
- 42. 介绍
贴图 – 尺寸
不同的设备对渲染用贴图的尺寸有所限制。
如某些设备上要求贴图宽高是2的幂;有
些设备将最大尺寸限制到2048*2048。具
体限制请查看文档。
- 43. 介绍
贴图 - Mipmap
如果场景有纵深,mipmap可让远处贴图
看着不“花”(这是由多个贴图像素投影到
同一个屏幕像素上造成的)。
并且可提高渲染性能。
- 44. 介绍
贴图 – 优化
对于3D游戏,贴图通常都是游戏内存使
用大户,所以在贴图的使用上尽量优化的
使用。
不影响效果的情况下尽量使用尺寸小的格式。
只加载需要的贴图。
- 45. 介绍
贴图 – 优化举例
可使用24位色(无半透)的就不要使用32位
色。
可使用压缩格式(3D物体)的就不要使用非
压缩格式。
渲染物体总在同一深度的就不要声称mipmap。
颜色简单的可使用索引色。
- 46. 介绍
贴图 – 打包
将贴图打包的好处
优化内存 – 贴图文件在内存中占用2的幂宽高的空
间,打包后可移除这些空间。
优化性能 - 可节省材质数量(即可优化渲染的提交
次数)
优化尺寸 - 减少贴图的总的大小。
提高制作效率 - 可统一的对贴图进行格式转换等处
理。
- 47. 在Unity中
贴图
支持的贴图文件格式
Png, tga, jpg, psd…
将贴图复制到Asset目录,这个贴图就可
被导入。
贴图压缩 – 设置贴图的压缩方式可在内存
和CPU间进行平衡。
- 50. 介绍
材质
作用
为游戏中的模型的“表面”提供属性。例如,颜色或光照的属性和
运算、物理属性、声音属性等等,使用最为广泛的是用于渲染的
材质。
渲染材质的映射模式有
Diffuse
Normal
Specular
- 51. 介绍
材质 – Diffuse Map
材质的漫反射颜色表示的是在所有方向平均
反射的入射光量。 值 (1,1,1) 表示所有方向
可以反射 100% 的入射光。 Diffuse映射从各
个方向上看上去都不会有光影变化。漫反射
颜色将只会在受一些无阴影的光照影响时显
示,因为它会缩放入射光照。
- 53. 介绍
材质 – Specular
Map
高光颜色可以表现在某个方向反射的入射光线多少。
高光反应在您的眼睛与反射的入射光线的方向对齐的
时候是最亮的,所以高光是根据视图进行变化的。
法线也会影响高光,因为它会影响反射的光源方向。
高光强度可以控制表全面的光泽或光泽程度。 非常
高的高光强度可以表现如镜面一般的表面,而低强度
可以表现比较粗糙的表面。
- 54. 在Unity中
材质
Unity中的材质是非Graph编辑的,只能根
据shader进行属性设置。
如果需要实现特殊的效果,需要写对应的
shader文件来支持。
- 56. 介绍
摄像机
透视投影 – 有景深,近大远小,可参考真
实照相机的效果。
正交投影 – 无景深,无近大远小的效果,
大多用于2D表现,例如GUI。
FOV – 镜头广度,也可理解为“近大远小”
的程度。
- 57. 在Unity中
摄像机
Projection
投影模式 – 可设置正交投影、透视投影。
Target Texture
可将此摄像机中的内容渲染到一张贴图上。
可用于实现画中画、镜面等效果。
- 59. 介绍
灯光
环境光(Ambient Light)
照亮整个场景,无方向(或者说来自四面八方)。
点光源(Point Light)
灯泡的效果。
方向光(Directional Light)
太阳光的效果。
聚光(Spot Light)
舞台上聚光灯的效果。
- 61. 在Unity中
灯光
Light Component
给对象赋予Light Component,对象就具有了光照
属性
类型
可设置Light Component的类型有Spot、
Directional、Point、Area光。
环境光在“Edit->Render Settings”中设置。
- 64. 介绍
帧动画
帧动画是游戏开发中最主要的一种动画表现方式。
Animation通常是指按照时间变化对某游戏对象
及其属性进行的改变。
帧动画可改变的内容可能包括:
Transform属性
颜色属性
声音属性
等等…
- 65. 介绍
帧动画 – 应用
物体运动 – 如场景中的机关。
角色动画 – 如骨骼动画。
特效表现 – 如粒子效果。
其它特效 - 如流水、岩浆等。
- 66. 在Unity中
帧动画
Unity有个动画编辑器,点击菜单Window-
>Animation打开。
选中一个Game Object后,可对其绑定的
动画进行编辑。
Unity动画支持在指定帧处产生回调。
- 69. 介绍
菜单/窗体
控件(Control)
可复用的界面上的元素,如按钮、滚动条、下
拉列表等。
事件/消息(Event/Message)
处理用户的操作,如点击、拖拽等。
- 70. 在Unity中
菜单/窗体
NGUI
NGUI是一款为Unity开发的GUI库,有完备的
Menu/Window支持。
提供了很多常用的UI控件、界面行为、事件响应。
事件模型
NGUI提供了一些消息脚本,将所需脚本拖到对应
的UI对象上,就可设置此对象的事件响应。
- 72. 介绍
HUD
HUD - Head Up Display
屏幕上向用户反馈信息的图形、文字元素。
- 73. 介绍
HUD - Sprite
HUD的一个重要的元素,其特性有:
Transformation – 移动、旋转、缩放。
Animation – 可通过播放帧动画来表现2D角色
动作。
Behavior – 各种行为表现,如淡入、淡出、翻
转、按指定轨迹运动等。
- 74. 在Unity中
HUD
NGUI
NGUI对HUD有很好的支持。
行为(Behavior)
NGUI中有个名为Tweening的脚本库,提供了
各种用于控制UI对象如何动态变化的脚本。
- 79. 介绍
字体 – 文字贴图
画到贴图上的文字
可高度定制文字的样式。
内容不能动态改变。
适用于游戏中的小量文字使用。
- 82. 在Unity中
字体 – 生产线
BMFont
一款字体文件制作工具,支持简单的命令行操作。
可导出字体描述文件(fnt)和字体贴图文件。
Unity使用字体描述文件要将扩展名由fnt改成txt。
Font Maker
NGUI的字体制作工具,生成Unity中可用的数据。
- 85. 介绍
本地化的内容
可能需要本地化的内容有
文字(也涉及字体)
贴图(通常也是为了文字)
语音
- 86. 介绍
文本本地化 - 编辑工
具
如果游戏的文字量比较大,就需要工具来辅
助管理本地化文字来提高编辑效率。
工具
Excel - 很多游戏项目是用Excel进行字符串本地化
管理。
其它独立工具 – 也有一些第三方的本地化编辑工
具。如POEditor、poedit等。
- 88. 文本本地化 – 文本提
取工具
对于有的项目,游戏中可能有大量的文本信息,
并且在开发过程中文本信息经常变动,这就需要
有工具能将代码中的文本提取出来合并到文本本
地化信息库中去。
此类工具有xgettext等。
- 89. 在Unity中
文本本地化
NGUI支持Label的本地化,但不方便大量
文本的本地化编辑。
第三方资源
TextManager类 – 可加载、解析po格式的本地
化文件。
- 92. 介绍
文本本地化 – 矢量字
体
可使用矢量字库来使游戏支持某语言的字
体。
如果使用的文字量很少,使用字库反而会
增加应用的尺寸。
注,不是所有引擎都支持运行时矢量字体
渲染。
- 96. 介绍
多分辨率支持 – 适配
策略
完全缩放
画面会被拉伸。
高度、宽度适配(等比)
两侧或上下会留空或者超出屏幕。这种情况下就要考虑
画面的安全区。
完全适配(等比)
根据计算结果决定是高度还是宽度适配,使得画面内容
完全在屏幕内。这种情况只会在两侧或上下留空。
- 97. 介绍
多分辨率支持 –安全
区
对于高度或宽度适配的模式,在不同分辨
率的设备上能显示出来的区域会有不同,
这样在设计的时候就要确定好最小可视区
域,制作时要将必须显示和响应的内容制
作到这个区域中。
- 100. 介绍
素材适配
目前的移动设备分辨率差异很大,内存资源
也有差异。大多情况下,内存资源的大小跟
分辨率的大小有一定的关系,所以为了节省
内存使用,可能需要根据分辨率(或者dpi)
区分开贴图资源的加载。比如,
大分辨率用大贴图,小分辨率用小贴图。运行时根
据设备情况加载不同的资源。
- 101. 在Unity中
素材适配 – 动态切
换
NGUI可以在运行时切换Atlas。
但这种方法会使内存的高峰值会较高。
建议编辑时默认使用低分辨率资源,运行
时按照需要替换成高分辨率资源。
可改进生产线,编译前去掉关联,遍以后
恢复关联。
- 104. 介绍
碰撞
物理材质
影响物体间的相互作用,如摩擦力、弹性系数
等。
分组(空间分割)
预知的不可能相互碰撞的物体置入不同的分组
中,碰撞检测时就不用对这两个分组中的物体
进行碰撞运算,以节省大量的运算。
- 105. 在Unity中
碰撞
给Game Object添加一个Collision
Component,这个Game Object就具有了
(被)碰撞属性。
Unity可绑定的碰撞体有
Box、 Sphere、 Capsule、 Mesh、 Wheel、
Terrain
注,Unity中无碰撞分组设置,需要在脚本中
实现。
- 107. 介绍
刚体 – 特性
质量、速率、力、加速度、旋转。
(参考物理学中关于刚体的说明)
场景的尺寸对物理表现会有影响。
- 108. 介绍
刚体 – 形状与性能
球体 – 性能最高。
立方体、圆柱体、胶囊、轮子 – 性能适中,
通过组合可用于略复杂的物理碰撞。
凸多边形 – 可表现任意形状的碰撞体,性
能由面数决定,但相对来说性能最低。
- 110. 在Unity中
刚体
如果需要一个Game Object按照物理特性运
动,就给这个Game Object绑定一个
RigidBody Component。
Mass – 质量,影响物体的碰撞效果。
Drag – 阻滞系数,用于表现物体被空气、水
等物质阻滞的效果。
Constrains – 给物体某个方向上的约束。
- 111. 在Unity中
刚体 – Collision
Detection
Discrete – 性能高、适合低速运动物体,
物体高速运动时可能穿过其它碰撞体。
Continuous – 连续的碰撞检测,保证物体
不会穿过其它碰撞体。但性能较低。
Continuous Dynamic – 针对静态网格碰
撞器(不带刚体),用于快速移动的物体。
- 114. 介绍
样本 – 格式
格式(音频文件)
wav – 支持无压缩。
mp3, ogg – 压缩格式。
格式(在内存中)
Native – 相对省CPU,但耗内存。
Compress - 相对省内存,但耗CPU。
具体如何选择要看内存和CPU使用情况而定。
- 115. 介绍
样本 – 加载方式
Streaming
省内存、通道数有限;
适合游戏音乐、语音对话等长音频。
In memory
性能高、费内存;
适合短小的音效。
- 116. 介绍
样本 – 立体声、单
声道
立体声
自身有空间感。
适合于高质量的2D音频播放需求。
单声道
自身没有空间感。
适合于3D场景中的音效播放。
- 117. 在Unity中
样本
Wav Asset,即AudioClip。
音频格式
Native(WAV) – 省CPU、费内存。
Compressed(MPEG) – 省内存、费CPU。
加载类型
Load into memory – 预先将样本加载到内存中、播放时
从内存播放。
Stream from disc – 不加载样本,播放时边缓存边播放。
- 119. 介绍
声源
音源,用来播放样本,决定声音播放时的
属性。
- 120. 介绍
声源 – 特性
优先级 – 所有设备可以同时播放声音的通
道数都是有限的,当同时播放的声音太多
时,低优先级的(通常是相对不重要的)
声音就会被停止播放。
音量 – 样本在播放时的音量。
- 122. 在Unity中
声源
给Game Object添加Audio Source
Component,这个Game Object就有了
Sound Source的特性。
可在Inspector中设置
静音(Mute)、 优先级、 音量(Volume)、
音调(Pitch)等。
- 123. 在Unity中
声源 – 备注
同一时刻,一个Audio Source只播放一个
样本。但可用一个Audio Source去播放不
同的Audio Clip。
- 125. 介绍
3D Sound
方位
3D声音有方向、有位置,玩家在场景中移
动、转向时会更身临其境。
速度
速度对多普勒效果产生影响。通常用于表现高
速运动的发声体。
- 126. 介绍
3D Sound – 衰减曲
线
对数衰减 – 声音随着距离的增大,迅速减
弱,相对接近现实世界中的声音表现。
线性衰减 – 声音随着距离的增大,均匀的
减弱。
自定义衰减曲线
- 131. 介绍
状态机
说明
状态机是对逻辑的模块化封装,在状态内部执
行相应的逻辑,由外界条件触发状态切换。
通常一个状态有:进入、执行、退出三个阶段。
目的
划分逻辑模块,理清逻辑关系。
- 134. 在Unity中
状态机 – 参考
可以从互联网上找到共享的代码,如
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/
- 136. 介绍
通信
游戏中的各个模块之间需要相互影响,这就
需要一种通信机制。
模块间通信有多种形式,不同的通信机制各
有利弊:
Object reference
Delegate
Message中心
- 143. 在Unity中
通信 – Message -
2
还可用C#来自定义消息系统。
参考
http://www.unifycommunity.com/wiki/index.ph
p?title=CSharpMessenger
- 144. 参考
http://www.gltop.com/index.php?q=node/3
http://unity3d.com/support/documentation/
http://forum.unity3d.com/
http://game.ceeger.com/