Unity项目开发框架总结二

一、框架结构(接上篇Unity项目开发框架总结一)

  • Server(服务)

  1. Res(资源)

  2. Audio(音效)

  3. Mono(管理器挂载总服务)

  • Component(组件)

  1. EventListener(事件监听)

  2. StateMachine(状态机)

  • UI(界面 )

【Server(服务)】

1、资源服务

①检查注册的类型是否需要缓存(是否注册进对象池中)
②从资源文件夹中加载Unity资源
③获取实例-普通Class、组件,如果类型需要缓存,会从对象池中获取,否则重新生成
④资源异步加载
1、异步加载游戏对象,优先从对象池中获取,若无则重新异步生成

2、异步加载Unity资源

使用ResourceRequest
⑤预制体实例化(通过路径,具体对象)
预制体获取后并不是显示在场景当中(它是个资源),需要进行实例化。

3、音效服务

①具体功能包括:全局音量控制、背景音量控制、特效音量控制、循环、暂停、静音
②背景音乐播放需要默认挂载在场景当中(不销毁)。
特效音乐需另外生成场景挂载,并加进列表当中缓存。
③特效音乐播放完毕后异步回收,特效时间短数量多适合异步回收,回收进对象池当中。
更新特效音乐播放器,如果已经被回收,则清空移除列表。

4、管理器总服务

①增添Update(更新)、FixedUpdate、LateUpdate事件,增添事件
通过一个脚本将Update的更新功能以委托事件的方式统一管理起来。

【Component(组件)】

1、状态机组件

非动画状态机,代码逻辑层面的有限状态机实现
①状态进入、更新采用拓展的方式切换

【UI(界面)】

UI层级管理(谁压住谁,上层出现时下层不能交互)、Tips、Loading等

①通过UIElementAttribute方式定义UI界面的相关信息

通过字典进行存储,循环遍历特性的方式来获取特性里的UI内容数据
UI特性:
  • 是否缓存
  • UI资源地址
  • 层级
UI元素:
  • 是否缓存
  • UI的预制体
  • UI层级
  • 具体实例对象

②遮罩层级管理,使得生效对象始终在最上层。

③窗口的显示

分两个重要步骤,一是窗口类型的选择,二是遮罩的处理(对应的窗口对象有且只有一个)
  1. 字典中查找是否注册有对应的UI窗口类型
  2. 判断是否有对应实例化的窗口对象,若有则显示、设置根节点、放置最后且更新字体,若无则创建
  3. 设置遮罩,保证生效的只有最后的对象。

④C#GC机制处理

由于C#本身有GC机制,当对象的引用为0的时候就会被垃圾回收,对应的引用则会被置为null, 但Unity里边,调Destroy删除一个Object,只是释放了Unity的资源(既外在显示的Unity对象),而在C#层面,这个Object对应的引用都还在,那么它便不会被当成垃圾回收掉,所以C#层的资源并没有释放,但是拿它的引用跟null做对比确实相等的。
因此,Unity的资源在被destroy之后,需考虑引用是否需要置Null,若下次依旧需要变更判断则置Null。

⑤UITips动画可自由进行录制以及添加动画事件

提示信息采用队列形式进行数据存储

⑥字典里的遍历

⑦本地坐标转世界坐标

⑧ const与static readonly区别

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、屏幕后处理

在渲染完后对图像进行处理,取出屏幕中已经渲染好的图像,先不显示,放入预定shader中进行再次处理显示。

3、动画事件

①animator.CrossFadeInFixedTime(animationName, 0.2f);--------直接播放对应名称的动画
Unity Blend Tree动画混合树使用入门教程_C#教程_脚本之家     ----------------BlendTree混合动画的原理和基本使用方式

4、Character Controler

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。(然而在 charactercontroler控制的运动中运动物体的Is Trigger=true时照样可以发生碰撞)
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
注意:其中一个需要加入刚体Rigbody。
当选择为触发器时,将不再被射线检测。
②实现可移动的组件

5、轨迹渲染器(trail Render)

①如使用在bullet中,在子弹销毁的同时需要将其放进对象池也需要将trail Render关掉,否则下次在不同位置使用时会出现子弹的拖尾从其他地方过来,影响游戏观感。

6、导航组件

7、transform.parent.GetInstanceID()

每个对象都有一个独特的ID,用次ID进行标识。

8、相机跟随

放在LateUpdate函数里面,这和相机渲染以及帧刷新的先后顺序有关,Update是每一帧刷新一次,而LateUpdate是帧刷新完以后,再执行,如果把摄像机相关动作代码放在Update里面,就会出现这一帧里面的游戏物体还没有完全渲染完,就已经被摄像机给渲染到Game视图上了,这样给玩家的体验不是太好,如果放在LateUpdate里面,摄像机渲染到Game视图上的画面都是Update里面已经全部渲染完成的画面,这样给玩家的体验就比较好。

9、目标面向鼠标的旋转方式的实现

  • static Quaternion FromToRotation(Vector3 fromDiection, Vector3 toDirection)根据两个向量计算出旋转量,计算出来的旋转量为从fromDiection,旋转到toDirection的旋转量。得到对应这个方向的四元数旋转值;

  • 从相机方向发出一根射线,指向鼠标的位置,以地面为碰撞点,返回对应的坐标

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值