Unity面试题

这是我自己收集到的一点面试题,希望对大家会有帮助。
1.什么是泛型,泛型的好处?
参数类型化,好处是提高代码复用性,安全。

2.请简述ArrayList和List的主要区别?
ArrayList会把所有插入其中的数据都当作Object来处理,在去出其中的数据时可能会报类型不匹配的错误。而且用ArrayList会有一个装箱和拆箱的过程,很耗费性能。而List则是在定义的时候就确定了数据的类型。

3.数组的缺点?
长度固定,不灵活,因为数组存储的是连续的内存上,所以插入不方便。

4.list中的Add,Remove,如何使那个数插入进去原理:
链表的插入和删除效率很高

5.Ugui和ngui的区别:
ugui的cavans有世界坐标,屏幕坐标,Ngui没有
ugui他的imager可以使用材质,ngui的spraer不可以
ugui渲染顺序是根据面板顺序决定的 ngui的渲染顺序widget的depds是决定渲染顺序
ugui的ui组件不需要绑定box,ngui的组件需要绑定box才能进行交互
ngui有需要打包图集,ugui不用打包图集
ugui的寻路组件在场景里面是可以可视化,
ugui需要继承接口才可以进行鼠标拖拽等功能
执行效率以及兼容性ugui是高于ngui的
注意三点 如何拼面板,拼面板注意什么, 资源按什么划分

6.内存优化:
GC 
  GC是unity自动回收内存垃圾的回收器,这虽没有内存泄漏的风险,但是过多的垃圾回收会让CPU高负荷。这里就要避免不必要的内存申请和释放。可以在某个脚本定时清理垃圾。
  有以下几点需要注意:
   字符串的拼接会产生临时字符串内存,移除代码中的字符串拼接,改用string.format,或stringbuilder,这没测。
   用for代替foreach,foreach每次迭代产生24字节垃圾内存。100次循环就是2.4kB.
   对象标签tag比较采用comparetag,不要用tag=="mytag"这样。
   使用对象池。对象克隆也是调用new,因此对于可以循环利用的对象要采用对象池,比如子弹、特效、宝石等等。
  对象池使用时要注意一点:如果对象上挂了脚本,那么数据需要每次进行初始化或对象回收的时候进行重置,否则下次再利用的对象脚本可能存留上次的数据,那极有可能出bug。
尽量使用struct而非class,因为struct是栈区,class是堆区。

7.递归与单层for循环的区别
Override父类覆盖子类非私有的虚方法

8.什么是协同程序
协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。

9.碰撞器和触发器的区别:
碰撞器是触发器的载体,触发器是碰撞器的属性,碰撞器是有物理效果,触发器没有物理效果可以两个物体穿过。
10.发生碰撞的必要条件:
发生碰撞的两个物体都必须有Collider组建,其中处于运动状态中的物体必须有rigibody组件。

11。物理引擎一般在哪个系统函数里更新
FixUpdate。因为FixUpdate里面是固定帧执行,Update是渲染帧执行。

12.移动相机动作在哪个函数里,为什么在这个函数里
LateUpdate,在每帧执行完毕后调用,他是在所有update结束后才调用。如果移动相机的动作放在在update里,可能出现摄像头已经移动,但人物还没有出现的空帧

13.简述一下对象池,你觉得在fps设计游戏里有哪些东西适合对象池
对象池即存放需要被反复利用资源的空间。如果每个对象都创建和销毁会很费时间,最好的方法就是将不同对象回收到对象池中,等到需要的时候再将其拿出。fps设计游戏中,子弹,敌人和粒子特效都适合做成对象池。

14.在场景中放置多个Camera并同时处于活动状态会发生什么?
游戏界面可以看到多个摄像机的混合,其中depth和clear flags控制摄像机的渲染顺序。

15.简述一下你对数据结构的存取有什么看法
批量取,经常遍历的数据用List来存储,经常查找的会采取字典存储。如果有多个字段比较重要,我会采取多个字典进行存储。

16.简述一下值类型和引用类型的区别
区别:1.值类型存储在栈上,引用类型数据存储在内存堆中;2.值类型存取快,引用类型存取慢。3.值类型表示实际的数据,引用类型表示指向存储在内存堆中的数据的指针和引用。4.栈的内存是自动释放的,堆内存是.NET中的GC自动释放。5.值类型继承自System.ValueType,引用类型继承自System.Object

17.请简述GC产生的原因,并描述如何避免
GC主要用来回收堆上面的内存。避免:1.减少new产生堆箱的次数2.多使用公共的对象(静态成员)3.将String换成StringBuild。

