unity面试整理

1、添加、获取、删除组件的函数?

答:AddComponent、GetComponent、Desdroy。


2、unity有几种光,分别是哪些?

答:有4种,分别是平行光(Directional Light)、聚光灯(Spot Light)、点光源(Point Light)、区域光(Area Light)。


3、Uinty中的协程与线程的区别?

答:协程是在主线程中运行的,由StartCoroutine开启一个协程程序,在协程代码块中由yield return挂起代码块,等待yield return中的条件满足了再继续执行yield return下面的代码;协程是可以直接访问unity3d的对象、组件、方法。

        线程是和主线程同步执行的,它不可以访问unity3d对象、组件、方法。


4、MeshRender 中 material 和 sharedmaterial 的区别?

答:material是unity new出来的一个新的material,改变它的属性值不会影响到其他引用到相同的material的物体;sharedmaterial引用是material本身,因此修改了它的属性值就会影响到其他引用到该material的物体表现。


5、物体发生碰撞的必要条件?

答:物体 A 必须带有( collider+rigidbody )或者 CharacterController ,另一个物体也必须至少带有 collider。


6、数组、ArrayList、泛型List的区别?

答:数值在内存中是连续的,因此它查找快,但是插入数据就很复杂,在申明数组时要指定数组的长度,数组长度过长会产生内存浪费,过短了容易产生数据溢出;

ArrayList是在命名空间System.Collections下的,同时它实现了List接口提供了数据的存储和检索,它的长度是根据存储数据对象的个数来扩展收缩的,这样在申明ArrayList时就不需要指定长度了;但是ArrayList存在类型安全问题,因为它把所有加入的数据都当作Object类型处理的,这样我们在存数据的时候很可能会出现类型不匹配的错误,在存储或检索值类型时通常发生装箱和取消装箱操作,带来很大的性能耗损。

泛型List解决了ArrayList的类型不安全问题,在声明泛型List是必须值定类型。


7、单例的优点以及它和静态类的区别?

答:优点     因为只有一个实例对象所以可以节省内存,有利于垃圾回收;

区别    1、 单例可以继承类,实现接口,静态类不行

     2、单例类可以被集成,它的方法可以被重写

     3、单例类可以被用于多态而无需强迫用户只假定唯一的实例

     4、静态方法中产生的对象,会随着静态方法执行完毕而释放掉,而且执行类中的静态方法时,不会实例化静态方法所在的类。如果是用singleton, 产生的那一个唯   一的实例,会一直在内存中,不会被GC清除的


8、for、foreach、while的区别?

答:在知道数组或列表长度是用for,不知道长度用while和foreach;foreach只读不能改变数据结构。


9、C#类和结构的区别?

答:1、结构不能申明默认构造函数,因为结构是由编译器创建和销毁的,所以不需要默认的构造函数和析构函数。

2、结构是值类型的,所以对结构的值改变不会影响到其原本的值。类是引用型的,所以改变其成员变量的值会改变其原本的值。

3、申明结构用struck关键字,类用class关键字,结构传值是值类型传值,类是引用。

4、结构的实例化不用new关键字,类需要,类可以实现接口。


10、接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?

答:接口可以继承接口;抽象类可以实现接口;抽象类可以继承实体类,但有条件实体类必须有明确的构造函数。


11、final、finally、finallize的区别?

答:final用于申明属性、方法、类,表示属性不可变,方法不可覆盖,类不可以继承;

finally是异常处理结构里的,表示总是要执行的部分;

finallize是Object类的一个方法,在垃圾回收机制回收对象是会调用对象里的这个方法;


12、值类型和引用类型的区别?

答:值类型的值是存放在内存栈中的,它的值传递是个复制过程,所以值的改变是不会影响大原本值的变化;而引用赋值是复制的是地址而不是对象本身,所以它的值改变会改变对象原本的值;所有值类型的基类是System.ValueType,不能派生出新的类型;引用类型的基类是System.Object,能够派生出新的类型;值类型不包含null值,但是空类型可以将null赋值给值类型。


13、C#中string str = null 和 string str = "" 的区别?

答:string str = null 是不会分配内存空间的,而 string str = "" 是会分配一个空字符的内存空间。


14、C#是否可以继承String类?

答:String类是final类是不可以继承的。


15、TCP和UDP连接有何异同?

答:TCP是传输控制协议,提供的是面向连接的、可靠的、字节流服务;当用户和服务器进行数据传输的时候,必须确保他们之间进行了TCP的连接,TCP还提供了超时重拨,数据检验功能。

UDP是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。


16、面向对象的特征?

答:继承、封装、多态


17、什么是装箱和拆箱?

答:将值类型转换成引用类型就是装箱;将引用类型转换成值类型就是拆箱。


18、什么是委托?事件是不是委托?

答:是一个类型安全的对象,它相当与C\C++里的函数指针,但是委托的安全更高;事件不是委托,不过由于事件的性质决定了处理它的程序逻辑能访问的参数,因此,在C#中处理事件的逻辑都包装为委托。


20、override和overload的区别?

答:override是重写,是重写父类里的函数,而且方法名、返回类型、参数类型和参数个数都要和父类一致;

overload是重载,也表示重写父类的函数,但是它只要函数名相同就行,其他的可以不同。


21、Const和ReadOnly的区别?

答:1、const 字段只能在该字段的声明中初始化;而readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。

2、const 字段是编译时常数,而 readonly 字段可用于运行时常数。

3、const 字段是编译时常数,而 readonly 字段可用于运行时常数。

