《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相反,使对象颜色更暗
  • 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}

PlayerSetting的设置说明

平台定义列表

贴图压缩

IOS设备使用PowerVR GPUs,因此可以使用优化的PVR贴图压缩

Android通常用ETC压缩方式,Unity默认使用它ETC2