《Unity实战》总结
闲话
本文意加强对Unity的一些知识点的补充,所以基本以记录为主。
零散知识
- Unity使用左手坐标系
- 所有场景对象都是类GameObject的实例。GameObject只是组件的容器
- 变量赋值数字后的f让计算机把这个变量作为浮点值处理,否则C#会把小数当成双精度值(C++也是一样)
- 本地坐标:对象有自己的原点,有三个轴,且坐标系跟着对象移动
- 全局(世界)坐标:与本地坐标的区别就是不移动
- Cursor.lookState = CursorLockMode.Locked; // 光标锁定屏幕中心
- Cursor.visible = false; // 隐藏光标
- Unity的场景拥有所有此场景所有GameObject的引用,用Destroy来告诉引擎,将这个对象从Scene中移除
- Shader中的Albedo是基础颜色的意思
- 用2D开启的新项目,Unity主要调整了2D Editor模式(将导入的图片设置为Sprite)和2D Scene视图
- Unity中的导入设置Pixels-To-Units是像素与Unity原默认3D的一个单位的比例,默认是100:1(建议使用默认值,在1:1的状态下物理引擎不能正常工作)
- 像素完美(Pixel-perfect):屏幕上的每一个像素对应图像中的一个像素(否则会让图像在缩放到屏幕大小时变的模糊)
- LoadScene:加载不同关卡时,当前关卡的所有内容(场景中所有对象和所有附件的脚本)都会从内存中清除,接着从新场景中加载所有需要的对象
- 修改Transform.position将会忽略碰撞检测(Unity的碰撞用的第三方整合的,所以理论来说Transform系统和物理系统是两个单独的系统,所以移动操作应只利用其中一种)
- Mathf.Approximately(float, float):用于浮点数比较
- Order in Layer设置:控制绘制前后顺序(同层Z轴控制前后)
- 平视显示(HUD,heads-up display):使图形叠加在世界视图上
- OnGUI:立即模式的GUI系统,每帧显式发送绘制指令。会在每帧渲染完3D场景后执行
- 保留模式(retained mode):一次定义所有的视觉效果,系统知道会绘制什么,不需要重新声明
- Canvas组件
- 创建Canvas组件时随带的EventSystem是用于UI交互的
- Canvas中屏幕的一个像素对应的就是场景中的一个单位
- Render Moad
- Screen Space-Overlay:将UI渲染为摄像机视图顶部的2D图形
- Screen Space-Camera:将UI渲染在摄像机视图顶部,但UI元素可以旋转,得到透视效果
- World Space:将画布对象放在场景中,就好像UI是3D场景的一部分
- UI对象的锚点(anchor):对象依附到画布或屏幕的点,决定计算对象位置所依赖的点
- 切割图像(sliced image,九宫格):把图像切割成九份,各部分相互独立,分别缩放。从中间缩放图像边缘,可确保图像缩放为任何期望的尺寸,且边缘清晰
- 模型导入Model中Normals选项控制光线和阴影在模型上的显示
- Import:使用定义在导入网格几何体中的法线
- Calculate:让Unity自己计算每个多边形的法线
- 光照贴图(lightmapping):将几何体的阴影烘焙到贴图图像中
- Mesh Renderer中可控制是否投射阴影和是否接受阴影
- 位置向量乘于四元数,结果是基于旋转的偏移位置
- Vector3.ClampMagnitude:限制对角线,使其延轴移动的速度一样(从原点画圆)
- Animator中的动画过度
- Has Exit Time:迫使动画一直播放,而不是在变换发生时马上暂停
- Interruption Source改为Current State说明变换自身能被打断
美术资源
- 网格对象:指的是3D对象(连线和形状)的几何结构
- 模型:通常包括对象的其他属性
- 材质:一组信息,定义了附加材质对象的表面属性(颜色,发光等—)。多个对象可共享一个材质。每个材质都有一个控制它的着色器(可认为每种材质都是着色器的一个实例)
- 动画:定义关联对象的运动信息。运动能独立于对象自身定义,所以可以混合-匹配的方式用于多个对象(必须为同一种骨骼)
- 粒子系统:用于生成和控制大量运动对象的规则机制。运动对象通常较小所以被称为粒子系统。但并不一定要小
- 粒子:粒子系统控制的独立对象。可以是任何网络对象,但对于大多数效果,粒子显示图片的方块
- 贴图:用于提高3D图形效果的2D图像
- 用于显示在3D模型的表面
- 法线贴图使表面产生凹凸
贴图文件格式类型 优缺点 PNG 通常用于万维网。无损压缩,带透明 JPG 通常用于万维网。有损压缩,无透明 GIF 通常用于万维网。有损压缩,无透明(损耗并不是压缩造成的,是图片转为八位时导致数据丢失) BMP windows上默认模式。无压缩,无透明 TGA 通常用于3D图形(不常用)。无损压缩或不压缩,带透明 TIFF 通常用于数字相片和出版。无损压缩或不压缩,无透明 PICT 旧Macs系统默认格式。有损压缩,无透明 PSD Photoshop原生文件。无压缩,有透明 - 图像的压缩方式和是否有透明通道这两个是比较重要的因素
- 有透明通道会更好
- 不压缩和无损压缩保证质量,有损压缩降低了品质,但减小了文件大小(具体取舍有
- 贴图的大小应为2的次幂(从4~2048字节)
- 天空盒:是一个包围摄像机的立方体。每个面都是天空图片的贴图
- 着色器:一种简短的程序,列出了绘制表面的指令
- 一些Unity自带的着色器:
- Additive着色器:将粒子颜色叠加到它背后的颜色上的着色器,使颜色更加明亮,而粒子的黑色部分不可见。
- Multiply着色器:与Additive相反,使对象颜色更暗
- 一些Unity自带的着色器:
- 3D模型:美术资源可直接拖入引擎,unity会将文件导出为FBX然后重新加载到Unity中。尽量避免直接拖入美术资源,应将模型先导出为FBX后再直接导入到Unity为好。避免后续的资源修复问题和共享资源复杂等问题
- 可导入模型自带材质
3D模型文件类型 | 优缺点 |
---|---|
FBX | 网格和动画 |
Collada(DAE) | 网格和动画 |
OBJ | 只有网格;文本格式 |
3DS | 只有网格 |
DXF | 只有网格 |
使用粒子系统创建效果
粒子系统时创建和控制大量移动对象的规则机制
- 粒子系统总设置:
- Looping:是否一直循环播放
- Lifetime:粒子存在时间
- Speed:粒子移动速度
- Size:粒子大小
- Rotation:粒子的方向
- Color:给粒子染色
- Simulation Space:粒子的移动参考坐标系,一般来说静止的粒子用Local,移动的用World
- Emission:粒子发射的速度设置
- Shape:发射区域形状
- Size over Lifetime:粒子运动时的变大的缩小
- Rotation over Lifetime:粒子运动时的旋转
- Renderer:设置每个粒子的外观。甚至设置为网格
Sprite Packer(精灵图集)
将多个图片已网格的形式组合成一张大图片 优点:
- 紧凑的打包在一起避免空间浪费
- 减少加载的次数,避免卡顿
音频
文件格式支持
文件类型 | 优缺点 |
---|---|
WAV | Windows默认音频格式。未压缩 |
AIF | Mac默认音频格式。未压缩 |
MP3 | 压缩;文件小,损失一点质量 |
OGG | 压缩;文件小,损失一点质量 |
MOD | 音轨格式 |
XM | 音轨格式 |
数字音频工作原理
音频文件保存声音播放时由扬声器创建的波形。音频文件记录这些波时,会反复在短暂的时间间隔进行采样,并保存每次采样波的状态。采样记录得越频繁,就越能精确的记录波形随时间变化的细节(两次直接的间隙也就越小,意味着更多的数据量)。压缩声音通过一些列技巧减小文件的大小,包括丢弃不会被人听到的频率。
音频的导入设置
- Force To Mono:立体声转为单声道
- Load In Background:后台加载
- Default(默认平台设置)
- Load Type:一次性加载所有数据还是流式加载
- Compression Format:保存音频的数据格式(可能会被压缩)
立体声
立体声实际上在文件中记录了两个波形,一个用于左扬声器,一个用于右扬声器。为了减小尺寸,可将音频信息减半,把相同波形发送到两个扬声器,而不是分别发送到左右扬声器。
部署
方法中添加[PostProcessBuild]特性将会在构建之后立刻运行这个方法。
1[PostProcessBuild]
2public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
3 // ...
4}
贴图压缩
IOS设备使用PowerVR GPUs,因此可以使用优化的PVR贴图压缩
Android通常用ETC压缩方式,Unity默认使用它ETC2