Unity常用面试问题

GC针对的谁

new对象的时候,产生新对象
产生新对象:装箱,使用linq表达式的委托,new,字符串,使用委托的时候创建了新对象会产生gc,如果缓存了全局这个委托,则不会

GC是发生在什么时候

主动调collect接口以及内存分配不足的时候

如何避免gc

别new对象

GC的过程,为什么耗时

每一次GC会经历以下过程,堆上的对象越多,对象的引用越多,意味着GC所做的工作越多
1:GC会检查堆上所有的对象
2:GC会检查所有这些对象的引用是否仍在作用域
3:每个不在作用域的对象都会被标记为待删除
4:GC删除每个待删除的垃圾对象

渐进式gc,unity2019的分代垃圾收集功能

移动端的优化

GC,UGUI合批,网格重建,跨语言调用,IO,预制体加载大小(特效动态加载),ab包分类

卡牌鱼眼列表的实现

利用Horizontal Layout Group的控制自己缩放特性和item的缩放来修改content大小,监听鼠标事件

全面屏手机为什么可以自适应,自适应是怎么处理的

水滴屏:
修改父节点的anchorMin,跳过水滴

safeAreaRect.offsetMin = Vector2.zero;
safeAreaRect.offsetMax = Vector2.zero;
var resolution = canvas.pixelRect.size;
var offsetX = resolution.x - safeArea.width;
var offsetY = resolution.y - safeArea.height;
safeAreaRect.anchorMin = new Vector2(offsetX / resolution.x, offsetY / resolution.y);
safeAreaRect.anchorMax = new Vector2((resolution.x-offsetX)/ resolution.x, (resolution.y-offsetY)/ resolution.y);

有一个按钮点击了没有反应为什么 pc和手机上

raycast没勾选,被别人挡住了

c#的字典是什么实现的

Hash算法

无限列表的实现,格子划完超过1之后的做法,不需要每个设置数据,进去的一行设置位置就行了。滑到下面去怎么跟index变化进行对应

建个字典用数据索引和transform缓存

大地图划的很快,或者一下子缩小会不会看到一个图片没有加载出来或者一个空的地方

用九宫格加载和精确度低的图片解决

相机裁剪的流程

在这里插入图片描述
到裁剪空间后gpu删除不在-1,1,0,1范围内的点,部分内的切割, UnityObjectToClipPos
直接裁剪空间判断x,yz是否在-w,w之中

为什么函数出来后值类型离开后会自动释放

因为值类型是复制的,出栈后栈顶指针收缩复用那片区域,引用是在堆里面

stringbuilder实现

字符数组

texture导入的设置重要的设置

可读可写,类型,大小,压缩格式,minmap是否开启(开了增加内存,不开分辨率过高增加渲染压力,显存过大,传递数据drawcall更多)

头顶UI的优化技巧

1.使用3D做法,避免坐标转换,可以使用job放在其他线程处理旋转缩放,位置,缺点canvasgroup,以及布局组件之类的不好使用
2.判断视野范围内才更新
3.超过一定距离卸载,跟相机的距离
4.根据距离远近分帧更新
5.需要时更新,怪物移动以及相机更新
6.加载的时候分帧加载,避免同一帧创建多个
https://zhuanlan.zhihu.com/p/25670078
头顶文字合批 用srpbatch

TCP和UDP

tcp:按序到达,实时性没udp强,要连接才能发送,双向通信
udp:无法保证顺序,单向通信

大世界地图里面地形合并是动态合批还是静态合批

动态合批

大世界地图里面地形合并怎么合并的

不一定对,先记录:1.合并顶点数据,合并mesh 2.使用同一个材质,同一个大的贴图数据 3.不同的uv 在运行的时候动态合批

TextMeshPro怎么设置字体透明度

控制的是顶点的颜色不透明度,挂了个材质

动作和特效都是异步加载,要播放的时候怎么保证动作和特效是同时播的

1.动作和特效加载出来后都从播放时长-加载耗费的时长偏移开始播,虽然开头看不到,但是播放进度是一起的
2.特效和模型做一起,这样k动作的时候就可以一起k
3.预加载这两个资源
4.再就是只能特殊处理了,等加载完成再说

游戏开发中一堆怪物是怎么合批的,3d麻将模型是怎么合批的?

动态合批(unity自动处理)
顶点数量必须少于
使用相同的材质和着色器
缩放必须一致
不要求同一个图集

一个3D模型的批次是多少,游戏整体的批次是多少

一个角色20,整体是400,500

