Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Unity Day16

1.如果在 Unity 中制作 FPS 游戏,如何模拟机械开枪的后坐力

答案: 每次开枪时,可以给枪械、手臂 IK、摄像机等(根据实际视角情况决定) 一个绕 x 轴(往上偏移)和 y 轴(左右偏移)的旋转角度 并且每一帧都会归位(角度四元数不行像原始位置归为)

2.Unity 中存在多线程,继承 MonoBehaviour 的脚本是否有必要对其中内容加锁?为什么?

答案: 分情况讨论

  1. 如果是想要通过多线程控制或者访问或访问场景上对象的相关行为,比如移动旋转、资源加载、动态销毁等等,那么不用加锁 因为 Unity 的整个执行模型是单线程的,所有的游戏逻辑和渲染都是在主线中进行。 大部分的 UnityAPI 都只能在主线程上调用,如果过通过多线程去调用 Unity 场景上物体的相关 API,或改变场景中对象的相关属性,会直接出现报错。 因此这种情况加锁也没有意义
  2. 如果是想要通过多线程改变继承 MonoBehaviour 脚本中的某些公共成员,比如一个 int,一个 List。那么可以为这些公共成员加锁,防止线程并发带来的问题。
  3. 但是建议尽量不要通过多线程和继承 MonoBehaviour 的挂载在场景中的脚本打交道

3.我们在 Unity 中进行一些复杂逻辑处理时,比如网络通讯、寻路算法,往往会开启多线程进行处理,我们如何保证数据能够和 Unity 主线进行正常交互?

答案:

  • 对共享内容加锁,避免多线程并发带来的数据竞争问题
  • 是用 C# 中线程安全的数据结构存储共享数据 比如 System.Collections.Concurrent 命名空间中的 ConcurrentQueue<>和 ConcurrentDictionary<>
  • Unity 中的 Dots 系统

4.Shader 中的 Blend 渲染命令主要是用来干什么?

答案: 用于进行颜色混合的 将 当前片元的颜色 和 颜色缓冲区中的颜色 进行混合计算

一般可以用来实现半透明相关效果,光照颜色叠加相关效果等等

5.Shader 当中的 Blend 渲染命令后面跟的参数是用来干嘛的?

例如:

1
Blend SrcAlpha OneMinusSrcAlpha

答案: Blend 混合命令跟的参数有两种写法 这些因子是一些特定的参数,用于参与混合计算

  • 写法一 输出颜色 rgb = 源因子 * 片元颜色的 rgb + 目标因子 * 颜色缓冲区中颜色的 rgb 输出颜色的 a = 源透明因子 * 片元颜色的 a + 目标透明因子 * 颜色缓冲区中颜色的 a
  • 写法二 输出颜色 rgb = 源因子 * 片元颜色的 rgb + 目标因子 * 颜色缓冲区中颜色的 rgb 输出颜色的 a = 源因子 * 片元颜色的 a + 目标因子 * 颜色缓冲区中颜色的 a

评论