4、const 对于引用类型的常数,可能的值只能是 string 和 null,而readonly可以是任何类型。


22、请简述 GC (垃圾回收)产生的原因,并描述如何避免? 

答:GC 回收堆上的内存 
避免: 1 )减少 new 产生对象的次数 2 )使用公用的对象(静态成员) 3 )将 String换为 StringBuilder。


23、U3D 中用于记录节点空间几何信息的组件名称,及其父类名称 ?

答:Transform,父类是component。


24、Prefab 的作用?如何在移动环境的设备下恰当地使用它? 

答:集合游戏物体的所有组件,相同的游戏物体可以同过prefab克隆出来;将相同的游戏物体做成prefab用到时进行克隆然后在改变组件的值,来控制改变克隆出来的游戏物体。


25、物体自旋转使用的函数叫什么?

答:transform.Rotate。


26、物体绕某点旋转使用函数叫什么?

答:transform.RotateAround。


27、unity3d从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法。

答:Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –> OnGUI –> Reset –> OnDisable –> OnDestroy。


28、物理更新一般在哪个系统函数里?

答:FixedUpdate ,每固定帧绘制时执行一次,和 update 不同的是 FixedUpdate 是渲染帧执行,如果你的渲染效率低下的时候 FixedUpdate 调用次数就会跟着下降。FixedUpdate 比较适用于物理引擎的计算,因为是跟每帧渲染有关。 Update 就比较适合做控制。


29、为什么 dynamic font 在 unicode 环境下优于 static font ?

答:Unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。 
使用动态字体时, Unity 将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。


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

答:LateUpdate, ,是在所有 update 结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有 update 操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。


31、C# List、Hashtable、Dictionary区别?

答:List其实是对数组的封装,当List对象的Item元素数量超过了Capacity的数量时,List对象会重新申请一块大小是原来Capacity的两倍的内存空间,然后将当前所有Item元素以及待添加元素复制到新的内存空间中,因此频繁的添加数据消耗大,但查询速度快;它的内存区域是连续的,可以用角标来取值;

Hashtable、Dictionary它们的内存是用key值根据hash算法算出来的,它们的内存区域是不连续的,所以在遍历的时候难免会对内存进行换页操作这样遍历的时间就长;

Dictionary:1、类型安全,对值类型没有装箱拆箱操作;

2、在单条数据的读取上速度快;

3、数据的存放是有序的

Hashtable:线程安全,适合多线程,无序;


32、unity物理系统的理解?

答:Unity内置了NVIDIA的Physx物理引擎,可以通过物理引擎高效、逼真地模拟刚体碰撞、车辆驾驶、布料、重力等物理效果,使游戏画面更加真实而生动。


33、Unity粒子系统的理解?

答:粒子系统在Unity通常用作制作烟雾,蒸汽,火焰和其他雾化效果,通过一到两个材质和不断绘画,创造一个混乱特效。典型的粒子系统在一个物体上包括一个Particle Emitter粒子发射器, 一个Particle Animator粒子播放器和一个Particle Renderer粒子渲染器,如果想和别的物体交互,可以添加一个ParticleCollider粒子碰撞器到物体上。


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

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

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


35、矩阵相乘的意义和注意?

答:用于表示线性变换:平移、旋转、投影、反射和缩放。

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


36、Render 的作用?描述 MeshRender 和 SkinnedMeshRender 的关系与不同?

答:Render可以使一个对象在屏幕中显示。

MeshRender:网格渲染器从网格过滤器获得几何形状,并且根据物体的Transform组件的定义位置进行渲染。

SkinnedMeshRende:蒙皮的网格渲染器,用于渲染人物,当导入有蒙皮的网格时,骨骼蒙皮渲染器会自动添加到导入的网格上。


37、Unity3D中碰撞器和触发器的区别?

答:collider 碰撞器有碰撞效果,IsTrigger = false 可以触发OnColliderEnter/Stay/Exit函数。

触发器没有碰撞效果,IsTrigger = true可以触发OnTriggerEnter/Stay/Exit函数。


38、Unity3D中有一个用于保存读取数据的类是什么?

答:是PlayerPrefs


39、如何优化内存?

答:1、压缩自带的库;

2、释放AssetBundle占用的资源

3、减少模型的面数和骨骼数,减小贴图的大小


40、unity移动平台能读取的路径?

答:Application.streamingAssetsPath、Application.dataPath 、Resources路径。


41、手机发烫的主要原因?

答:手机CPU是一个高度集成的SOC芯片,它里面不单单集成了CPU中央芯片和GPU图形处理芯片,还有蓝、GPS、射频等一系列关键芯片模块,是智能手机芯片中集成度最高的芯片,模块在高速运作时都会散热出大量热量。通俗的说,手机处理器相当于同时集成了CPU和显卡模块,另外还包含了其他一些模块。熟悉电脑的朋友都知道,CPU和显卡都是发热大户,两者融合在一起,加上又是一个很小的芯片模块,发热量自然是最大的,这样就很好理解了。


42、Render和shader的区别?

答:Shader提供了非常直观、实时的表面基本着色效果,根据硬件的能力,还能显示出纹理贴图、光源影响甚至阴影效果,但这一切都是粗糙的,特别是在没有硬件支持的情况下,它的显示甚至会是无理无序的。Render效果就不同了,它是基于一套完整的程序计算出来的,硬件对它的影响只是一个速度问题,而不会改变渲染的结果,影响结果的是看它是基于什么程序渲染的,比如是光影追踪还是光能传递。

你可能感兴趣的:(面试)