【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

慈云数据 8个月前 (03-12) 技术支持 127 0

2.2

请添加图片描述


前言

  • 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】
  • 为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新的内容,并对之前的版本中有些模糊的地方进行了纠正。
  • 所以本篇文章就来整理一下Unity基础篇的面试题,说不准就会面试的时候就会遇到!

    【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

        • 前言
        • 🧡Unity基础知识面试篇
            • 1. Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,列出系统自带的几个重要的方法。
            • 2. Unity3D中的碰撞器和触发器的区别?
            • 3. 物体发生碰撞的必要条件?
            • 4. 简述Unity3D支持的作为脚本的语言的名称?
            • 5. .Net与Mono的关系?
            • 6. OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
            • 7. 移动相机动作在哪个函数里,为什么在这个函数里?
            • 8. 物理更新一般放在哪个系统函数里?
            • 9. Unity提供了几种光源,分别是什么?
            • 10. 简述四元数Quaternion的作用,四元数对欧拉角的优点?
            • 11. CharacterController和Rigidbody的区别?
            • 12. localPosition 与 Position 的使用区别?
            • 13. 简述prefab的用处
            • 14. 简述进程、线程、协程的概念
            • 15. 简述协程的作用
            • 16. 简述协程的底层原理
            • 17. 线程与协程的区别
            • 18. 简述Invoke与InvokeRepeating
            • 19. 简述Invoke与协程的区别
            • 20. 正在运行的脚本,隐藏物体与禁止脚本导致触发OnDisable时,Invoke与coroutine是否正常运行?
            • 21. 在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数 三个阶段
            • 22. Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
            • 23. 物体自身旋转使用的函数?物体绕某点旋转使用函数叫什么?
            • 24. Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数
            • 25. Image和RawImage的区别
            • 26. TCP/IP协议栈各个层次及分别的功能?
            • 27. 在场景中放置多个Camera并同时处于活动状态会发生什么?
            • 28. 如何销毁一个UnityEngine.Object及其子类?
            • 29. 请描述游戏动画有哪几种,以及其原理?
            • 30. 请描述为什么Unity3d中会发生在组件上出现数据丢失的情况
            • 31. alpha blend工作原理?
            • 32. 写出光照计算中的diffuse的计算公式?
            • 33. LOD是什么,优缺点是什么?
            • 33. 两种阴影判断的方法、工作原理?
            • 34. Vertex Shader是什么,怎么计算?
            • 35. MipMap是什么,作用?
            • 36. 请描述Interface与抽象类之间的不同
            • 37. 如何安全的在不同工程间安全地迁移asset数据?三种方法
            • 38. 简述一下对象池,你觉得在FPS里哪些东西适合使用对象池?
            • 39. Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
            • 40. 如何让已经存在的GameObject在LoadLevel后不被卸载掉?
            • 41. U3D中用于记录节点空间几何信息的组件名称,及其父类名称
            • 42. 向量的点乘、叉乘以及归一化的意义?
            • 43. 矩阵相乘的意义及注意点?
            • 44. 当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
            • 45. 为什么dynamic font在unicode环境下优于static font
            • 46. 请简述如何在不同分辨率下保持UI的一致性
            • 47. 请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
            • 48. 什么叫动态合批?跟静态合批有什么区别?
            • 49. 动态加载资源的方式?
            • 50. 什么是LightMap?
            • 51. Unity和cocos2d的区别
            • 52. Unity3D Shader分哪几种,有什么区别?
            • 53. 获取、增加、删除组件的命令分别是什么?
            • 54. Unity中,照相机的Clipping Planes的作用是什么?调整 Near、Far两个值时,应该注意什么?
            • 55. GPU的工作原理?
            • 56. 什么是渲染管道?
            • 57. Unity中如何优化内存,简述一些常用的方法。
            • 58. 使用Unity3d实现2d游戏,有几种方式?
            • 59. 请问alpha test在何时使用?能达到什么效果?
            • 61. 将Camera组件的ClearFlags选项选成Depth only是什么意思?有何用处?
            • 62. 什么叫做链条关节?
            • 63. 在编辑场景时将GameObject设置为Static有何作用?
            • 64. 有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染?
            • 65. 将图片的TextureType选项分别选为Texture和Sprite有什么区别
            • 66. 问一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别?为什么?
            • 67. 什么是DrawCall?DrawCall高了又什么影响?如何降低DrawCall?
            • 68. 实时点光源的优缺点是什么?
            • 69. 如何在Unity3D中查看场景的面数,顶点数和Draw Call数?
            • 70. Addcomponent后哪个生命周期函数会被调用
            • 72. 层剔除
            • 73. 分别解释顶点着色器和像素着色器是什么
            • 74. 画布的三种模式.缩放模式
            • 75. FSM有限状态机
            • 76. 行为树与有限状态机
            • 77. 简述行为树的概念及优缺点
            • 78. Text 和 TMPText的区别 优缺点
            • 79. 红点系统的实现
            • 80. Animation和Animator的区别
            • 81. 简述SkinnedMesh的实现原理
            • 82. MeshRender中material和sharedmaterial的区别?
            • 83. ScriptableObejct
            • 84. unity常用资源路径有哪些
            • 85. 使用过哪些Unity插件

              请添加图片描述


              🧡Unity基础知识面试篇

              1. Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,列出系统自带的几个重要的方法。

              答:Awake —> OnEnable —> Start —> FixedUpdate —>Update —> LateUpdate—> OnGUl —> OnDisable —> OnDestroy

              主要执行顺序

              编辑器->初始化->物理系统->输入事件->游戏逻辑->场景渲染->GUI渲染->物体激活或禁用->销毁物体->应用结束

              主要函数介绍

              • Reset 是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。
              • Awake 用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次,当脚本设置为不可用时,运行时Awake方法仍然会执行一次。Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。每个游戏物体上的Awke以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息 ,Awake总是在Start之前被调用。它不能用来执行协同程序。
              • OnEnable当对象变为可用或激活状态时被调用事件监听。
              • Start 在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。
              • FixedUpdate 当MonoBehaviour启用时,其在每一帧被调用。处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)。
              • Update 是实现各种游戏行为最常用的函数。
              • LateUpdate 每帧调用一次(在 在所有Update函数调用后被调用) 用于更新游戏场景和状态,和摄像机相关的更新。 官网上例子是摄像机的跟随,都是所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
              • OnGUI 渲染和处理GUI事件时调用。这意味着你的OnGUI程序将会在每一帧被调用。要得到更多的GUI事件的信息查阅Event手册。如果Monobehaviour的enabled属性设为false,OnGUI()将不会被调用。
              • OnDisable 不能用于协同程序。当对象变为不可用或非激活状态时此函数被调用。
              • OnDestroy 当对象被销毁时调用。
              • OnApplicationQuit 当用户停止运行模式时在编辑器中调用。当web被关闭时在网络播放器中被调用。

                生命周期图览:

                在这里插入图片描述

                某位大哥自己画的图:Unity 生命周期

                在这里插入图片描述

                2. Unity3D中的碰撞器和触发器的区别?

                答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。

                当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;

                当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。

                如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器。

                3. 物体发生碰撞的必要条件?

                答:两个物体都必须带有碰撞器Collider,其中一个物体还必须带有Rigidbody刚体。

                4. 简述Unity3D支持的作为脚本的语言的名称?

                Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案

                Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。

                Unity支持的语言:C#,JavaScrip(不在使用)

                5. .Net与Mono的关系?

                mono是.net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。

                .net只能在windows下运行,mono可以实现跨平台编译运行,可以运行于Linux,Unix,Mac OS等。

                6. OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?

                答:Awake–>OnEnable->Start

                OnEnable在同一周期中可以反复地发生!

                7. 移动相机动作在哪个函数里,为什么在这个函数里?

                LateUpdate,是在所有的Update结束后才调用,比较适合用于命令脚本的执行。

                官网上例子是摄像机的跟随,都是所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

                8. 物理更新一般放在哪个系统函数里?

                在Unity中,物理更新通常放在FixedUpdate函数中,而不是放在Update函数中。Update函数是每一帧都会调用的函数,用于处理物体的位置、旋转和缩放等变换,但它不适用于物理计算,因为它的执行频率高于FixedUpdate。

                FixedUpdate函数在每一帧的固定时间间隔内调用,用于执行物理模拟和碰撞检测。因此,如果你的代码涉及到物理模拟或碰撞检测,应该放在FixedUpdate函数中。

                以下是一个简单的示例,演示如何在Unity中将物理更新放在FixedUpdate函数中:

                using UnityEngine;
                public class MyRigidbodyComponent : MonoBehaviour
                {
                    void FixedUpdate()
                    {
                        // 更新物理状态
                        Rigidbody rb = GetComponent();
                        if (rb != null)
                        {
                            // 更新刚体的速度和位置
                            rb.velocity = transform.right * speed;
                            rb.MovePosition(rb.position + rb.velocity * Time.fixedDeltaTime);
                        }
                    }
                }
                

                在上面的示例中,FixedUpdate函数被用于更新刚体的速度和位置,以便模拟物理行为。注意使用Time.fixedDeltaTime来确保物理更新的帧率是固定的,以获得更准确的模拟效果。

                9. Unity提供了几种光源,分别是什么?

                四种。

                • 平行光:Directional Light
                • 点光源:Point Light
                • 聚光灯:Spot Light
                • 区域光源:Area Light
                  10. 简述四元数Quaternion的作用,四元数对欧拉角的优点?

                  答:四元数⽤于表示旋转,对旋转⻆度进⾏计算时⽤到四元数

                  相对欧拉⻆的优点:

                  1)能进⾏增量旋转

                  2)避免万向锁

                  3)给定⽅位的表达⽅式有两种,互为负(欧拉⻆有⽆数种表达⽅式)

                  11. CharacterController和Rigidbody的区别?

                  Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的。

                  12. localPosition 与 Position 的使用区别?

                  localPosition :自身坐标系,相对于父级的位置

                  Position :世界坐标系中的位置

                  13. 简述prefab的用处

                  在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,主要用于经常会用到的物体做成一个集合方便反复使用,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。

                  14. 简述进程、线程、协程的概念

                  进程

                  • 保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,不同进程间可以进行进程间通信,上级挂靠单位是操作系统。一个应用程序相当于一个进程,操作系统会以进程为单位,分配系统资源(CPU 时间片、内存等资源),进程是资源分配的最小单位。

                    线程

                    • 线程从属于进程,也被称为轻量级进程,是程序的实际执行者。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条- 线程并行执行不同的任务。一个线程只有一个进程。
                    • 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
                    • 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

                      协程

                      • 协程是伴随着主线程一起运行的一段程序。
                      • 协程与协程之间是并行执行,与主线程也是并行执行,同一时间只能执行一个协程提起协程,自然是要想到线程,因为协程的定义就是伴随主线程来运行的。
                      • 一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制。
                      • 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
                      • 协成是单线程下由应用程序级别实现的并发。
                        15. 简述协程的作用

                        在Unity中,协程是一种轻量级的线程,用于在单一线程上执行多个任务,实现异步等待和延迟执行等效果。协程不是取代线程,而是抽象于线程之上,同一时间只有一个协程拥有运行权,相当于单线程的能力。协程的执行基于迭代器,通过yield语句来实现暂停和恢复执行,从而更加灵活地控制协程的执行过程。

                        协程可以在不创建新线程的情况下实现异步等待和延迟执行,避免了线程切换和同步等问题,从而提高了程序的性能和效率。在Unity中,协程通常用于处理一些异步任务,比如等待一段时间、播放动画、加载资源等。协程的执行过程可以通过yield语句来控制,比如yield return new WaitForSeconds(5)可以让协程等待5秒钟后再继续执行。此外,协程还可以通过yield return null等方式来控制协程的执行过程。

                        需要注意的是,协程并不是多线程,协程的执行是在主线程上进行的,因此协程中的操作不应该阻塞主线程的执行。如果协程需要执行一些耗时的操作,可以将其放到后台线程中执行,然后通过yield return null等方式来控制协程的执行过程。

                        在Unity中只有主线程才能访问Unity3D的对象、方法、组件。当主线程在执行一个对资源消耗很大的操作时,在这一帧我们的程序就会出现帧率下降,画面卡顿的现象!

                        那这个时候我们就可以利用协程来做这件事,因为协程是伴随着主线程运行的,主线程依旧可以丝滑轻松的工作,把脏活累活交给协程处理就好了!简单来说:协程是辅助主线程的操作,避免游戏卡顿。

                        16. 简述协程的底层原理
                        • 协程是通过迭代器来实现功能的,通过关键字IEnumerator来定义一个迭代方法
                        • StartCoroutine 接受到的是一个 IEnumerator ,这是个接口,并且是枚举器或迭代器的意思。
                        • yield 是 C#的一个关键字,也是一个语法糖,背后的原理会生成一个类,并且也是一个枚举器,而且不同于 return,yield 可以出现多次。
                        • yield 实际上就是返回一次结果,因为我们要一次一次枚举一个值出来,所以多个 yield 其实是个状态模式,第一个 yield 是状态 1,第二个 yield 是状态 2,每次访问时会基于状态知道当前应该执行哪一个 yield,取得哪一个值。

                          从程序的角度讲,协程的核心就是迭代器。

                          想要定义一个协程方法有两个因素,第一:方法的返回值为 IEnumerator 。第二,方法中有 yield关键字。

                          当代码满足以上两个条件时,此方法的执行就具有了迭代器的特质,其核心就是 MoveNext方法。

                          方法内的内容将会被分成两部分:yield 之前的代码和 yield 之后的代码。yield之前的代码会在第一次执行MoveNext时执行, yield之后的代码会在第二次执行MoveNext方法时执行。

                          而在Unity中,MoveNext的执行时机是以帧为单位的,无论你是设置了延迟时间,还是通过按钮调用MoveNext,亦或是根本没有设置执行条件,Unity都会在每一帧的生命周期中判断当前帧是否满足当前协程所定义的条件,一旦满足,当前帧就会抽出CPU时间执行你所定义的协程迭代器的MoveNext。

                          注意,只要方法中有yield语句,那么方法的返回值就必须是 IEnumerator ,不然无法通过编译。

                          17. 线程与协程的区别
                          • 协程:即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CPU进行分时,协程可以访问和使用unity的所有方法和component。同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。
                          • 线程:多线程是阻塞式的,每个IO都必须开启一个新的线程,但是对于多CPU的系统应该使用thread,尤其是有大量数据运算的时刻,但是IO密集型就不适合;而且thread中不能操作unity的很多方法和component。同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。

                            线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。

                            18. 简述Invoke与InvokeRepeating

                            Invoke

                            Invoke() 方法是 Unity3D 的一种委托机制

                            如: Invoke(“Test”, 3); 它的意思是:3 秒之后调用 Test() 方法;

                            使用 Invoke() 方法需要注意 以下3点:

                            1 :它应该在 脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;

                            2:Invoke(); 不能接受含有参数的方法;

                            3:在 Time.ScaleTime = 0; 时, Invoke() 无效,因为它不会被调用。

                            InvokeRepeating

                            InvokeRepeating(“Test”, 3 , 5);

                            这个方法的意思是指:3 秒后调用 Test() 方法,并且之后每隔 5 秒调用一次 Test() 方法。

                            19. 简述Invoke与协程的区别
                            • Invoke方法:执行没有被挂起,相当于设置完被调用函数的执行时间后即时向下执行。应用到每隔一段时间执行某个函数很方便。
                            • Coroutine方法:新开一条执行序列(跟新建线程差不多)并挂起,等待中断指令结束。开销不大。当需要挂起当前执行时使用。
                            • 协程的效率比Invoke高。
                              20. 正在运行的脚本,隐藏物体与禁止脚本导致触发OnDisable时,Invoke与coroutine是否正常运行?
                              • 只将脚本禁止:都会正常运行。
                              • 如果把物体直接隐藏:Invoke正常运行,coroutine不会正常运行。

                                原因:因为游戏物体隐藏了,一切与游戏物体相关的脚本生命周期都会停止,协程自然也会停止 ;

                                如果游戏对象没有隐藏,只是将脚本隐藏,游戏对象照样可以通过反射获取协程迭代器对象继续协程的执行。

                                21. 在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数 三个阶段

                                答:OnCollisionEnter、 OnCollisionStay、 OnCollisionExit

                                22. Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
                                • rigidbody.AddForce
                                • rigidbody.AddForceAtPosition
                                  23. 物体自身旋转使用的函数?物体绕某点旋转使用函数叫什么?

                                  自身旋转:transform.Rotate()

                                  绕某点旋转:transform.RotateAround

                                  24. Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数

                                  PlayerPrefs类是一个本地持久化保存与读取数据的类

                                  PlayerPrefs类支持3中数据类型的保存和读取,浮点型,整形,和字符串型。

                                  分别对应的函数为:

                                  • SetInt();保存整型数据;GetInt();读取整形数据;
                                  • SetFloat();保存浮点型数据; GetFlost();读取浮点型数据;
                                  • SetString();保存字符串型数据; GetString();读取字符串型数据;
                                    25. Image和RawImage的区别
                                    • Imgae比RawImage更消耗性能
                                    • Image只能使用Sprite属性的图片,但是RawImage什么样的都可以使用
                                    • Image适合放一些有操作的图片,裁剪平铺旋转什么的,针对Image Type属性
                                    • RawImage就放单独展示的图片就可以,性能会比Image好很多
                                      26. TCP/IP协议栈各个层次及分别的功能?
                                      • 网络接口层:这是协议栈的最低层,对应OSI的物理层和数据链路层,主要完成数据帧的实际发送和接收。
                                      • 网络层:处理分组在网络中的活动,例如路由选择和转发等,这一层主要包括IP协议、ARP、ICMP协议等。
                                      • 传输层:主要功能是提供应用程序之间的通信,这一层主要是TCP/UDP协议。
                                      • 应用层:用来处理特定的应用,针对不同的应用提供了不同的协议,例如进行文件传输时用到的FTP协议,发送email用到的SMTP等。
                                        27. 在场景中放置多个Camera并同时处于活动状态会发生什么?

                                        受Camera覆盖各场景物件均同时实时绘制,主Camera视场里有多个Camera的渲染合集。可以用depth(深度),Layer(层)+ Culling Mask,enable = false/true来控制,或者调整Viewport Rect可以调整不同摄像机的显示内容。

                                        28. 如何销毁一个UnityEngine.Object及其子类?

                                        使用Destroy()方法;

                                        29. 请描述游戏动画有哪几种,以及其原理?

                                        主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。

                                        • 关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;

                                        • 骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;

                                        • 单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。

                                          30. 请描述为什么Unity3d中会发生在组件上出现数据丢失的情况

                                          一般是组件上绑定的对象被删除了,导致组件找不到该对象了而出现数据丢失现象。或者对象在Editor外部被删除和移动位置。

                                          31. alpha blend工作原理?

                                          Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。

                                          32. 写出光照计算中的diffuse的计算公式?

                                          diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射系数、colorLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘,如果结果小于等于0,则漫反射为0。

                                          33. LOD是什么,优缺点是什么?

                                          LOD(Level of detail)多层次细节,是最常用的游戏优化技术。

                                          它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

                                          缺点:增加了内存

                                          LOD简单示例:【100个 Unity踩坑小知识点】| Unity 的 LOD技术(多细节层次)

                                          33. 两种阴影判断的方法、工作原理?

                                          本影和半影:

                                          • 本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
                                          • 半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域) 工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
                                            34. Vertex Shader是什么,怎么计算?

                                            顶点着色器 是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。

                                            Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。

                                            35. MipMap是什么,作用?

                                            MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。

                                            36. 请描述Interface与抽象类之间的不同

                                            语法不同处:

                                            1. 抽象类中可以有字段,接口没有。
                                            2. 抽象类中可以有实现成员,接口只能包含抽象成员。
                                            3. 抽象类中所有成员修饰符都可以使用,接口中所有的成员都是对外的,所以不需要修饰符修饰。

                                            用法不同处:

                                            1. 抽象类是概念的抽象,接口关注于行为。
                                            2. 抽象类的子类与父类的关系是泛化关系,耦合度较高,而实现类和接口之间是实现的关系,耦合度比泛化低。
                                            3. 一个类只能继承一个类,但是可以实现多个接口。
                                            37. 如何安全的在不同工程间安全地迁移asset数据?三种方法
                                            1. 将Assets和Library一起迁移
                                            2. 导出包package
                                            3. 用unity自带的assets Server功能
                                            38. 简述一下对象池,你觉得在FPS里哪些东西适合使用对象池?

                                            对象池就存放需要被反复调用资源的一个空间。

                                            比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。

                                            特点:用内存换取cpu的优化

                                            39. Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?

                                            支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。

                                            Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。

                                            注意:仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用。C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

                                            40. 如何让已经存在的GameObject在LoadLevel后不被卸载掉?
                                            DontDestroyOnLoad(transform.gameObject);
                                            
                                            41. U3D中用于记录节点空间几何信息的组件名称,及其父类名称

                                            Transform 父类是 Component

                                            42. 向量的点乘、叉乘以及归一化的意义?
                                            • 叉乘 几何意义:得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积
                                            • 点乘 几何意义:可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影
                                              1. 点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
                                              2. 叉乘得到的向量垂直于原来的两个向量
                                              3. 标准化向量:用在只关系方向,不关心大小的时候
                                              43. 矩阵相乘的意义及注意点?

                                              用于表示线性变换:旋转、缩放、投影、平移、仿射

                                              注意矩阵的蠕变:误差的积累

                                              44. 当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?

                                              穿透(碰撞检测失败)(例如CS射击游戏,可以使用开枪时发射射线,射线碰撞到则掉血击中)

                                              45. 为什么dynamic font在unicode环境下优于static font

                                              使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理, 静态字体体积会很大。

                                              46. 请简述如何在不同分辨率下保持UI的一致性

                                              多屏幕分辨率下的UI布局一般考虑两个问题:

                                              1. 布局元素的位置,即屏幕分辨率变化的情况下,布局元素的位置可能固定不动,导致布局元素可能超出边界;
                                              2. 布局元素的尺寸,即在屏幕分辨率变化的情况下,布局元素的大小尺寸可能会固定不变,导致布局元素之间出现重叠等功能。

                                              为了解决这两个问题,在Unity UGUI体系中有两个组件可以来解决问题,分别是布局元素的Rect Transform和Canvas的Canvas Scaler组件。

                                              CanvasScaler中UI Scale Mode有三种模式,Constant Pixel Size、Scale With Screen Size、Constant Physical Size,其中第二个就是根据屏幕分辨率来进行缩放适配。在这个模式下,有两个参数,一个是我们在开发过程中的标准分辨率,一个是屏幕的匹配模式,通过这里面的设置,就可以完成多分辨率下的适配问题。

                                              47. 请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?

                                              当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。

                                              48. 什么叫动态合批?跟静态合批有什么区别?

                                              如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。

                                              动态批处理操作是自动完成的,并不需要你进行额外的操作。

                                              区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。静态批处理:自由度很高,限制很少,缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。

                                              49. 动态加载资源的方式?
                                              • instantiate:最简单的一种方式,以实例化的方式动态生成一个物体。
                                              • Assetsbundle:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object,unity官方推荐也是绝大多数商业化项目使用的一种方式。
                                              • Resource.Load:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中
                                              • AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的。
                                                50. 什么是LightMap?

                                                LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。

                                                51. Unity和cocos2d的区别

                                                Unity3D支持C#、javascript等,cocos2d-x 支持c++、Html5、Lua等。

                                                cocos2d 开源 并且免费

                                                Unity3D支持iOS、Android、Flash、Windows、Mac、Wii等平台的游戏开发,cocos2d-x支持iOS、Android、WP等。

                                                52. Unity3D Shader分哪几种,有什么区别?
                                                1. 表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。
                                                2. 顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。
                                                3. 固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫Shader的时,还可以通过固定功能管线着色器来绘制出一些基本的内容。
                                                53. 获取、增加、删除组件的命令分别是什么?
                                                • 获取:GetComponent
                                                • 增加:AddComponent
                                                • 删除:Destroy
                                                  54. Unity中,照相机的Clipping Planes的作用是什么?调整 Near、Far两个值时,应该注意什么?

                                                  剪裁平面 。从相机到开始渲染和停止渲染之间的 距离。

                                                  55. GPU的工作原理?

                                                  简而言之,GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序)。

                                                  顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(定点着色器)完成。

                                                  光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。

                                                  纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。

                                                  像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。

                                                  最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。

                                                  总结:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。

                                                  56. 什么是渲染管道?

                                                  是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

                                                  主要步骤有: 本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。

                                                  57. Unity中如何优化内存,简述一些常用的方法。
                                                  1. 避免频繁的内存分配:频繁的内存分配和释放会导致内存碎片化,影响性能。尽量重用对象,而不是每次需要时都创建新的对象。
                                                  2. 使用Pooling(对象池):对象池是一种预先创建并保留对象的集合的技术,这样就可以重复使用它们,而不是每次需要时都创建新的对象。这大大减少了内存分配和垃圾收集的频率。
                                                  3. 及时删除不再使用的对象:当你完成一个对象的所有工作,或者确定不再需要它时,删除或置空该对象可以立即释放其占用的内存。
                                                  4. 合理使用动态数组和静态数组:动态数组会在运行时调整大小,这会导致额外的内存分配和数据复制。在知道数组的大致大小的情况下,使用静态数组可能会更高效。
                                                  5. 优化字符串的使用:字符串是不可变的,这意味着每次对字符串进行操作(例如连接或替换)时,都会创建一个新的字符串对象。如果可能,尽量避免频繁操作字符串,或者考虑使用其他数据结构。
                                                  6. 减少全局变量的使用:全局变量会在程序的整个生命周期中一直存在,这会导致大量的内存占用。尽可能地减少全局变量的使用,或者考虑使用单例模式来限制变量的数量。
                                                  7. 优化数据结构:根据应用的需求选择合适的数据结构。例如,如果你经常需要快速查找元素,哈希表可能是一个更好的选择。
                                                  8. 合理使用引用类型和值类型:在C#中,引用类型和值类型在内存中有着不同的处理方式。理解它们的差异并根据实际情况选择合适的类型可以有效地减少内存使用。
                                                  9. 优化纹理和图片资源:大型纹理和图片会占用大量内存。尽可能地减小图片的大小,并使用合适的格式来存储它们。对于纹理,考虑使用合适的纹理压缩格式。
                                                  10. 避免频繁的磁盘I/O操作:频繁的磁盘I/O操作会导致大量的CPU时间被占用,影响程序的性能。尽可能地缓存数据,减少磁盘操作的频率。
                                                  11. 优化Profiler的使用:Unity的Profiler可以帮助你找出内存使用的热点。通过Profiler,你可以找到哪些部分在消耗大量的内存,并据此进行优化。
                                                  12. 代码审查和性能分析:定期进行代码审查和性能分析可以帮助你找到内存使用的瓶颈并进行优化。

                                                  记住,优化是一个持续的过程,需要根据项目需求和资源进行不断的调整和优化。

                                                  58. 使用Unity3d实现2d游戏,有几种方式?
                                                  1. 使用本身的GUI、UGUI
                                                  2. 把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;
                                                  3. 使用2d插件,如:2DToolKit、NGUI
                                                  59. 请问alpha test在何时使用?能达到什么效果?

                                                  Alpha Test,中文就是透明度测试。

                                                  简而言之就是V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的alpha值与固定值进行比较。Alpha Test语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。

                                                  61. 将Camera组件的ClearFlags选项选成Depth only是什么意思?有何用处?

                                                  仅深度,该模式用于对象不被裁剪。

                                                  62. 什么叫做链条关节?

                                                  Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。

                                                  63. 在编辑场景时将GameObject设置为Static有何作用?

                                                  设置游戏对象为Static将会剔除(或禁用)网格对象当这些部分被静态物体挡住而不可见时。因此,在你的场景中的所有不会动的物体都应该标记为Static。

                                                  64. 有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染?

                                                  把A组物体的渲染对列大于B物体的渲染队列

                                                  65. 将图片的TextureType选项分别选为Texture和Sprite有什么区别

                                                  Sprite作为UI精灵使用,Texture作用模型贴图使用。

                                                  66. 问一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别?为什么?

                                                  答:没有区别,因为不管几张贴图只渲染一次。

                                                  67. 什么是DrawCall?DrawCall高了又什么影响?如何降低DrawCall?

                                                  Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。

                                                  降低DrawCall的方法:

                                                  • Dynamic Batching
                                                  • Static Batching
                                                  • 高级特性Shader降级为统一的低级特性的Shader。
                                                    68. 实时点光源的优缺点是什么?

                                                    可以有cookies – 带有 alpha通道的立方图(Cubemap )纹理。点光源是最耗费资源的。

                                                    69. 如何在Unity3D中查看场景的面数,顶点数和Draw Call数?

                                                    在Game视图右上角点击Stats。降低Draw Call 的技术是Draw Call Batching

                                                    70. Addcomponent后哪个生命周期函数会被调用

                                                    对于AddComponent添加的脚本,其Awake,Start,OnEnable是在Add的当前帧被调用的

                                                    其中Awake,OnEnable与AddComponent处于同一调用链上

                                                    Start会在当前帧稍晚一些的时候被调用,Update则是根据Add调用时机决定何时调用:如果Add是在当前帧的Update前调用,那么新脚本的Update也会在当前帧被调用,否则会被延迟到下一帧调用。

                                                    72. 层剔除

                                                    用layermask ,通过位运算的方式去设置

                                                    在代码中使用时如何开启某个Layers?

                                                    LayerMask mask = 1

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon