U3D面试题
直接上新....
-
什么是协同程序?
答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。 -
Unity3D中的碰撞器和触发器的区别?
答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
-
物体发生碰撞的必要条件?
答:两个物体都必须带有碰撞器Collider,其中一个物体还必须带有Rigidbody刚体。 -
请简述GC(垃圾回收)产生的原因,并描述如何避免?
答:GC回收堆上的内存
避免:
1)减少new产生对象的次数
2)使用公用的对象(静态成员)
3)将String换为StringBuilder - C#中变量可以分为值类型和引用类型:值类型有简单类型,结构类型,枚举类型;引用类型:类,代表,数组,接口;
-
unity 中定义的10个重要的事件函数,按照执行的先后顺序,依次为:
Reset //Awake //OnEnable //Start //FixedUpdate //Update //LateUpdate //OnGUI //OnDestroy -
反射的实现原理?
答:审查元数据并收集关于它的类型信息的能力。
实现步骤:
导入using System.Reflection;
Assembly.Load("程序集");//加载程序集,返回类型是一个Assembly
得到程序集中所有类的名称
foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
Type type = assembly.GetType("程序集.类名");//获取当前类的类型
Activator.CreateInstance(type);
//创建此类型实例
MethodInfo mInfo = type.GetMethod("方法名");//获取当前方法
mInfo.Invoke(null,方法参数); -
简述四元数Quaternion的作用,四元数对欧拉角的优点?
答:四元数用于表示旋转
相对欧拉角的优点:
能进行增量旋转
避免万向锁
给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式) -
如何安全的在不同工程间安全地迁移asset数据?三种方法
答:
1.将Assets和Library一起迁移
2.导出包package
3.用unity自带的assets Server功能 -
OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
答:Awake–>OnEnable->Start
OnEnable在同一周期中可以反复地发生 -
MeshRender中material和sharedmaterial的区别?
答:修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。
不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。 -
TCP/IP协议栈各个层次及分别的功能
答:网络接口层:这是协议栈的最低层,对应OSI的物理层和数据链路层,主要完成数据帧的实际发送和接收。
网络层:处理分组在网络中的活动,例如路由选择和转发等,这一层主要包括IP协议、ARP、ICMP协议等。
传输层:主要功能是提供应用程序之间的通信,这一层主要是TCP/UDP协议。
应用层:用来处理特定的应用,针对不同的应用提供了不同的协议,例如进行文件传输时用到的FTP协议,发送email用到的SMTP等。 -
委托是什么?委托跟事件的区别?
委托是把方法当做参数应用的一种形式,委托能很方便的通过“+=”“-=”的方法添加删除方法并调用方法,减少了一定量的代码而不失功能,更方便在可以轻松调用其他类中的方法
-
谈谈你对C,C++,Java,C#的看法?他们之间有什么区别?你最熟悉哪一种语言,谈谈你对这门语言的理解?
都是一种计算机语言,c++是c的优化版,C#又是在两者的基础上的进一步升级,
他们之间的区别在于都是一门独立的计算机语言,有各自的语法特点
熟悉C#,C#是一门面向对象的计算及语言,应用方向广泛 -
面向对象有什么特点?
面向对象有三大特点:封装 继承 多态;
封装:是对代码的一种保护,也是对代码功能的分类,体现在一但封装代码之后可以防止对代码的随意访问和修改让代码更具稳定性,封装之后可以对实现功能的代码进行分类及调用
继承:把父类的非私有成员通过继承使子类同样拥有,但子类不需要把父类的非私有成员全部重新在子类中书写出来即可调用。大大减少了代码的重复出现。
多态:是指不同的形态,如通过父类实例化子类的对象
-
怎样处理异常?Finally有什么用?紧接着如果使用了return Finally还会执行么?
用try·····catch····,Finally的作用是无论是否出现异常都照常执行其中的代码, 不会
- 怎么样对类进行排序?
-
一个对象集合,我想根据类中的某一个属性对对象进行排序,应该怎么做?
不能用循环去比较,,想想别的
-
说说你常用的排序算法,然后就是会选其中一种让你说明该排序的基本思路,和大概的实现过程
冒泡排序:先确定从大到小还是从小到大,然后用第一个下标的数跟后面所有元素比较,出现大于或小于它的就互换值再跟下一个下标的元素比较,然后再从第二个下标循环下去直到倒数第二个下标比较完截止 ;
插入排序:先确定从大到小还是从小到大,然后建一个长度相同的空数组,把最初的数组的元素一个一个放入最后面一个大于或小于新数组的某个元素后面,这个元素后面的元素向后移一个下标;
快速排序 :先确定从大到小还是从小到大,然后用第一个下标的元素跟后面元素比较,出现大于或小于它的就记录下标,用记录下标下的预算继续与后面的元素比较知道最后一个元素为止,再把第一个下标的元素与记录的下标的元素互换,再从第二下标开始比较记录 -
知道什么是反射么?请介绍一下反射
- 什么是Lambda表达式? 有什么作用?
-
知道正则表达式么? 回答了解一点 然后就是 怎么拿到0-9之间的所有数?请表述出来
-
静态类和静态方法的区别?静态类和普通类的区别?普通类为什么实例化对象之后才能去调用类里面的方法和属性?
静态类包含静态方法,但静态方法不止存在静态类中
静态类只能包含静态成员和常量,普通类不止包含静态成员和常量还包含其他非静态成员和变量
普通类都属于引用类型
-
值类型和引用类型有什么区别?
值类型存储的位置在栈空间,引用类型的存储的位置在堆空间,
值类型的改变是把原空间中的内容进行改变,引用类型的改变是开辟新的空间赋予新的内容再把新的空间位置指向引用类型
-
Socket通信用到了什么协议?TCP和UDP协议的区别?你还知道哪些层的哪些协议?
用到了TCP和IP,UDP协议,TCP协议的传输速度相对较慢但是传输的内容不会丢失,而UDP协议则是传输速度非常快但在传输的过程中容易出现数据丢失的情况 -
NGUI和UGUI的区别?可能真正的区别真的不是百度上的那些。。我对一个从unity1.0
做到现在的人说NGUI和UGUI的区别。。。
-
【ngui与ugui的区别】
1) uGUI的Canvas 有世界坐标和屏幕坐标
2) uGUI的Image可以使用material
3) UGUI通过Mask来裁剪,而NGUI通过Panel的Clip
4) NGUI的渲染前后顺序是通过Widget的Depth,而UGUI渲染顺序根据Hierarchy的顺序,越下面渲染在顶层.
5) UGUI 不需要绑定Colliders,UI可以自动拦截事件
6) UGUI的Anchor是相对父对象,没有提供高级选项,个人感觉uGUI的Anchor操作起来比NGUI更方便
7) UGUI没有Atlas一说,使用Sprite Packer
8) UGUI的Navigation在Scene中能可视化
9) UGUI的事件需要实现事件系统的接口,但写起来也算简单
【ngui与ugui的优缺点】
1) NGUI还保留着图集,需要进行图集的维护。而UGUI没有图集的概念,可以充分利用资源,避免重复资源。
2) UGUI出现了锚点的概念,更方便屏幕自适应。
3) NGUI支持图文混排,UGUI暂未发现支持此功能。
4) UGUI没有 UIWrap 来循环 scrollview 内容。
5) UGUI暂时没有Tween组件。
-
你熟悉哪些插件?举个例子说明一下
NGUI、A星寻路、对象池 、easytouch等 -
什么时候销毁不用的对象?你怎么知道那个对象现在没有使用可以销毁?析构函数?
确定对象不再使用以后可以销毁,根据经验和具体项目把确定可以销毁的销毁,后期在优化的时候再补充