【面试】Unity面试题&答案

文章目录

    • C#
    • Unity
      • 渲染
      • 框架
      • 优化
    • 来源

C#

1.结构体和类有何区别?

结构体是一种值类型,而类是引用类型。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作

2.值类型和引用类型有何区别?

1值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,引用类型的变量持有的是数据的引用,

2.值类型存取速度快,引用类型存取速度慢。

3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用

4.值类型继承自System.ValueType,引用类型继承自System.Object

5.栈的内存分配是自动释放;而堆在.NET中会有GC来释放

6.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

3.Heap与Stack有何区别?

1.heap是堆,stack是栈。

2.stack的空间由操作系统自动分配和释放,

heap的空间是手动申请和释放的,heap常用new关键字来分配。

3.stack空间有限,heap的空间是很大的自由区。

4.请简述ArrayList和List的主要区别?

List是接口,ArrayList是一个实现了该接口的类,可以被实例化

ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理)

装箱拆箱的操作(费时)

5.请简述装箱拆箱

装箱 就是把“值类型”转换成“引用类型”(Object);

拆箱 就是把“引用类型”转换成“值类型”;

6.请简述sealed关键字用在类声明时与函数声明时的作用

sealed修饰的类为密封类,类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。

7.请简述private,public,protected,internal的区别

public:对任何类和成员都公开,无限制访问

private:仅对该类公开

protected:对该类和其派生类公开

internal:只能在包含该类的程序集中访问该类

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

都可以被继承

都不能被实例化

都可以包含方法声明

抽象类是部分抽象,单继承,接口是完全抽象,多继承。

9.ref参数和out参数是什么?有什么区别?

ref引用参数和out输出参数的效果一样,都是通过关键字找到内存地址,

不同点就是输出参数必须对参数进行初始化。

10.C#的委托和事件

委托(delegate)类似于一种安全的指针引用,委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。事件是一种特殊的委托

11.C#中的排序方式有哪些?

选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序

12.重载和重写的区别?

重写(overriding):子类的方法覆盖父类的方法,要求返回值、方法名和参数都相同。

方法重载(overloading):重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,

13.概述序列化:

序列化简单理解成把对象转换为容易传输的格式的过程。比如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器端之间传输该对象

14.概述c#中代理和事件?

代理就是用来定义指向方法的引用。

C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器

15.在类的构造函数前加上static会报什么错?为什么?

构造函数格式为 public+类名,如果加上static会报错(静态构造函数不能有访问修饰符)
原因:静态构造函数不允许访问修饰符,也不接受任何参数;
无论创建多少类型的对象,静态构造函数只执行一次;
运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;
静态构造函数执行先于任何实例级别的构造函数;
显然也就无法使用this和base来调用构造函数。

16.C# String类型比stringBuilder类型的优势是什么?

如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringBuilder是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用stringBuilder这样比较节约内存。但是string 类的方法和功能仍然还是比stringBuilder类要强。

17、C# 函数Func(string a, string b)用Lambda表达式怎么写?

Func t=(int x, string b) => (x.ToString() + b);

18、数列1,1,2,3,5,8,13…第n位数是多少?用C#递归算法实现

通项公式应该是an = a(n-1) + a(n-2) 这样就可以做递归了

Unity

1.Unity3D的协程和C#线程之间的区别是什么?

协程:在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行。在每帧结束之后去检测yield的条件是否满足,任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。

多线程程序同时运行多个线程 ,除主线程之外的线程无法访问Unity3D的对象、组件、方法,缺点:协同程序并非真线程,协程也失去了标准线程使用多CPU的能力。可能会发生堵塞。

2.动态加载资源的方式?

1.Resources.Load();

2.AssetBundle

通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。

2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。

3.如何安全的在不同工程间地迁移asset数据?三种方法

1.将Assets目录和Library目录一起迁移

2.导出包,export Package

3.用unity自带的assets Server功能

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

四种。

平行光:Directional Light

点光源:Point Light

聚光灯:Spot Light

区域光源:Area Light

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

Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy
【面试】Unity面试题&答案_第1张图片

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

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

7.如何在不同分辨率下保持UI的一致性

UGUI通过锚点和中心点和分辨率也解决这个问题

8.Unity中,照相机的Clipping Planes的作用是什么?调整Near、Fare两个值时,应该注意什么?

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

9.请描述游戏动画有哪几种?

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

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

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

骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。

10.Unity和Android与iOS如何交互?UnitySendMessage

UnitySendMessage(“Cube111”,“methodName111”,“传给unity。。。”);

参数1:场景中的模型名称,Cube111就是我们定义的一个箱子。

参数2:脚本方法名称methodName111就是上面脚本中的方法,

参数3:为一个char *类型的可以向Unity中传递数据。

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

Sprite作为UI精灵使用,Texture作用模型贴图使用。Sprite需要2的整次幂,打包图片省资源

Unity引擎使用的是左手坐标系

12.游戏对象B是游戏对象A的子物体,游戏对象A经过了旋转,请写出游戏B围绕自身的Y轴进行旋转的脚本语句,以及游戏对象B围绕世界坐标的Y轴旋转的脚本语句。

绕世界坐标旋转:transform.Rotate (transform.upspeedTime.deltatime);

绕自身Y轴旋转:transform.Rotate (Vector.upspeedTime.deltatime);

