生命周期
顺序
Awake-OnEnable-Start-FixedUpdate-Update-FixedUpdate-OnGUI-OnDisable-OnDestroy
UI
Image
Image & Raw Image
Image | Raw Image | |
图片源 | Sprite | Texture |
主要功能 | 常规交互; tiling、filling等。 | UV Rect,实现图片的偏移等; 可以借助render texture实现将摄像机拍摄图像投射到图片上的功能。 |
Texture & Image & Sprite
Sprite | Image | Texture | |
描述 | 精灵图,是Unity中Assets的一种,2D图像。 | 图片,是UI系统中的概念。 | 材质,是Unity中Assets的一种 |
Sprite是将Texture应用在平面的mesh上得到的对象。
如果是2D的项目,Image导入进来的时候就是Sprite格式的;如果是3D的项目,Image导入进来的时候就是Texture格式的。
Rect Transform & Transform
Rect Transform | Transform | |
适用对象 | 2D的UI | 3D世界中的物体 |
属性 | 多了pivot、长宽、anchors | 只有位置、旋转、缩放 |
在不同分辨率下保持一致性
保证UI的一致性:
- 屏幕分辨率的自适应
- 摄像机的size
- Scaler Canvas中的Scale with screen size
- Rect Transform
渲染顺序
- Camera的Depth
- Sorting Layer
- Order in Layer
物理系统
物理移动方式
Transform | Character Controller | RigidBody | NavMeshAgent | |
移动方式 | transform.Translate(Vector3) | cc.Move(Vector3) | rigidBody.AddForce(Vector3) | agent.SetDestination(targetPosition) |
特点 | 设定移动距离 | 移动一段距离 | 添加一个某方向的力 | 设定导航方向 |
注意RigidBody和CharacterController不可以同时使用。
旋转和定位
Transform中用欧拉角的方式显示方向,但是实际存储中用的是四元数。
动画系统
动画的种类:关节动画、骨骼动画、帧动画
AI导航系统
Shader
渲染流程
GPU的图形处理流水线:顶点处理-光栅化-纹理贴图-像素处理-光栅化引擎进行输出
Render Pipeline
- 应用阶段(CPU):
- 准备好需要渲染的数据
- 剔除不可见
- 设置渲染状态(包括使用的材质、纹理、shader)
- 输出渲染图元:渲染图元可以是点、线、三角形等
- 几何阶段(GPU):决定绘制的图元是什么,怎样绘制,在哪里绘制。重要人物就是将顶点坐标变换到屏幕空间中
- 顶点着色器(转换位置、顶点着色)
- 裁剪、屏幕映射
- 输出屏幕空间的二维顶点信息、每个顶点对应的深度值,着色等相关信息
- 光栅化阶段(GPU):用几何阶段产生的数据来产生屏幕上的像素,并且渲染出最终的图像。
- 三角形设置
- 三角形遍历(输出片元列表)
- 片元着色器(插值处理)
- 逐片元操作(模板测试、深度测试、混合)
顶点着色器
位于渲染管线的几何阶段,顶点着色器的输入来自CPU,顶点着色器的处理单位是顶点,也就是输入进来的每一个顶点都会调用一次顶点着色器。
- 完成的工作:
- 坐标变换:把顶点坐标从模型空间转换到齐次裁剪空间。之后硬件会做透视除法,最终得到归一化的设备坐标。
- 逐顶点光照
- 输入后续阶段所需的数据。
屏幕映射
这一步的输入是顶点着色器传入的变换后的齐次裁剪空间坐标,仍然是三维的。屏幕映射会将这个三维的齐次裁剪空间坐标转换成二维的屏幕坐标。
MipMap & LOD
- LOD: levels of details, 可以将高模和低模的模型结合成一个lod的模型,实现距离近的精度高,距离远的显示低模的效果。
- 缺陷:增加了内存
- Mipmap:2D图片的的LOD,无序自己上传模型,可使用内嵌函数实现近清晰远模糊的效果。
LightMap
可以将静态光源的信息(颜色,阴影,方向等)存储到texture上,渲染静态的物体时,无需进行多个light pass,直接从texture中进行采样计算即可。
DrawCall
含义:CPU调用图像编程接口、以及命令GPU进行渲染的操作。
为什么DarwCall会影响帧率:每一次CPU向GPU发送内容的时候,包含数据、状态、命令等,在这一阶段,CPU需要完成的准备工作是很多的,但是GPU的渲染能力很强,因此往往是GPU渲染速度快于CPU的命令提交速度。如果DrawCall数量太多,CPU就会过载。
减少DrawCall的解决方案:批处理
由于合并是需要时间的,所以批处理更适合不会动的静态物体;如果是动态的物体,每一帧都需要重新进行合并之后再发送给GPU。
其他避免的方案:避免使用很小的网格,避免使用过多的材质。
合批
资源管理
PlayerPrefs
- 原理:将关键数值用键值对的形式保存在本地
- 存储位置:
- Window平台:
- HICU\Software[公司名称][产品名称] 项下的注册表中
- 其中公司名称和产品名称是在“Project Settings”中设置的名称
- Win+R运行——regedit——HKEY_CURRENT_USER——SOFTWARE——Unity——UnityEditor——公司名——产品名
- Android:
- /data/data/包名/shared_prefs/pkg-name.xml
- IOS:
- /Library/Preferences/[应用ID].plist
- 适合场景:没有服务器的单机游戏
- 优缺点
- 优点:简单方便
- 缺点:支持的数据类型太少,且每一个key只能存储一个值
动态加载资源的方式
- Instantiate
- AssetBundle
- Resources.Load
- AssetDatabase.Loadasset