18.请描述Interface与抽象类之间的不同
相同点:
(1) 都可以被继承
(2) 都不能被实例化
(3) 都可以包含方法声明
(4) 派生类必须实现未实现的方法
区 别:
(1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
(2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。”
(3) 接口可以被多重实现,抽象类只能被单一继承
(4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
(5) 抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
(6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法
(7) 接口可以用于支持回调,而继承并不具备这个特点
(8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
(9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
个人意见:抽象类的作用是为了重用,接口的作用是为了解耦。

19.Unity3D是否支持协程多线程程序?如果支持的话需要注意什么?
支持,如果同时要处理很多事情或者与Unity的对象互动小的可以用thread,否则使用coroutine。仅能从主线程中访问Unity3D的组件,对象和Unity系统调用。

20.Unity3D的协程和C#线程之间的区别是什么?
多线程同时运行多个线程,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只有在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。

21.矩阵相乘的意义和注意点

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

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

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

穿透(碰撞检测失败)。应该使碰撞体变大,或者减少FixedUpdate的检测间隔。

23.Unity3D 如何获去场景中需要加载的数据

Resource.Load和AssetBundle

24.MeshRender中的material和sharedmaterial的区别

修改sharedmaterial将改变所有使用这个材质的物体的外观,并且也改变存储在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material。

25.MeshCollider和其他Collider的一个主要不同点

MeshCollider是基于V3顶点,而boxcollier本身是基于算法,没有面的概念。

26.Render的作用?描述MeshRender和SkinnedMeshRender的关系和不同

Render即渲染器,使物体能够被看到。前者为网格渲染器,后者为蒙皮的网格渲染器,主要用在有蒙皮的人物或动物上。

27.internal,sealed

internal只能在包含该类的程序集中访问该类;sealed在类声明时可防止其他类继承此类,在方法中声明可防止派生类重写此方法。

28.反射的概念和实现步骤

概念:反射就是得到程序集中的类和方法。

实现步骤:

1, using System.Reflection; 导入
2,Assembly.Load(“程序集”)加载程序集 
3,foreach(Type type in assembly.GetTypes())

{

string t = type.Name;

}

得到程序集中所有类的名称

  4,Type type = assembly.GetType("程序集.类名")

获去当前类的类型

  5,Activator.CreateInstance(type);创建此类型实例

  6,MethodInfo mInfo = type.GetMethod("方法名") 获去当前方法

  7,mInfo.Invoke(null, 方法参数)

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

主要有关节动画,

关节动画:把角色分成若干独立部分,一个部分对应一个网格模型以及相关动画,部分的动画连接成一个整体的动画。

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

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

30.lod是什么,优缺点是什么

LOD技术即Levels of Detail的简称,以为多细节层次。LOD技术指根据物体模型的节点在现实环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算,缺点增加内存。

31.Unity提供了几种光源,分别是什么
四种
平行光:Directional Light
点光源:Point Light
聚光灯:Spot Light
区域光源:Area Light

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

33.用u3d实现2d游戏,有哪几种方法

1.用系统自带的GUI

2.将摄像机设为Orthographic(正交)

3.用第三方插件,如NGUI,2DToolkit

34.简述prefab的用处
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。

35.什么是渲染管道?

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

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

36.动态加载资源的方式

Resource.Load()和AssetBundle

Resource.Load()主要是内部调用,调用的是Resource文件夹中的资源,Resource打包后这个文件夹是不存在的,会同意生成assets资源;AssetBundle是外部调用,首先把资源打包成.assetbundle文件,再动态的加载这个文件,本地或者网络服务器都可以。

37.反向旋转动画的方法是什么

将动画的速度调到-1,animation.speed = -1

38.调试记录到控制台的命令是什么

Debug.Log();

39.编辑器类存放的路径是什么

工程目录下的Assets/Editor文件夹下。

40.写出Animation的五个方法

play, stop,crossfade,IsPlaying,AddClip

41.请简述向量的点乘,叉乘以及响亮归一化的几何意义。

点乘的几何意义:计算两个向量之间的夹角,以及在某一方向上的投影;

叉乘的几何意义:创建一个垂直于两向量所构成平面的向量。

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

报错:静态构造函数不能有访问修饰符。

因为无论创造什么类型的对象,静态构造函数只执行一次;创建类实例或首次访问静态成员之前,运行库调用静态构造函数,静态构造函数执行先于其他构造函数。

43.C# String类型和StringBuilder类型的区别及两者各自的优势

String:每次都要创建一个新的对象并且分配新的内存地址。String主要用于公共API,通用性好,用途广泛,读取性能高,占用内存小。

StringBuild:首先创建一个对象并且分配一定大小的内存空间,当对此对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充。主要用于拼接String,修改性能好。

44.NUGI Button怎样接受用户点击并调用函数,具体方法名称是什么

主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick(),OnPress()等函数。具体方法名称是OnClick。

45.<愤怒的小鸟>给予初速度后,怎么让小鸟受到中立和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法

v代表初速度,假设小鸟沿着z轴方向运动,质量为1,v‘ = v - new Vector3(0,gt,ft)

46.什么是装箱和拆箱

装箱就是把值类型转化成object引用类型,拆箱即把object类型转化为值类型。

下列代码在运行时会产生几个临时对象?

1.string a = new string("abc");

2.a = (a.ToUpper() + "123").Substring(0,2);

其实在第一行会报错,因为C#中没有符合这样类型的String构造函数。在java中可行,并且第一行会产生两个临时对象,第二行会产生3个临时对象。

C#中写法应该是string b = new string(new char[]{‘a’, ‘b’, ‘c’});

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

以竖屏小游戏为例,UI就用锚点定位为主,对于背景图片,其宽度保持设备的宽度,如果实际长宽比超出预设长宽比,上下两边留黑边,如果长宽比小于预设长宽比,则对背景图片进行裁剪。

48.Unity 中安卓和ios如何进行交互

1.安卓:unity通过调用继承UnityPlayerActivity的java类中的函数跟安卓进行交互,安卓通过调用UnityPlayer.UnitySendMessage跟unity发生交互。

2.IOS:

Func(string a, string b)用Lambda表达式怎么写?

(string a, string b) => Func(string a, string b)

49.Unity3D Shader分哪几种,有什么区别?

答:1.表面着色器。表面着色器的抽象层次比较高,它可以轻松的以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。

2.ding点片段着色器。定点片段着色器可以非常灵活地实现完美的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。

3.固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行酷炫的Shader时,还可以通过固定功能管线着色器来绘制出一些基本的内容。

50.概述序列化

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

51.射线检测碰撞物的原理

射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞,则停止发射。

52.客户端和服务器的交互方式有几种

1.使用socket套接字进行数据传输,主要有UDP和TCP两个协议。处于网络传输层。

2.使用http协议进行传输。

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

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

54.如何查看Unity3D中场景的面数,顶点数和Draw Call数?如何降低Draw Call数?

在Game视图中右上角点击Stats。降低Draw Call:1.Draw Call Batching(将一些渲染状态一致的物体合成一个大物体,一次性交给gpu进行绘制),分成静态批处理和动态批处理。进行批处理的物体必须拥有相同的材质;2.高级特性的shader降级为统一的低级特性的shaer。

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

没有区别,因为采用了dc批处理技术,不管几张贴图,相同材质只渲染一次。

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

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

2.降低顶点数和面数,降低模型的骨骼数量,降低贴图的大小。

3.尽量不适用实时光,不是用阴影。

4.裁剪例子系统,合并同时出现的粒子系统。

5.将暂时不用的以后还需使用的物体隐藏而不是直接Destroy掉。

6.禁止那些不带刚体带包围盒的物体运动。

7.去掉法线计算。

8.使用光照贴图,使用多层次细节,使用预设;

57.实时光源的优缺点

优点:可以有cookies-带有alpha通道的立方图纹理。缺点:点光源是最耗费资源的。

58.将Camera组建的clearFlags选项选成Depth only是什么意思。什么用处?

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

59.编辑场景时将GameObject设置为Static有什么作用

说明该object是静止不变的。unity内部有不少操作检测gameobject是否为static,对于static的物体有一些特殊的处理,比如occlusion culling(遮挡剔除)会剔除对被static物体挡住的网格对象,在rendering优化时也会根据是否为static来进行不同的优化,在lightmaping时,会根据是否是static来进行光照。

60.NGUI中Panel和Anchor的作用

Anchor可以让一个控件的位置在屏幕上精确显示出来,UIPanel可以使物体被渲染出来。

61.NGUI中Grid和Table的作用

对Grid和Table组件下的物体进行排序和定位。

62.什么是协同程序

协程即在主程序运行时同时开启的另外一段逻辑处理程序,来协助当前程序的执行。

63.队列、堆、栈区别

1、队列先进先出,而栈后进先出。而对于堆而言,先进的和后进的都是存放临时数据的地方。我们可以随心所欲的进行增加变量和删除变量,不管什么次序。

2、栈是由操作系统自动分配释放,堆是由.net回收。

3、栈存取速度快,堆存取速度慢。

64.已知二叉树后续遍历序列是cdbgfea,中序遍历序列是cbdaegf,它的前序遍历序列是abcdefg,请画出这个树的结构?

从前序遍历可以看出,根节点为a,再从中序遍历看出cbd为左节点,egf为右节点再进行,再从前序看出e为根右节点的根节点由此可以画出图(每个节点跟它临近节点进行比较)

			              A
                         /  \
                        B    E
                       /\       \
                      C  D     F
                               /
                             G

65.请描述栈和队列的相同点和不同点

相同点:都是线性表。

不通电:读写方式不一样,栈是先进后出,队列是先进先出。

67.什么是泛型编程?

泛型编程的主要思想是姜算法和数据结构完全分离开来,使得一次定义的算法能够作用于多种数据结构,从而实现高度可重用的开发。

68如何使用Htc vive?
步骤一
选定合适的游戏位置
步骤二安装vive软件
歪无
步骤三
安装HTC vive激光定位器
步骤四设置头戴式设备
步骤五设置HTC游戏操作手柄
步骤六划定游戏区域

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值