Unity面试题

1. 请简述值类型与引用类型的区别


1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2.值类型存取速度快,引用类型存取速度慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4.值类型继承自System.ValueType,引用类型继承自System.Object
5.栈的内存分配是自动释放;而堆在.NET中会有GC来释放
6.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。


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


   抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公公只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。
   类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类
   的方法。实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。


3. 结构体和类有何区别?
   
   结构体是一种值类型,而类是引用类型。(值类型、引用类型是根据数据存储的角度来分的)
   就是值类型用于存储数据的值,引用类型用于存储对实际数据的引用。
   那么结构体就是当成值来使用的,类则通过引用来对实际数据操作


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


    ref参数是引用,out参数是输出参数;ref传递的参数必须先初始化


5. C#的委托是什么?有何用处?


  委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。
  用处:使用委托使程序员可以将方法引用封装在委托对象内。
  然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。
  与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。


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


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


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


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


8. 反射的实现原理?


审查元数据并收集关于它的类型信息的能力。
实现原理:在运行时根据程序集及其中的类型得到元数据。
下面是实现步骤:
1. 导入using System.Reflection;
2. Assembly.Load(“程序集”)加载程序集,返回类型是一个Assembly
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. m.Info.Invoke(null,方法参数);


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


多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。
除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)
和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,
所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,
这期间不影响主程序的继续执行,可以协同工作。


10. Unity3d中的碰撞器和触发器的区别?


碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,
可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,
可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或
要检测一个物件是否经过空间中的某个区域这时就可以用到触发器


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


 三个阶段,1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit 


12. 简述四元数Quaternion的作用,四元数对欧拉角的优点?


四元数用于表示旋转
相对欧拉角的优点:
1.能进行增量旋转
2.避免万向锁
3.给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)


13. 请列出系统自带的脚本从唤醒到销毁的几个重要的方法。


Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy 


14. MipMap是什么,作用?


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


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


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


16. 如何优化内存?


有很多种方式,例如 
1.压缩自带类库; 
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉; 
3.释放AssetBundle占用的资源; 
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
6.代码中少产生临时变量


17. 动态加载资源的方式?他们之间的区别


1.Resources.Load();
2.AssetBundle.Load(); 
从AssetBundle读取一个指定名称的Asset并生成Asset内存对象,如果多次Load同名对象,
除第一次外都只会返回已经生成的Asset对象,也就是说多次Load一个Asset并不会生成多个副本(singleton)。
而Resource.Load()只是从默认位置加载。


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


主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。 
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,
部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画; 
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,
骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,
皮肤作为单一网格蒙在骨骼之外,决定角色的外观; 
单一网格模型动画由一个完整的网格模型构成,
在动画序列的关键帧里记录各个顶点的原位置及其改变量,
然后插值运算实现动画效果,角色动画较真实。


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


如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。
动态批处理操作是自动完成的,并不需要你进行额外的操作。
区别:动态批处理一切都是自动的,不需要做任何操作,
而且物体是可以移动的,但是限制很多。
静态批处理:自由度很高,限制很少,缺点可能会占用更多的内存,
而且经过静态批处理后的所有物体都不可以再移动了。


20. 请简述对象池的应用场景和使用过程。


对象池就存放需要被反复调用资源的一个空间,
当一个对象回大量生成的时候如果每次都销毁创建会很费时间,
通过对象池把暂时不用的对象放到一个池中(也就是一个集合),
当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,
如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,
才需要重新创建,利用空间换时间来达到游戏的高速运行效果。









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值