一、框架结构(接上篇Unity项目开发框架总结一)
-
Server(服务)
-
Res(资源)
-
Audio(音效)
-
Mono(管理器挂载总服务)
-
Component(组件)
-
EventListener(事件监听)
-
StateMachine(状态机)
-
UI(界面 )
【Server(服务)】
1、资源服务
2、异步加载Unity资源
3、音效服务
4、管理器总服务
【Component(组件)】
1、状态机组件
【UI(界面)】
①通过UIElementAttribute方式定义UI界面的相关信息
-
是否缓存
-
UI资源地址
-
层级
-
是否缓存
-
UI的预制体
-
UI层级
-
具体实例对象
②遮罩层级管理,使得生效对象始终在最上层。
③窗口的显示
-
字典中查找是否注册有对应的UI窗口类型
-
判断是否有对应实例化的窗口对象,若有则显示、设置根节点、放置最后且更新字体,若无则创建
-
设置遮罩,保证生效的只有最后的对象。
④C#GC机制处理
⑤UITips动画可自由进行录制以及添加动画事件
⑥字典里的遍历
⑦本地坐标转世界坐标
⑧ const与static readonly区别
二、遇到问题及反思
1、暂停与继续工程项目
timeScale不会影响Update和LateUpdate的执行速度,Update和LateUpdate的执行速度只与帧频有关.
timeScale会影响Time.deltaTime的值,所有我们所有通过Time.deltaTime计算的值都间接的受到timeScale的控制,例如(动画系统,粒子系统以及部分我们的游戏逻辑).
timeScale只会影响FixedUpdate的速度.
timeScale=0时,Update和LateUpdate依旧执行,FixedUpdate不会执行,Time.deltaTime = 0.所以动画,粒子,物理等系统都会暂停。
-
Unity中的Time.deltaTime是帧与帧相减出来的,即每帧的时间
作用:可以让运动的物体在相同的时间保持同样平均的速度进行运动,即保证每秒的效率都一样。
解释:两台电脑同时运行一秒钟,但他们在一秒钟运行的帧数是不一样的,让性能优越的电脑对象的速度变小,让性能差些的电脑速度快点,保证一秒钟里面的不同的电脑最终的运行效率都一样。
性能优越的电脑:
每秒的帧数多,帧与帧间隔就短Time.deltaTime数值就小,假设这个数值是0.1,乘与速度1,那么每帧速度是0.1, 假设一秒运行30帧,那么速度就是3。
性能差些的电脑:
电脑每秒的帧数少,帧与帧间隔就长Time.deltaTime数值就大,假设这个数值是0.3,乘与速度1,那么每帧速度是0.3, 假设一秒运行10帧,速度也是3。
2、屏幕后处理
3、动画事件
4、Character Controler
5、轨迹渲染器(trail Render)
6、导航组件
7、transform.parent.GetInstanceID()
8、相机跟随
放在LateUpdate函数里面,这和相机渲染以及帧刷新的先后顺序有关,Update是每一帧刷新一次,而LateUpdate是帧刷新完以后,再执行,如果把摄像机相关动作代码放在Update里面,就会出现这一帧里面的游戏物体还没有完全渲染完,就已经被摄像机给渲染到Game视图上了,这样给玩家的体验不是太好,如果放在LateUpdate里面,摄像机渲染到Game视图上的画面都是Update里面已经全部渲染完成的画面,这样给玩家的体验就比较好。
9、目标面向鼠标的旋转方式的实现
-
static Quaternion FromToRotation(Vector3 fromDiection, Vector3 toDirection)根据两个向量计算出旋转量,计算出来的旋转量为从fromDiection,旋转到toDirection的旋转量。得到对应这个方向的四元数旋转值;
-
从相机方向发出一根射线,指向鼠标的位置,以地面为碰撞点,返回对应的坐标