Unity项目开发框架总结二

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

  • Server(服务)

  1. Res(资源)

  2. Audio(音效)

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

  • Component(组件)

  1. EventListener(事件监听)

  2. StateMachine(状态机)

  • UI(界面 )

【Server(服务)】

1、资源服务

①检查注册的类型是否需要缓存(是否注册进对象池中)
Unity项目开发框架总结二_第1张图片
②从资源文件夹中加载Unity资源
Unity项目开发框架总结二_第2张图片
③获取实例-普通Class、组件,如果类型需要缓存,会从对象池中获取,否则重新生成
Unity项目开发框架总结二_第3张图片
Unity项目开发框架总结二_第4张图片
④资源异步加载
1、异步加载游戏对象,优先从对象池中获取,若无则重新异步生成

2、异步加载Unity资源

使用ResourceRequest
Unity项目开发框架总结二_第5张图片
⑤预制体实例化(通过路径,具体对象)
预制体获取后并不是显示在场景当中(它是个资源),需要进行实例化。
Unity项目开发框架总结二_第6张图片

3、音效服务

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

4、管理器总服务

①增添Update(更新)、FixedUpdate、LateUpdate事件,增添事件
通过一个脚本将Update的更新功能以委托事件的方式统一管理起来。
Unity项目开发框架总结二_第10张图片

【Component(组件)】

1、状态机组件

非动画状态机,代码逻辑层面的有限状态机实现
①状态进入、更新采用拓展的方式切换
Unity项目开发框架总结二_第11张图片
Unity项目开发框架总结二_第12张图片

【UI(界面)】

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

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

通过字典进行存储,循环遍历特性的方式来获取特性里的UI内容数据
UI特性:
  • 是否缓存
  • UI资源地址
  • 层级
UI元素:
  • 是否缓存
  • UI的预制体
  • UI层级
  • 具体实例对象
Unity项目开发框架总结二_第13张图片
Unity项目开发框架总结二_第14张图片

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

Unity项目开发框架总结二_第15张图片

③窗口的显示

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

④C#GC机制处理

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

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

提示信息采用队列形式进行数据存储
Unity项目开发框架总结二_第17张图片

⑥字典里的遍历

Unity项目开发框架总结二_第18张图片

⑦本地坐标转世界坐标

Unity学习笔记—本地坐标转世界坐标 - 百度文库

⑧ const与static readonly区别

const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。
而static readonly,在程式中只读, 不过它是在运行时计算出其值的,所以还能通过静态构造函数来对它赋值,

二、遇到问题及反思

四、遇到的问题

1、暂停与继续工程项目

Unity项目开发框架总结二_第19张图片

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中进行再次处理显示。
https://blog.csdn.net/qq_31910239/article/details/11908    0163
(九)unity Shader之——————屏幕后处理效果(原理以及实现一个简单的屏幕后处理效果)_unity blit原理-CSDN博客

3、动画事件

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

4、Character Controler

①触发器与碰撞器的区别: Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)_unity3d中的碰撞器和触发器的区别?-CSDN博客
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。(然而在 charactercontroler控制的运动中运动物体的Is Trigger=true时照样可以发生碰撞)
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
注意:其中一个需要加入刚体Rigbody。
当选择为触发器时,将不再被射线检测。
②实现可移动的组件
【Unity】多种方法实现第一人称角色移动(一)角色控制器CharacterController-布布扣-bubuko.com
Character Controller角色控制器组件-CSDN博客

5、轨迹渲染器(trail Render)

①如使用在bullet中,在子弹销毁的同时需要将其放进对象池也需要将trail Render关掉,否则下次在不同位置使用时会出现子弹的拖尾从其他地方过来,影响游戏观感。
② unity组件之 Trail Render(轨迹渲染器)_unity trail_unity工具人的博客-CSDN博客

6、导航组件

Unity-八(导航和寻路)_navmesh 45度图片_Two-way-Foil的博客-CSDN博客
unity自带寻路(导航)系统 Nav Mesh导航网格_C#教程_脚本之家

7、transform.parent.GetInstanceID()

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

8、相机跟随

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

Unity项目开发框架总结二_第20张图片

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

Unity项目开发框架总结二_第21张图片

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

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

你可能感兴趣的:(开发总结,unity,游戏引擎)