一、框架结构(接上篇Unity项目开发框架总结一)
-
Server(服务)
-
Res(资源)
-
Audio(音效)
-
Mono(管理器挂载总服务)
-
Component(组件)
-
EventListener(事件监听)
-
StateMachine(状态机)
-
UI(界面 )
【Server(服务)】
1、资源服务
![](https://i-blog.csdnimg.cn/blog_migrate/c630a6f8b7209aeff8021b4a9bca916b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7f159563e0ad0e4fb374fa33d8f66224.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a4878473e7b7631bbb7a1a9d8841f834.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3e9391316b9b9031aca25e492dff2a0a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/981cc7b37bdf78f3d4265dd77896f9c4.png)
2、异步加载Unity资源
![](https://i-blog.csdnimg.cn/blog_migrate/0862268cd8c7b867ad3c83ec717613a2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d3d89a090c88ec5faf736f0722b99033.png)
3、音效服务
![](https://i-blog.csdnimg.cn/blog_migrate/f41d03ca81ca67f8b2470483b3d4a25e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8f5168dda3801418ad1ef4b05159b31c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/01b1c528bba5149872140ecae4d88188.png)
4、管理器总服务
![](https://i-blog.csdnimg.cn/blog_migrate/9bacfbb2802e4bbe539b37f0a8a44195.png)
【Component(组件)】
1、状态机组件
![](https://i-blog.csdnimg.cn/blog_migrate/e96babca273cd305d4104a55b68aa0f2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/92b1c5acfe5368f236076b0693d74e8a.png)
【UI(界面)】
①通过UIElementAttribute方式定义UI界面的相关信息
-
是否缓存
-
UI资源地址
-
层级
-
是否缓存
-
UI的预制体
-
UI层级
-
具体实例对象
![](https://i-blog.csdnimg.cn/blog_migrate/b3e6b71f81803c5b1307f2ade8f8f900.png)
![](https://i-blog.csdnimg.cn/blog_migrate/652602f5b6b8440bb17245efaba0825e.png)
②遮罩层级管理,使得生效对象始终在最上层。
![](https://i-blog.csdnimg.cn/blog_migrate/3c5239c2f785b773525c93090fb47f93.png)
③窗口的显示
-
字典中查找是否注册有对应的UI窗口类型
-
判断是否有对应实例化的窗口对象,若有则显示、设置根节点、放置最后且更新字体,若无则创建
-
设置遮罩,保证生效的只有最后的对象。
![](https://i-blog.csdnimg.cn/blog_migrate/78e71715b87f4f957c3067eec1c0f126.png)
④C#GC机制处理
⑤UITips动画可自由进行录制以及添加动画事件
![](https://i-blog.csdnimg.cn/blog_migrate/70b472948e5bf0368e9e6eb4c5424298.png)
⑥字典里的遍历
![](https://i-blog.csdnimg.cn/blog_migrate/4b0a73e33ac54e7d15725acda4deea6d.png)
⑦本地坐标转世界坐标
⑧ 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的旋转量。得到对应这个方向的四元数旋转值;
-
从相机方向发出一根射线,指向鼠标的位置,以地面为碰撞点,返回对应的坐标