### Unity引擎面试常见问题及答案 #### 1. **Unity中的协程(Coroutine)是什么?它是如何工作的?** Unity的协程是一种特殊的函数,它可以在执行过程中暂停并在稍后继续执行。协程通过 `yield` 语句来控制暂停和恢复的逻辑。例如,可以使用 `yield return new WaitForSeconds(1f);` 来让协程等待一段时间后再继续执行。 协程本质上并不是多线程机制,而是基于主线程的异步操作。Unity会在每一帧检查协程的状态,并根据条件恢复执行。这种机制适用于需要分步骤执行的任务,如动画、加载资源或延迟执行某些逻辑。 ```csharp IEnumerator ExampleCoroutine() { Debug.Log("Start"); yield return new WaitForSeconds(2f); Debug.Log("After 2 seconds"); } ``` #### 2. **Unity中Awake()和Start()有什么区别?** - `Awake()`:在脚本实例被创建时调用,无论脚本是否启用。这是初始化对象的最佳时机,因为所有对象都已经被创建。 - `Start()`:仅在脚本启用时调用,并且在第一次更新帧之前运行。适合进行依赖于其他对象初始化完成的操作。 如果一个游戏物体被禁用然后重新启用,`Awake()`不会再次调用,但 `Start()`会重新执行[^1]。 #### 3. **Unity中的碰撞检测和触发器有什么区别?** Unity中的碰撞检测是基于物理引擎的离散时间步长算法。物理引擎会根据物体的速度、加速度和碰撞体的形状等信息,模拟每一帧中物体的位置和速度以判断是否发生碰撞。当发生碰撞时,物理引擎会计算碰撞的法线、相对速度等信息,并根据物体的质量和碰撞体的属性计算力学反应。 另一方面,触发器(Trigger)与普通碰撞器的主要区别在于: - 碰撞器(IsTrigger = false)会产生物理碰撞效果,并触发 `OnCollisionEnter/Stay/Exit` 函数。 - 触发器(IsTrigger = true)不会产生物理碰撞效果,但会触发 `OnTriggerEnter/Stay/Exit` 函数[^3]。 #### 4. **Unity中的AssetBundle是什么?它的作用和使用场景是什么?** AssetBundle 是 Unity 提供的一种资源打包机制,允许将资源(如模型、纹理、音频等)从主项目中分离出来,并在运行时按需加载。这种方式非常适合用于热更新、减少初始加载时间以及动态加载不同平台的资源。 使用 AssetBundle 的主要流程包括: - 打包资源:使用 `BuildPipeline.BuildAssetBundles` 方法生成 AssetBundle 文件。 - 加载资源:通过 `AssetBundle.LoadFromFile` 或网络下载方式加载。 - 卸载资源:使用 `AssetBundle.Unload` 来释放不再使用的资源,避免内存泄漏。 ```csharp AssetBundle bundle = AssetBundle.LoadFromFile("path/to/bundle"); GameObject asset = bundle.LoadAsset<GameObject>("assetName"); ``` #### 5. **Unity中如何优化性能?** 性能优化可以从多个方面入手: - **Draw Call优化**:尽量合并材质球和网格,使用静态批处理或动态批处理。 - **内存管理**:合理使用对象池,及时释放不再使用的资源,避免频繁的垃圾回收。 - **物理引擎优化**:减少不必要的刚体组件,调整合适的固定时间步长(Fixed Timestep)。 - **渲染优化**:降低分辨率、减少阴影质量、使用LOD(Level of Detail)技术。 - **脚本优化**:避免在 Update 中执行复杂逻辑,合理使用协程代替频繁的 Invoke 调用。 #### 6. **Unity中的Shader有哪些类型?它们的区别是什么?** Unity 支持多种类型的 Shader: - **Surface Shader**:简化了光照和表面交互的编写,适合处理复杂的光照模型。 - **Vertex and Fragment Shader**:更底层的着色器类型,提供更高的灵活性,适用于自定义渲染效果。 - **Compute Shader**:用于通用计算任务,常用于图像处理、粒子系统等高性能需求场景。 #### 7. **Unity中如何实现跨平台适配?** Unity 天生支持跨平台开发开发者可以通过以下方式确保良好的跨平台表现: - 使用 Unity 的 UI 系统(如 Canvas 和 Rect Transform)自动适应不同分辨率。 - 对于输入系统,统一使用 Input Manager 或新输入系统(Input System Package)处理不同设备的输入方式。 - 针对不同平台设置特定的构建配置,如 iOS、Android、PC 等,分别优化资源和功能。 #### 8. **Unity中如何实现热更新?** 热更新通常通过 Lua 脚本结合 C# 实现。常用的方案包括: - 使用 tolua、uLua、xLua 等插件将 Lua 集成到 Unity 中。 - 将核心逻辑写在 Lua 脚本中,通过 C# 调用 Lua 函数。 - 在服务器上部署新的 Lua 脚本,客户端在运行时下载并替换旧版本,从而实现无需重新发布应用的更新。 #### 9. **Unity中如何管理多个场景?** Unity 提供了 SceneManager 类来管理多个场景: - 加载场景:`SceneManager.LoadScene("SceneName")` - 异步加载:`SceneManager.LoadSceneAsync("SceneName")` - 加载多个场景:`SceneManager.LoadScene("Scene1", LoadSceneMode.Additive)` - 卸载场景:`SceneManager.UnloadSceneAsync("SceneName")` #### 10. **Unity中如何实现动画状态机?** Unity 使用 Animator Controller 来管理动画状态机。开发者可以定义多个动画状态(如 Idle、Run、Jump),并通过参数(如 bool、int、float)控制状态之间的切换。例如,当角色速度大于某个阈值时,从 Idle 切换到 Run 状态。 Animator 还支持混合树(Blend Tree),可以根据参数(如移动速度)平滑地在多个动画之间过渡。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值