13.为什么u3d会出现组件上数据丢失的情况

一般是组件上绑定的物体对象被删除了。

14.当删除Unity工程Assets目录下地meta文件时会导致什么?为什么?

会导致在场景中游戏对象看不到,或者报错,材质找不到资源。多人协作的时候会导致资源的重复产生。

动画切换(玩家从休息切换到战斗)
如何知道两个物体使用了同一个贴图。

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

1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit

16、Unity3d的物理引擎中,有几种施加力的方式,分别描述出来

rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。

17.alpha blend 工作原理

alpha blend 用于做半透明效果。Color = (源颜色 * 源系数) OP ( 目标颜色* 目标系数);其中OP(混合方式)有加,减,反减,取最小,取最大;

18.写光照计算中的diffuse的计算公式

漫反射光(diffuse)计算公式为:Idiffuse = DintensityDcolorN.L ; (Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)

其他,3D渲染中,物体表面的光照计算公式为:

I = 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);

其中,环境光(ambient)计算公式为:

Iambient= Aintensity* Acolor; (Aintensity表示环境光强度,Acolor表示环境光颜色)

漫反射光(diffuse)计算公式为:

Idiffuse = DintensityDcolorN.L ; (Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)

镜面光照(specular)计算公式为:

Ispecular = SintensityScolor(R.V)n; (Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量)

综上所得:整个光照公式为:

I = Aintensity* Acolor+ DintensityDcolorN.L + SintensityScolor(R.V)n ;

将一些值合并,并使用白色作为光照颜色,则上述公式可简化为:

I = A + D*N.L + (R.V)n

19.Vertex Shader是什么?怎么计算?

顶点着色器,怎么计算哦???

20.用u3d实现2d游戏,有几种方式?

1.用本身的GUI

2.把摄像机的Projection调成Orthographic,物体的Z轴不考虑了。

21.u3d中碰撞器和触发器的区别?

碰撞器会有碰撞的效果,IsTrigger = false,可以调用OnCollisionEnter/Stay/Exit函数。 触发器没有碰撞效果,isTrigger = true,可以调用OnTriggerEnter/stay/exit函数

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

其中至少一个物体(运动的)必须带有碰撞器(collider)+刚体(Rigidbody)或者CharacterController,另一个物体也必须至少带有collider。

23.CharacterController和Rigidbody的区别

CharacterController自带胶囊碰撞器,里面好像封装了一个刚体

Rigidbody就是刚体,使物体带有物理的特性

24.什么叫做链条关节

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

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

transform.Rotate

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

transform.RotateAround

27.u3d提供了一个用于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数

PlayerPrefs.SetInt(“CoinNum”,100);

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

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

29.当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存。

动态的创建。需要几个我们就

30.一个场景放置多个camera并同时处于活动状态,会发生什么

游戏界面可以看到很多摄像机的混合。可以用depth(深度),Layer(层)+ Culling Mask,enable = false/true来控制

31.简述prefab的用处和环境

Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。

32.如何销毁一个UnityEngine.Object以及其子类

Destory

渲染

1.什么是渲染管道?

图形数据在GPU上经过运算处理,最后输出到屏幕的过程

主要步骤有:顶点处理->图元装配->光栅化->像素处理->缓存。

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

LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

3.MipMap是什么,作用?

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

4.两种阴影判断的方法、工作原理。

本影和半影

本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。

半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)

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

把A组物体的渲染对列大于B物体的渲染队列,通过shader里面的渲染队列来渲染

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

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

框架

1.客户端与服务器交互方式有几种?

socket通常也称作”套接字”,实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。

http协议传输的主要有http协议 和基于http协议的Soap协议(web service),常见的方式是 http 的post 和get 请求,web 服务。

TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

优化

一.如何优化内存?

1.压缩自带类库;
2.对象池,使用预设(Prefab)。
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,

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

GC回收堆上的内存

避免:1.减少new产生对象的次数

2.使用公用的对象(静态成员)

3.将String换为StringBuilder

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

如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要你进行额外的操作。

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

4.顶点数和Draw Call数?如何降低Draw Call数?

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

降低DrawCall的方法:

  1. Dynamic Batching(动态批处理)

  2. Static Batching(静态批处理)

  3. 高级特性Shader降级为统一的低级特性的Shader。

5.ITY3d在移动设备上的一些优化资源的方法

1.使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新

2.顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右

3.只使用一盏动态光,不是用阴影,不使用光照探头

粒子系统是cpu上的大头

4.剪裁粒子系统

5.合并同时出现的粒子系统

6.自己实现轻量级的粒子系统

animator也是一个效率奇差的地方

7.把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下

8.animator出视野不更新

9.删除无意义的animator

10.animator的初始化很耗时(粒子上能不能尽量不用animator)

11.除主角外都不要跟骨骼运动apply root motion

12.绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动

NUGI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下

13每帧递归的计算finalalpha改为只有初始化和变动时计算

14去掉法线计算

15不要每帧计算viewsize 和windowsize

16filldrawcall时构建顶点缓存使用array.copy

17.代码剪裁:使用strip level ,使用.net2.0 subset

18.尽量减少smooth group

19.给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具

来源

unity3d面试题及答案
Unity面试题(含答案)

你可能感兴趣的:(InterView,unity,面试,c#)