unity⾯试题整理----50道常见
1.、请简述值类型与引⽤类型的区别
区别:
1. 值类型存储在内存栈中,引⽤类型数据存储在内存堆中,⽽内存单元中存放的是堆中存放的地址。
2. 值类型存取快,引⽤类型存取慢。
3. 值类型表⽰实际数据,引⽤类型表⽰指向存储在内存堆中的数据的指针和引⽤。
4. 栈的内存是⾃动释放的,堆内存是.NET中会由GC来⾃动释放。
5. 值类型继承⾃System.ValueType,引⽤类型继承⾃System.Object。
2、C#中所有引⽤类型的基类是什么
1. 引⽤类型的基类是System.Object 。
2. 值类型的基类是System.ValueType。
3. 值类型也隐式继承⾃System.Object。
3.请简述ArrayList和List<T>的主要区别
1. List是接⼝,ArrayList是⼀个实现了该接⼝的类,可以被实例化。(这⼀条应该就是⾯试想知道的答案)
2. ArrayList存在不安全类型(ArrayList会把所有插⼊其中的数据都当做Object来处理);装箱拆箱的操作(费时)
4、请简述GC(垃圾回收)产⽣的原因,并描述如何避免?
new对象时,当可分配的内存不⾜GC就会去回收未使⽤的对象,但是GC的操作是⾮常复杂的,会占⽤很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能。下⾯的建议可以避免GC频繁操作。
1. 减少⽤new创建对象的次数,在创建对象时会产⽣内存碎⽚,这样会造成碎⽚内存不法使⽤
2. 使⽤公⽤的对象(静态成员,常量),但是不能乱⽤,因为静态成员和常量的⽣命周期是整个应⽤程序。
3. 在拼接⼤量字符串时StringBuilder。在使⽤注意,创建StringBuilder对象时要设置StringBuilder的初始⼤⼩如:
4. StringBuilder sbHtml = new StringBuilder (size);
5. 使⽤object pool(对象池)
5、请描述Interface与抽象类之间的不同
相同点:
1. 都可以被继承
2. 都不能被实例化
3. 都可以包含⽅法声明
4. 派⽣类必须实现未实现的⽅法
区别:
1. 抽象基类可以定义字段、属性、⽅法实现。接⼝只能定义属性、索引器、事件、和⽅法声明,不能包含字段。
2. 抽象类是⼀个不完整的类,需要进⼀步细化,⽽接⼝是⼀个⾏为规范。
3. 抽象类只能被单⼀继承,接⼝可以被多重实现。
4. 抽象类更多的是定义在⼀系列紧密相关的类间,⽽接⼝⼤多数是关系疏松但都实现某⼀功能的类中
5. 抽象类是从⼀系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接⼝是为了满⾜外部调⽤⽽定义的⼀个功能约定, 因
此反映的是事物的外部特性
6. 接⼝基本上不具备继承的任何具体特点,它仅仅承诺了能够调⽤的⽅法
7. 接⼝可以⽤于⽀持回调,⽽继承并不具备这个特点
8. 抽象类实现的具体⽅法默认为虚的,但实现接⼝的类中的接⼝⽅法却默认为⾮虚的,当然您也可以声明为虚的
9. 如果抽象类实现接⼝,则可以把接⼝中⽅法映射到抽象类中作为抽象⽅法⽽不必实现,⽽在抽象类的⼦类中实现接⼝中⽅法
6、下列代码在运⾏中会产⽣⼏个临时对象?
1. string a = new string("abc"); a = (a.ToUpper() +"123").Substring(0, 2);C#会报错,java可⾏(个⼈认为答完这个即可)。
2. C#中应该是 string b = new string(new char[] {'a','b','c'});产⽣五个临时变量。
7、下列代码在运⾏中会发⽣什么问题?如何避免?
List<int> ls = new List<int>(new int[] { 1,2,3,4,5});
foreach (var item in ls)
{
Console.WriteLine(item*item);
ls.Remove(item);
}
会产⽣运⾏时错误,不能⼀边遍历⼀边修改。建议使⽤for循环来代替,foreach建议只⽤在读取上,不⽤在修改上。
8、请简述关键字Sealed⽤在类声明和函数声明时的作⽤
类声明时可防⽌其他类继承此类,在⽅法中声明则可防⽌派⽣类重写此⽅法。
9、请简述private,public,protected,internal的区别
1. public:对任何类和成员都公开,⽆限制访问
2. private:仅对该类公开
3. protected:对该类和其派⽣类公开
4. internal:只能在包含该类的程序集中访问该类
5. protected internal:protected + internal
10、反射的实现原理?
审查元数据并收集关于它的类型信息的能⼒。反射个⼈认为,就是得到程序集中的属性和⽅法。
实现步骤:
1. 导⼊using System.Reflection。
2. Assembly.Load("程序集")加载程序集,返回类型是⼀个Assembly。
3. foreach (Type type in assembly.GetTypes()) { string t = type.Name; }
4. 得到程序集中所有类的名称。
5. Type type = assembly.GetType("程序集.类名");获取当前类的类型。
6. Activator.CreateInstance(type); 创建此类型实例。
7. MethodInfo mInfo = type.GetMethod("⽅法名");获取当前⽅法。
8. mInfo.Invoke(null,⽅法参数)。
11、Unity3D是否⽀持写成多线程程序?如果⽀持的话需要注意什么?
1. 仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调⽤
2. ⽀持:如果同时你要处理很多事情或者与Unity的对象互动⼩可以⽤thread,否则使⽤coroutine。
3. 注意:C#中有lock这个关键字,以确保只有⼀个线程可以在特定时间内访问特定的对象。
12、Unity3D的协程和C#线程之间的区别是什么?
1. 多线程程序同时运⾏多个线程 ,⽽在任⼀指定时刻只有⼀个协程在运⾏,并且这个正在运⾏的协同程序只在必要时才被挂起。
2. 除主线程之外的线程⽆法访问Unity3D的对象、组件、⽅法。
3. 在主线程运⾏时同时开启另⼀段逻辑处理,来协助当前程序的执⾏。换句话说,开启协程就是开启⼀个线程。可以⽤来控制运动、序
列以及对象的⾏为。
13、U3D中⽤于记录节点空间⼏何信息的组件名称,及其⽗类名称?
U3D中⽤于记录节点空间⼏何信息的组件名称是 Transform ,它的⽗类是 Component。
14、简述四元数的作⽤,四元数对欧拉⾓的优点?
四元数⽤于表⽰旋转。
相对欧拉⾓的优点:
1. 能进⾏增量旋转。
2. 避免万向锁。
3. 给定⽅位的表达⽅式有两种,互为负(欧拉⾓有⽆数种表达⽅式)。
17.向量的点乘、叉乘以及归⼀化的意义?
1. 点乘描述了两个向量的相似程度,结果越⼤两向量越相似,还可表⽰投影
2. 叉乘得到的向量垂直于原来的两个向量
3. 标准化向量:⽤在只关系⽅向,不关⼼⼤⼩的时候
18、在场景中放置多个Camera并同时处于活动状态会发⽣什么?
实际看到的画⾯由多个camera的画⾯组成;由depth、Clear Flag、Culling Mask都会影响最终合成效果。
19、Prefab的作⽤?如何在移动环境的设备下恰当地使⽤它?
在游戏运⾏时实例化,prefab相当于⼀个模版,对你已有的素材、脚本、参数做⼀个默认配置,以便于以后修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
20、如何安全的在不同⼯程间安全地迁移asset数据?
writeline特点1. 将Assets⽬录和Library⽬录⼀起迁移。
2. 导出包。
3. ⽤unity⾃带的assets Server功能。
21、MeshRender中material和sharedmaterial的区别?
修改sharedMaterial将改变所有物体使⽤这个材质的外观,并且也改变储存在⼯程⾥的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使⽤material替代。
22、请描述游戏动画有哪⼏种,以及其原理?
关节动画:把⾓⾊分成若⼲独⽴部分,⼀个部分对应⼀个⽹格模型,部分的动画连接成⼀个整体的动画,⾓⾊⽐较灵活Quake2中使⽤了这种动画。
单⼀⽹络模型动画:由⼀个完整的⽹格模型构成,在动画序列的关键帧⾥记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,⾓⾊动画较真实。
⾻骼动画:⼴泛应⽤的动画⽅式,集成了以上两个⽅式的优点,⾻骼按⾓⾊特点组成⼀定的层次结构,由关节相连,可做相对运动,⽪肤作为单⼀⽹格蒙在⾻骼之外,决定⾓⾊的外观。⽪肤⽹格每⼀个顶点都会受到⾻骼的影响,从⽽实现完美的动画。(⾻骼动画是由关节动画发展⽽来的,如今基本都使⽤⾻骼动画来实现⾓⾊动画)。
23、alpha blend ⼯作原理?
实际显⽰颜⾊ = 前景颜⾊*Alpha/255 + 背景颜⾊*(255-Alpha)/255。
24、lod是什么?优缺点是什么?
LOD技术即Levels of Detail的简称,意为多细节层次。
LOD技术指根据物体模型的节点在显⽰环境中所处的位置和重要度,决定物体渲染的资源分配,降低⾮重要物体的⾯数和细节度,从⽽获得⾼效率的渲染运算。
优点:可根据距离动态地选择渲染不同细节的模型
缺点:加重美⼯的负担,要准备不同细节的同⼀模型,同样的会稍微增加游戏的容量。
25、MipMap是什么?作⽤?
在三维计算机图形的贴图渲染中有⼀个常⽤的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由⼀系列被预先计算和优化过的图⽚组成的⽂件,这样的贴图被称为 MIP map 或者 mipmap。
26、u3d中碰撞器和触发器的区别?
collider碰撞器会有碰撞的效果,IsTrigger = false,可以调⽤OnCollisionEnter/Stay/Exit函数。
trigger触发器没有碰撞效果,isTrigger = true,可以调⽤OnTriggerEnter/stay/exit函数。
27、物体发⽣碰撞的必要条件?
物体A必须带有(collider+rigidbody)或者CharacterController,另⼀个物体也必须⾄少带有collider。
28、什么叫做链条关节?
Hinge Joint ,他可以模拟两个物体间⽤⼀根链条连接在⼀起的情况,能保持两个物体在⼀个固定距离内部相互移动⽽不产⽣作⽤⼒,但是达到固定距离后就会产⽣拉⼒。(简单说就是弹簧)
29、物体⾃旋转使⽤的函数叫什么?绕某点旋转使⽤函数叫什么?
transform.Rotate和 transform.RotateAround
30、u3d提供了⼀个⽤于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数?
PlayerPrefs.SetInt ()与 PlayerPrefs.GetInt()。
31、unity3d提供了⼏种光源,分别是什么?
1. 平⾏光:Directional Light;
2. 聚光灯:Spot Light;
3. 点光源:Point Light;
4. 区域光源:Area Light(只⽤于烘培)
32、unity3d从唤醒到销毁有⼀段⽣命周期,请列出系统⾃⼰调⽤的⼏个重要⽅法。
Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –> OnDisable –> OnDestroy;
FixedUpdate,每固定帧绘制时执⾏⼀次,和update不同的是FixedUpdate是渲染帧执⾏,如果你的渲染效率低下的时候FixedUpdate调⽤次数就会跟着下降。
FixedUpdate⽐较适⽤于物理引擎的计算,因为是跟每帧渲染有关。
Update就⽐较适合做控制。
33、移动相机动作在哪个函数⾥,为什么在这个函数⾥。
LateUpdate,,是在所有update结束后才调,⽐较适合⽤于命令脚本的执⾏。官⽹上例⼦是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视⾓⾥还未有⾓⾊的空帧出现。
34、什么是渲染管道?
是指在显⽰器上为了显⽰出图像⽽经过的⼀系列必要操作。 渲染管道中的很多步骤,都要将⼏何物体从⼀个坐标系中变换到另⼀个坐标系中去。
主要步骤有:
本地坐标->视图坐标->背⾯裁剪->光照->裁剪->投影->视图变换->光栅化。
35、如何优化内存?
1. 压缩⾃带类库;(只⽤到⼀个简单⽅法就可以⾃⼰写⽽不⽤using)。
2. 将暂时不⽤的以后还需要使⽤的物体隐藏起来⽽不是直接Destroy掉。
3. 释放AssetBundle占⽤的资源。
4. 降低模型的⽚⾯数,降低模型的⾻骼数量,降低贴图的⼤⼩。
5. 使⽤光照贴图,使⽤多层次细节(LOD),使⽤着⾊器(Shader),使⽤预设(Prefab)。
36、C# 的Lambda表达式怎么写?
表达式形式:(Input Param)=>Expression。在表达式左侧的表⽰输⼊参数,右侧的为相应的运算语句或者判断语句等,可包含函数调⽤等复杂⽅式。运算符=>读作为goes to,例如下⾯这个表达t=>t.ClassCode='1001',多做goes to ClassCode equal 1001。
在上述的表达式中,仅仅只有当参数只有⼀个的时候,括号是可选择的,例如下⾯这种含有两个参数时候的情况应该是这样⼦的写法:(a,b)=>a==b
当表达式中的多个参数编译器⽆法⾃动判断类型的时候,则需要显式指定类型。
(int firstIndex, string str) => str.IndexOf('Hello') > firstIndex
37、数列1,1,2,3,5,第n位数是多少?⽤C#递归算法实现
private void Start()
{
print(FunTest(4));
}
public int FunTest(int num)
{
if (num <= 0)
{
return 0;
}
else if (num == 1 || num == 2)
{
return 1;
}
else
{
return FunTest(num - 1) + FunTest(num - 2);
}
}
38、unity的mathf?
Mathf.Abs绝对值
计算并返回指定参数 f 绝对值。
Mathf.Acos反余弦
static function Acos (f : float) : float 以弧度为单位计算并返回参数 f 中指定的数字的反余弦值。
Mathf.Clamp01限制0~1
static function Clamp01 (value : float) :float 限制value在0,1之间并返回value。如果value⼩于0,返回0。如果value⼤于1,返回1,否则返回value 。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论