一问一答 (Unity篇)
Unity 是否支持写成多线程程序? 如果支持的话需要注意什么?
- 仅能重主线程中访问
Unity的组件, 对象和系统调用. - 支持: 如果同时需要处理很多失修或者与
Unity的对象互动小的可以使用thread, 否则使用coroutine - 注意:
C#中有lock这个关键字, 以确保只有一个线程可以在特定事件内访问特定的对象
Unity 的协程和 C# 的线程区别是什么?
- 多线程程序同时运行多个线程, 而在任一指定时刻只有一个协程在运行, 并且这个正在运行的协同程序只在必要的时候才被挂起.
- 除主线程之外的线程无法访问
Unity的组件, 对象, 方法. - 在主线程运行时同时开启另一段逻辑处理, 来协助当前程序的执行, 换句话说, 开启协程就是开启一个线程, 可以用来控制运动和序列以及对象的方法.
四元数的作用, 四元数对欧拉角的优点?
- 能进行增量旋转
- 避免万向锁
- 给定方位的表达方式只有两种, 互为负, 而欧拉角有无数种表达方式.
向量的点乘, 叉乘以及归一化的意义?
- 点乘描述了两个向量的相似程度, 结果越大两向量越相似, 还可以表示投影
- 叉乘得到的向量表示垂直于原来的两个向量
- 标准化向量: 用在只关系方向, 不关心大小的时候
在场景中放置多个Camera并同时处于活动状态会发生什么?
实际看到的画面由多个camera的画面组成 由 depth Clear Flag Culling Mask(遮罩剔除)都会影响其最终合成效果.
Prefab的作用? 如何在移动环境的设备恰当使用?
在游戏运行实例化, prefab 相当于一个模板, 对你已有的素材, 脚本, 参数做一个默认配置, 以便于以后修改, 同时 prefab
打包的内容简化了导出的操作, 便于团队的交流.
如何在不同工程安全地迁移数据
- 将
Assets目录和Library目录一起迁移 - 导出包
- 用
Unity自带的Assets Server功能
MeshRender中Material和SharedMaterial的区别?
修改SharedMaterial将改变所有使用这个材质的物体的外观, 并且也会改变存储在工程里的材质设置. 不推荐修改SharedMaterial
返回的材质. 如果实在想修改渲染器的材质, 使用Material代替.
请描述游戏动画有哪几种及其原理?
- 关节动画: 把角色分成若干独立部分, 一个部分对应一个网格模型, 部分的动画连接成一个整体的动画, 角色比较灵活. 其中
Quake2内使用了该动画. - 单一网格模型动画: 由一个完整的网格模型构成, 在动画序列的关键帧里记录各个顶点的原位置及其改变量, 然后插值运算实现动画效果, 角色动画较真实
- 骨骼动画: 广泛应用的动画方式, 集成了以上两个方式的优点, 骨骼按角色特点组成一定的层次结构, 由关节相连, 可做相对运动, 皮肤作为单一网格蒙在骨骼之外, 决定角色的外观, 皮肤每一个顶点都会受到骨骼的影响, 从而实现完美的动画. (骨骼动画时由关节动画发展而来的, 如今基本都使用骨骼动画来实现角色动画).
Alpha Blend 的工作原理?
实际显示颜色 = 当前颜色 Alpha / 255 + 背景颜色 (255 - Alpha) / 255
LOD是什么? 优缺点是什么?
LOD技术即Levels of Detail的简称, 意为多细节层次.
LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度, 决定物体渲染的资源分配, 降低非重要物体的面数和细节度, 从而获得高效率的渲染运算.
- 优点: 可根据距离动态的选择渲染不同细节的模型
- 缺点: 加重美工的负担, 要准备不同细节的同一模型, 同样的会稍微增加游戏的容量.
MipMap是什么? 作用?
在三维计算机图形的贴图渲染中有一个常用的技术被称为MiaMapping.为了加快渲染速度和减少图像锯齿,
贴图被处理由一系列被预先计算和优化过的图片组成的文件, 这样的贴图被称为MipMap
碰撞器和触发器的区别?
collider碰撞器会有碰撞效果, isTrigger = false, 可以调用OnCollisionEnter/Stay/Exit函数.
trigger触发器没有碰撞效果, isTrigger = true, 可以调用OnTriggerEnter/Stay/Exit函数.
物体发生碰撞的必要条件?
其一必须带有collider+rigidbody或者characterController, 另一物体也必须至少带有collider
什么叫做链条关节?
Hinge Joint, 他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,
但是达到固定距离后就会产生拉力. (简单说就是弹簧)
Unity从唤醒到销毁有一段生命周期, 请列出系统自己调用的几个重要方法.

Awake -> OnEnable -> Start ->Update -> FixedUpdate -> LateUpdate
-> OnDisable -> OnDestroy
FixedUpdate: 每固定帧绘制时执行一次, 和 update 不同的是 FixedUpdate 是渲染帧执行,
如果你的渲染效率底下的时候 FixedUpdate 调用次数就会跟着下降.
FixedUpdate比较适用于物理引擎的计算, 因为是跟每帧渲染有关.
Update 就比较适合做控制.
垃圾回收
Unity 现在还是使用了相对比较保守的内存回收,也就是贝母回收,它有几个特点:
- 不分代、不合并,所以它可能会导致内存碎片。
- 所有保守式内存回收全都是非精准式回收。
非精准式回收
非精准的含义有两个:
- 已经分配出去的内存,但没有人在引用它的情况下,不一定能收的回来。
- 没有分配使用的内存,当想去分配使用的时候,也不一定用的了。
动态加载资源的方式
Resources.Load
- 只能加载
Resources下的资源
- 网络请求
WWW(弃用)或者UnityWebRequest
- 任意位置, 比方远程服务器
- 或者本地路径
AssetBundle.LoadFromFileAddressable
- 3是4的底层实现
坐标空间
确保矩阵线性/仿射变换的便利
- 模型空间(局部空间/对象空间) 左手系
- 世界空间
- 观察空间
- 剪裁空间
- 正交到透视
- 屏幕空间
切线空间