1.如何安全的在不同工程间安全地迁移asset数据?三种方法
答:1.将Assets目录和Library 和Projectsetting目录一起迁移
2.导出包
3.用版本控制工具Git。 unity自带的assets Server功能
3. 简述Unity3D支持的作为脚本的语言的名称
答:Unity脚本语言基于Mono的.Net平台运行,可以使用.Net库,为数据库、XML、正则表达式提供了很好的解决方案
4..Net与Mono关系
答:Mono是.Net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,可以运行于linux,Unix,Mac OS等。
一:什么是协同程序?
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。
二:Unity3d中的碰撞器和触发器的区别?
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
三:物体发生碰撞的必要条件?
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。
四:请简述ArrayList和List的主要区别?
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理),装箱拆箱的操作(费时),List是泛型类,功能跟ArrayList相似,但不存在ArrayList所说的问题。 五:如何安全的在不同工程间安全地迁移asset数据?三种方法
1.将Assets目录和Library目录一起迁移
2.导出包,export Package
3.用unity自带的assets Server功能
六:OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生
Awake –>OnEnable->Start,OnEnable在同一周期中可以反复地发生。
七:MeshRender中material和sharedmaterial的区别?
修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。
八:Unity提供了几种光源,分别是什么
四种。
平行光:Directional Light
点光源:Point Light
聚光灯:Spot Light
区域光源:Area Light
九:简述一下对象池,你觉得在FPS里哪些东西适合使用对象池
对象池就存放需要被反复调用资源的一个空间,当一个对象回大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象包括子弹,敌人,粒子等
十:CharacterController和Rigidbody的区别
Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件
十一:简述prefab的用处
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
十二:请简述sealed关键字用在类声明时与函数声明时的作用
sealed修饰的类为密封类,类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
十三:请简述private,public,protected,internal的区别
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
十四:使用Unity3d实现2d游戏,有几种方式?
使用本身的GUI,在Unity4.6以后出现的UGUI 2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;
3.使用2d插件,如:2DToolKit,和NGUI
十五:在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数
三个阶段,1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit
十六:Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。大家可以自己去查看一下rigidbody的API
十七:什么叫做链条关节?
Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
十八:物体自身旋转使用的函数?
Transform.Rotate()
十九:Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数
PlayerPrefs.SetInt() PlayerPrefs.GetInt()
二十:Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy
二十一:物理更新一般放在哪个系统函数里?
FixedUpdate,固定时间间隔执行 可以在edit->project setting->time设置 update 是在渲染帧执行,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
二十二:在场景中放置多个Camera并同时处于活动状态会发生什么?
游戏界面可以看到很多摄像机的混合。
二十三:如何销毁一个UnityEngine.Object及其子类?
使用Destroy()方法;
二十四:请描述为什么Unity3d中会发生在组件上出现数据丢失的情况
一般是组件上绑定的物体对象被删除了
二十五:LOD是什么,优缺点是什么?
LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。缺点是增加了内存。
二十六:MipMap是什么,作用?
MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
二十七:请描述Interface与抽象类之间的不同
抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公公只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。
二十八:.Net与Mono的关系?
mono是.net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,可以运行于linux,Unix,Mac OS等。
二十九:简述Unity3D支持的作为脚本的语言的名称
Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。JavaScript、 C#、Boo
三十:U3D中用于记录节点空间几何信息的组件名称,及其父类名称
Transform 父类是 Component
三十一:向量的点乘、叉乘以及归一化的意义?
1.点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
2.叉乘得到的向量垂直于原来的两个向量
3.标准化向量:用在只关系方向,不关心大小的时候
三十二:为何大家都在移动设备上寻求U3D原生GUI的替代方案
不美观,OnGUI很耗费时间,效率不高,使用不方便
三十三:请简述如何在不同分辨率下保持UI的一致性
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。UGUI通过锚点和中心点和分辨率也解决这个问题
三十四:什么是LightMap?
LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。
三十五:Unity和cocos2d的区别
Unity3D支持C#、javascript等,cocos2d-x 支持c++、Html5、Lua等。
cocos2d 开源 并且免费
Unity3D支持iOS、Android、Flash、Windows、Mac、Wii等平台的游戏开发,cocos2d-x支持iOS、Android、WP等。
三十六:C#和C++的区别?
简单的说:C# 与C++ 比较的话,最重要的特性就是C# 是一种完全面向对象的语言,而C++ 不是,另外C# 是基于IL 中间语言和.NET Framework CLR 的,在可移植性,可维护性和强壮性都比C++ 有很大的改进。C# 的设计目标是用来开发快速稳定可扩展的应用程序,当然也可以通过Interop 和Pinvoke 完成一些底层操作。更详细的区别大家可以参考这里
三十七:结构体和类有何区别?
结构体是一种值类型,而类是引用类型。(值类型、引用类型是根据数据存储的角度来分的)就是值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作
三十八:ref参数和out参数是什么?有什么区别?
ref和out参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小。不同点就是输出参数必须对参数进行初始化。ref必须初始化,out 参数必须在函数里赋值。ref参数是引用,out参数为输出参数。
三十九:C#的委托是什么?有何用处?
委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。用处:使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
四十:C#中的排序方式有哪些?
选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序
四十一:射线检测碰撞物的原理是?
射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
四十二:Unity中,照相机的Clipping Planes的作用是什么?调整Near、Fare两个值时,应该注意什么?
剪裁平面 。从相机到开始渲染和停止渲染之间的距离。
四十三:如何让已经存在的GameObject在LoadLevel后不被卸载掉?
void Awake() { DontDestroyOnLoad(transform.gameObject); } 四十四:请简述GC(垃圾回收)产生的原因,并描述如何避免?
GC回收堆上的内存
避免:1.减少new产生对象的次数
2.使用公用的对象(静态成员)
3.将String换为StringBuilder
四十五:反射的实现原理?
审查元数据并收集关于它的类型信息的能力。实现原理:在运行时根据程序集及其中的类型得到元数据。下面是实现步骤:
导入using System.Reflection;
Assembly.Load(“程序集”)加载程序集,返回类型是一个Assembly
得到程序集中所有类的名称
foreach (Type type in assembly.GetTypes()) { string t = type.Name; } 4. Type type = assembly.GetType(“程序集.类名”);获取当前类的类型
Activator.CreateInstance(type); 创建此类型实例
MethodInfo mInfo = type.GetMethod(“方法名”);获取当前方法
m.Info.Invoke(null,方法参数);
四十六:简述四元数的作用,四元数对欧拉角的优点?
四元数用于表示旋转
相对欧拉角的优点:
1.能进行增量旋转
2.避免万向锁
3.给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
四十七:移动相机动作在哪个函数里,为什么在这个函数里?
LateUpdate,是在所有的update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是所有的update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
四十八:GPU的工作原理
简而言之,GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序) 顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(定点着色器)完成。 光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。 纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。 像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。 最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。
总结:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。
四十九:什么是渲染管道?
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。主要步骤有:
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化
五十:如何优化内存?
有很多种方式,例如
1.压缩自带类库;
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
6.代码中少产生临时变量
五十一:动态加载资源的方式?他们之间的区别
1.Resources.Load();
2.AssetBundle
区别参考
五十二:请描述游戏动画有哪几种,以及其原理?
主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
五十三:alpha blend工作原理
Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。
五十四:写出光照计算中的diffuse的计算公式
diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射系数、colorLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘,如果结果小于等于0,则漫反射为0。
五十五:两种阴影判断的方法、工作原理。
本影和半影:参考本影和半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
五十六:Vertex Shader是什么,怎么计算?
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
五十七:下列代码在运行中会产生几个临时对象?
string a = new string(“abc”); a = (a.ToUpper() + “123”).Substring(0, 2); 在C#中第一行是会报错的(Java中倒是可行)。
应该这样初始化:
string b = new string(new char[]{‘a’,’b’,’c’}); 答案为:5个临时对象
五十八:下列代码在运行中会发生什么问题?如何避免?
List ls = new List(new int[] { 1, 2, 3, 4, 5 }); foreach (int item in ls) { Console.WriteLine(item * item); ls.Remove(item); } 产生运行时错误,在 ls.Remove(item)这行,因为foreach是只读的。不能一边遍历一边修改。
五十九:Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
六十:Unity3D的协程和C#线程之间的区别是什么?
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
六十一:矩阵相乘的意义及注意点
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累
六十二:为什么dynamic font在unicode环境下优于static font
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
六十三:当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
穿透(碰撞检测失败)
六十四:请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
六十五:什么叫动态合批?跟静态合批有什么区别?
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要你进行额外的操作。
区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。静态批处理:自由度很高,限制很少,缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。
参考
六十六:简述StringBuilder和String的区别?
String是字符串常量。
StringBuffer是字符串变量 ,线程安全。
StringBuilder是字符串变量,线程不安全。
String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。
六十七:Unity3D Shader分哪几种,有什么区别?
表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。
顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。
固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫Shader的时,还可以通过固定功能管线着色器来绘制出一些基本的内容。
六十八:已知strcpy函数的原型是:char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。2.解释为什么要返回char *
char * strcpy(char * strDest,const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) throw “Invalid argument(s)”; char * strDestCopy=strDest; while ((*strDest++=*strSrc++)!=’\0’); return strDestCopy; } 六十九:C#中四种访问修饰符是哪些?各有什么区别?
1.属性修饰符 2.存取修饰符 3.类修饰符 4.成员修饰符。
属性修饰符:
Serializable:按值将对象封送到远程服务器。
STATread:是单线程套间的意思,是一种线程模型。
MATAThread:是多线程套间的意思,也是一种线程模型。
存取修饰符:
public:存取不受限制。
private:只有包含该成员的类可以存取。
internal:只有当前工程可以存取。
protected:只有包含该成员的类以及派生类可以存取。
类修饰符:
abstract:抽象类。指示一个类只能作为其它类的基类。
sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
成员修饰符:
abstract:指示该方法或属性没有实现。
sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。
delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。
const:指定该成员的值只读不允许修改。
event:声明一个事件。
extern:指示方法在外部实现。
override:重写。对由基类继承成员的新实现。
readonly:指示一个域只能在声明时以及相同类的内部被赋值。
static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。
virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。
new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
七十:Heap与Stack有何区别?
1.heap是堆,stack是栈。
2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
3.stack空间有限,heap的空间是很大的自由区。
七十一:值类型和引用类型有何区别?
1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2.值类型存取速度快,引用类型存取速度慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4.值类型继承自System.ValueType,引用类型继承自System.Object
5.栈的内存分配是自动释放;而堆在.NET中会有GC来释放
6.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
七十二:请写出求斐波那契数列任意一位的值得算法
递归实现:
int Fib1(int index) { if(index<1) { return -1; } if(index==1|| index==2) { return 1; } return Fib1(index-1)+Fib1(index-2); } 迭代实现:
int Fib5(int index) { if(index<1) { return -1; } int a1 - 1, a2 = 1, a3 = 1; for(int i = 0; i < index - 2; i++) { a3=a1+a2; a1=a2; a2=a3; } return a3; } 参看更多实现方法
七十三:协同程序的执行代码是什么?有何用处,有何缺点?
function Start() { // 协同程序WaitAndPrint在Start函数内执行,可以视同于它与Start函数同步执行. StartCoroutine(WaitAndPrint(2.0)); print (“Before WaitAndPrint Finishes ” + Time.time ); } function WaitAndPrint (waitTime : float) { // 暂停执行waitTime秒 yield WaitForSeconds (waitTime); print (“WaitAndPrint “+ Time.time ); }
作用:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。
缺点:协同程序并非真线程,可能会发生堵塞。
七十四:什么是里氏代换元则?
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。通俗点:就是子类对象可以赋值给基类对象,基类对象不能赋值给子类对象
参考
七十五:Mock和Stub有何区别?
Mock与Stub的区别:Mock:关注行为验证。细粒度的测试,即代码的逻辑,多数情况下用于单元测试。Stub:关注状态验证。粗粒度的测试,在某个依赖系统不存在或者还没实现或者难以测试的情况下使用,例如访问文件系统,数据库连接,远程协议等。
七十六:概述序列化:
序列化简单理解成把对象转换为容易传输的格式的过程。比如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器端之间传输该对象
七十七:堆和栈的区别?
栈通常保存着我们代码执行的步骤,如在代码段1中 AddFive()方法,int pValue变量,int result变量等等。而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
七十八:概述c#中代理和事件?
代理就是用来定义指向方法的引用。
C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器
七十九:客户端与服务器交互方式有几种?
socket通常也称作”套接字”,实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。
http协议传输的主要有http协议 和基于http协议的Soap协议(web service),常见的方式是 http 的post 和get 请求,web 服务。
八十:Unity和Android与iOS如何交互?
Unity可以到处Android和iOS的工程,然后通过安卓或者iOS的类去给Unity发消息,调用Unity中的方法
八十一:如何在Unity3D中查看场景的面试,顶点数和Draw Call数?如何降低Draw Call数?
在Game视图右上角点击Stats。降低Draw Call 的技术是Draw Call Batching
这个在5.0以后在window-》Profiler下面,快捷键是cmd + 7(ctl + 7
八十二:请问alpha test在何时使用?能达到什么效果?
Alpha Test ,中文就是透明度测试。简而言之就是V&F shader中最后fragment函数输出的该点颜色值(即上一讲frag的输出half4)的alpha值与固定值进行比较。AlphaTest语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
八十三:UNITY3d在移动设备上的一些优化资源的方法
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里面配以相应的检查工具
八十四:四元数有什么作用?
对旋转角度进行计算时用到四元数
八十五:将Camera组件的ClearFlags选项选成Depth only是什么意思?有何用处?
如果把摄像机的ClearFlags勾选为Deapth Only,那么摄像机就会只渲染看得见的对象,把背景会完全透明,这种情况一般用在两个摄像机以上的场景中
八十六:在编辑场景时将GameObject设置为Static有何作用?
设置游戏对象为Static时,这些部分被静态物体挡住而不可见时,将会剔除(或禁用)网格对象。因此,在你的场景中的所有不会动的物体都应该标记为Static。
八十七:有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染?
把A组物体的渲染对列大于B物体的渲染队列,通过shader里面的渲染队列来渲染
八十八:将图片的TextureType选项分别选为““Texture”和“Sprite”有什么区别
Sprite作为UI精灵使用,Texture作用模型贴图使用。Sprite需要2的整次幂,打包图片省资源
八十九:问一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别?为什么?
没有区别,因为不管几张贴图只渲染一次。
九十:什么是DrawCall?DrawCall高了又什么影响?如何降低DrawCall?
Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。降低DrawCall的方法:
Dynamic Batching
Static Batching
高级特性Shader降级为统一的低级特性的Shader。
九十一:实时点光源的优缺点是什么?
可以有cookies – 带有 alpha通道的立方图(Cubemap )纹理。点光源是最耗费资源的。
九十二:Unity的Shader中,Blend SrcAlpha OneMinusSrcAlpha这句话是什么意思?
作用就是Alpha混合。公式:最终颜色 = 源颜色 x 源透明值 + 目标颜色 x(1 - 源透明值)
九十三:简述水面倒影的渲染原理
原理就是对水面的贴图纹理进行扰动,以产生波光玲玲的效果。用shader可以通过GPU在像素级别作扰动,效果细腻,需要的顶点少,速度快
九十四:简述NGUI中Grid和Table的作用?
对Grid和Table下的子物体进行排序和定位
九十五:请简述NGUI中Panel和Anchor的作用
只要提供一个half-pixel偏移量,它可以让一个控件的位置在Windows系统上精确的显示出来(只有这个Anchor的子控件会受到影响)
如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘
3.UIPanel用来收集和管理它下面所有widget的组件。通过widget的geometry创建实际的draw call。没有panel所有东西都不能够被渲染出来,你可以把UIPanel当做Renderer
九十六:能用foreach遍历访问的对象需要实现接口或声明*_*方法的类型
IEnumerable;GetEnumerator
\1. 请简述值类型与引用类型的区别
我是想简述下为什么第一个问题总是这个,因为所有出题的面试官都不走心的, 实际项目肯定是引用类型+值类型混用,难道你没写过? int currLevel =Game.Instance.LevelCount; 值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。 引用类型包括:数组,用户定义的类、接口、委托,object,字符串,null类型,类。 2.C#中所有引用类型的基类是什么 C#基类Object 包名System 3.请简述ArrayList和List
避免:1)减少new产生对象的次数 2)使用公用的对象(静态成员) 3)将String换为StringBuilder 5.请描述Interface与抽象类之间的不同 抽象类表示该类已经有一些具体的实现,而接口只是定义各方法,并没有具提实现,子类继承抽象父类,可以只是继承部分方法或直接引用父类的方法。类实现接口必须实现该接口所有方法 6.下列代码在运行中会产生几个临时对象? 先不论代码书写是否有错,或者命名的,每个new都会产生临时对象,()括号等同于new,那么应该是6 *假如我问面试官,这2年要如何优化,他不看标准答案,能答出来吗?(其实你的思路可能比他还清晰,因为他工作多年,几年来都不会见到这种代码,那他为什么要出这个题?别为难面试官,人家从百度抄题目下来也是不容易的) 7.下列代码在运行中会发生什么问题?如何避免? 答:会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。 8.请简述关键字Sealed用在类声明和函数声明时的作用 答:类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。 关键字Seal既然可以声明类,也可以声明方法 9.请简述private,public,protected,internal的区别 10.反射的实现原理? (以下英文纯手打,无百度) Assembly – 程序集 Class – 类(type) Method –方法(methodinfo) Property – 属性(proinfo) 但是我好像不知道反射原理是什么, 有一个方法是Invoke(“Function_name”)在Unity3d的部分游戏源码见得比较多,作用和普通Call方法一样,虽然有些炫技,但是却是在用反射实现一些游戏逻辑,而且这个游戏逻辑在Android|IOS等平台也是运行正常,反射的作用主要是跨程序集调用,作为一个基本抽象思维的程序员,应该要理解跨当前运行时的程序集本身当然也一个程序集,C#反射能广泛应用,并且出错几乎是0的原因,应该就是C#程序集的开放,格式不变和不加密(微软本身反而不支持开源) 11,.Net与Mono的关系? 有人说.net只能在 windows上面跑,Mono能跨平台,是.net的扩展,这说法肯定是不正确的,C#(.Net)自诞生那天起就为了超越JAVA(应该黑丝2003年,.NET一出就硬抄了JAVA所有的特性,还强调所有新特性超越JAVA),C#的GC就是对应JAVA的垃圾回收机制,可惜的是长期以来C# Framework的体积比现在2018年的JVM虚拟机jre8还大 JVM是一次书写代码,所有平台通用 那么C# Framework(.Net)肯定也是支持跨平台 嗯,MONO是?官方一大段英文其实只要看最后2个就知道based on the ECMA standards ECMA是什么鬼?你现在只要知道来自欧洲的标准就可以了 由于微软的不开源,加上.NET的体积比较大,所以开源程序员都希望找到一种可以用C#或者其他书写,却是极度简化版的.NET,结果当年欧洲某小国某程序员秘密组织找到了微软的内核CIL(Common Intermediate Language通用中间语言,也叫做MSIL微软中间语言)的一种代码指令集,CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行 (微软一开始心比较大,目标是所有语言书写,在所有平台书运行,开发web,app等所有应用,都通过visual studio,结果被Google和乔布斯打的头低低,Google在语言性和跨平台功能一直强调领先,乔布斯主张程序即艺术,iphone1,2狠狠打了Bill Gate2下,国内的c#程序员一直以来是最低下收入的一种程序员) 当时欧洲小国的程序员,优化了CLI并做出了MonoDeveloper这个IDE工具,后来他们成立了一个Xamarim公司,现在已经被微软收购,开源的MONO也没有继续下去 Unity现在应该是基于ECMA这个协议才能得以继续使用旧版本的开源MONO而不需要和微软杠上 最近中兴被美国状告事件,类比一下MONO和微软的关系你就懂了,政治在这里不能多说,我就不提了,但学习程序以外难道你学校就没有政治课?难道你志愿不是考公务员报效国家?你不理政治,政治会来修理你。 我的推论是,mono是一种中间语言,而内核还是.net的一个简化版的虚拟机,能跨平台运行,这个虚拟机类似于jvm虚拟机,提供各种框架,API和程序执行和调用功能,但明显支持的最强语言还是C# 12.简述Unity3D支持的作为脚本的语言的名称 C# JS Boo – 这个我也不清楚 13.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么? Unity仅提供携程,让你可以安心订机票 14.Unity3D的协程和C#线程之间的区别是什么? 线程不安全 同一个时刻只有一个coroutinue运行,但线程可以并行执行,所谓多线程。而coroutinue可以让出当前执行权限,让其他coroutinue插队执行 golang里面是goroutinue lua里面也是携程,可以订机票 Python既提供携程,也提供现成 理论上来说: 携程在服务器开发过程中比较合适,golang这种专为服务器开发的语言就提供携程让你可以预定景点门票; 线程真的很不稳定,不安全,不同的系统,例如windows vs Mac , windos vs Linux, Linux vs Unix都是实现不同的,程序员甚至需要按不同系统平台分别处理和调试; 要是你用的好,线程能订机票,而携程能做出线程的花样 15.U3D中用于记录节点空间几何信息的组件名称,及其父类名称 Transform, 父类Component 16.简述四元数的作用,四元数对欧拉角的优点? 交通大学研究生,乐乐姐的文章必须要去看一下 1)增量旋转 2)避免万向锁 3)给定方位的表达式有2种,互为正负(欧拉角有多种) 17.向量的点乘、叉乘以及归一化的意义? 1)点乘描述了2个方向的相似程度 2) 叉乘得到垂直于这2个的向量的一个向量 3)标准化向量,在一些方向,角度求解中应用,只关心相互间的方位,不考虑长度 18.矩阵相乘的意义及注意点 意义在于向量的变换,旋转,投影,平移 左乘和右乘,不满足交换律(这个答法比较高校书本式,缺少经验的说法) 19.为何大家都在移动设备上寻求U3D原生GUI的替代方案 这是Unity3.5的问题?现在Unity2018都快出了,你还问,面试官你到底有几年Unity经验? 20.请简述如何在不同分辨率下保持UI的一致性 UI适配,如果你曾经很长一段时间用过flex,和cocos2dx,甚至需要你自己去写适配框架 一般的方法有,布局适配,等宽,等长,这几种方法 NGUI在UIRoot提供了这3种适配方法 21.为什么dynamic font在unicode环境下优于static font 使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理, 静态字体体积会很大 22.Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同 Render就是对象在3D世界的绘制 SkinnedMeshRender都提示未来可能被放弃了,面试官这份题真的很旧了,拜托换一下,但SkinnedMeshREnder在换装插件比较流行,SkinnedMeshRenderer需要骨骼、材质、Mesh才能发挥作用,难道Unity要放弃骨骼?? 23.简述SkinnedMesh的实现原理 根据骨骼,动态整体实现表层Mesh,相对普通mesh由不同面片堆砌,根据骨骼结构,对顶点的变换计算出不同的蒙皮,最终进行模型的渲染 24.在场景中放置多个Camera并同时处于活动状态会发生什么? 受Camera覆盖各场景物件均同时实时绘制,主Camera视场里有多个Camera的渲染合集 25.Prefab的作用?如何在移动环境的设备下恰当地使用它? Prefab在实例化的时候用到,主要用于经常会用到的物体做成一个集合方便反复使用,在移动环境中,由于Prefab一般体积比较大,常需要实例化,拆分成合适大小的AssetBundle,离线下载比较恰当 26.如何销毁一个UnityEngine.Object及其子类 Destory 如果是Editor自定义开发需要用DestoryImmediate 27.为什么Unity3D中会发生在组件上出现数据丢失的情况? 对象在Editor外部被删除或者移动位置 28.如何安全的在不同工程间安全地迁移asset数据?三种方法 将Assets目录和Library目录一起迁移 导出包 用unity自带的assets Server功能 29.MeshCollider和其他Collider的一个主要不同点? 答:Meshcollider再快也是基于V3顶点~~ 建议还是用boxcollider,boxcollider本身是基于算法,没有面的概念。 30.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免? 可能出现碰撞检测失败,解决方法无外乎3个 增加高速物体体积 碰撞检测判断时间缩短(Physics.SimulationStep) 控制速度 31.OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
OnEnable \ Awake \ Start 反复发生的是Start,这个问题实际意义不大,好像只有DontdestoryOnload下面的对象会反复调用,但实情如何笔者表示怀疑
谢谢评论区指正,
反复发生的应该是:OnEnable,尽量不要在Update()写代码,所以我现在OnEnable也用的少,毕竟会多次触发的,代码最好还是一次写成,少调试,少踩坑(当然,OnEnable 一般写初始化代码,机会没在这上面踩坑过就是了)
|
|
复制
而Awake()是在实例化时触发,不可能实例化多次
|
|
复制
而Start()在场景运行时,场景内的每个对象都只会触发一次
|
|
复制
32.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义? 答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。 33.Unity3D如何获知场景中需要加载的数据? Resource.Load AssetBundle 34.MeshRender中material和sharedmaterial的区别? 修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。 不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。
(在Editor自定开发中,只能用sharedMaterial,sharedMaterial自动等于material)
最近机缘巧合,居然在看Unity Editor的旧版本的源码
内核用了c++的智能指针,里面的一个share指针,shared_ptr<>,所以有sharedMaterial一说
还有sharedMesh,sharedShader
指针不就是内存,指向同一内存的还不是一同修改,shared_ptr<>又有什么用?又一世纪难题
对于面试教育,如果你记性比较好还是比较有优势的,可当你记住所有标准,又有什么用呢?
当然记住总比记不住要好,记住好像是要有那么点优势,人生和职业生涯其实大家都差不了多少,这点笔者就不在这里展开说
这是电视机电路
这是手机电路
或者里面每个晶体管,每个放大器,电容你都能看懂,但你能做个手机吗?就算你能做手机,美国会给你CPU你做手机吗?所以关键是环境,和你努力与否真没什么关系
C#问题
1.在类的构造函数前加上static会报什么错?为什么?
答:在构造函数如果有public修饰的静态构造函数时会报:“静态构造函数中不允许出现访问修饰符”,如果什么修饰符都不加的话不会报错,静态构造函数一般是起初始化作用。
2.C# StringBuilder类型比string类型的优势是什么?
答:StringBuilde的优势在于拼接,string的优势在于对字符串做一些处理,在使用过程中看具体的需求。
3.C# 函数Func(string a, string b)用Lambda表达式怎么写?
答:(a,b)=>{}
4.数列1,1,2,3,5,8,13…第n位数是多少?用C#递归算法实现
答:
5. 请简述值类型与引用类型的区别
答:区别: 1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中
存放的地址。 2.值类型存取快,引用类型存取慢。 3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。 4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。 5.值类型继承自System.ValueType,引用类型继承自System.Object。
6. 请简述ArrayList和List<>的主要区别
答:ArrayList是非泛型列表,存储数据时把所有的数据都当成object类型存储,存在装箱问题,取出来使用的时候存在拆箱问题,装箱拆箱会使性能变差,而且存在数据安全问题,但是优点在于可以让值类型和引用类型互相转换。
List是泛型列表,在使用的时候才去定义数据类型,泛型避免了拆箱装箱的问题,存入读取速度较快,类型也更安全。
7. 请简述GC(垃圾回收)产生的原因,并描述如何避免?
答:GC回收堆上的内存 避免:1)减少new产生对象的次数 2)使用公用的对象(静态成员) 3)如果字符串拼接多的将String换为StringBuilder
8. 请描述Interface与抽象类之间的不同
答:语法不同处:1.抽象类中可以有字段,接口没有。
2.抽象类中可以有实现成员,接口只能包含抽象成员。
3.抽象类中所有成员修饰符都可以使用,接口中所有的成员都是对外的,所以不需要修饰符修饰。
用法不同处:1.抽象类是概念的抽象,接口关注于行为。
|
|
复制
9.下列代码在运行中会产生几个临时对象?
string a = new string(“abc”);
a = (a.ToUpper() + “123”).Substring(0, 2);
答:第一行是会出错的。应该这样初始化:
string b = new string(new char[]{‘a’,‘b’,‘c’});
3个临时对象
10.下列代码在运行中会发生什么问题?如何避免?
List
foreach (int item in ls)
{
Console.WriteLine(item * item);
|
|
复制
}
答:会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。
使用foreach时候不要对内容进行修改,如果要修改可以使用for
11.请简述关键字Sealed用在类声明和函数声明时的作用
答:Sealed访问修饰符用于类时,该类是密封类,可防止其他类继承此类。
在方法中使用时则可防止派生类重写此方法。
12.请简述private,public,protected,internal的区别
答:public:对任何类和成员都公开,无限制访问 private:仅对该类公开 protected:对该类和其派生类公开 internal:只能在包含该类的程序集中访问该类 protected internal:protected + internal
13.反射的实现原理?
答:审查元数据并收集关于它的类型信息的能力。
14.Net与Mono的关系?
答:mono是.net的一个开源跨平台工具。.net只能在windows下运行,mono可以实现跨平台,可以运行于linux,Unix,Mac OS等。
15.请说出4种面向对象的设计原则,并分别简述它们的含义。
答:1) 单一职责原则:一个类,最好只做一件事,只有一个引起它的变化.
2) 开放-封闭原则:对于扩展是开放的,对于更改是封闭的
3) 里氏替换原则:子类必须能够替换其基类
4) 依赖倒置原则:依赖于抽象
5) 接口隔离原则 :使用多个小的专门的接口,而不要使用一个大的总接口。
16. Hashtable是无序的吗?
答:电脑没有绝对的无序,hashtable是通过哈希码让开发者感觉无序
17.请简述ArrayList和List的主要区别?
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理),装箱拆箱的操作(费时),List是泛型类,功能跟ArrayList相似,但不存在ArrayList所说的问题
18.简述一下对象池,你觉得在FPS里哪些东西适合使用对象池
对象池就存放需要被反复调用资源的一个空间,当一个对象回大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象包括子弹,敌人,粒子等
19.结构体和类有何区别?
结构体是一种值类型,而类是引用类型。(值类型、引用类型是根据数据存储的角度来分的)就是值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作
20.C#的委托是什么?有何用处?
委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。用处:使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
21.请简述sealed关键字用在类声明时与函数声明时的作用
sealed修饰的类为密封类,类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
22.C#中的排序方式有哪些?
鸡尾酒算法,选择排序,冒泡排序(两层for循环就是冒泡,另外理解鸡尾酒算法也就是定向冒泡排序),快速排序,插入排序,希尔排序,归并排序(可以百度学一下)
23.请简述GC(垃圾回收)产生的原因,并描述如何避免?
GC回收堆上的内存
避免:1.减少new产生对象的次数
2.使用公用的对象(静态成员) 3.将String换为StringBuilder
24.反射的实现原理?
审查元数据并收集关于它的类型信息的能力。实现原理:在运行时根据程序集及其中的类型得到元数据。下面是实现步骤:
导入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(“方法名”);获取当前方法
m.Info.Invoke(null,方法参数);
Unity问题
UI
1.NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么?
答: 1.直接监听事件:在按钮上绑定一个带有OnClick脚本,但这种方法不太好用,也不灵活。
2.ButtonScript:在按钮上添加BoxCollider,在添加ButtonScript脚本,把要调用的方法放到场景中一个物体上,一般放在摄像机上,因为摄像机一直存在,然后把这个方法添加到ButtonScript脚本里写好的委托里面,所以可以添加多个方法,一旦点击就触发事件。
2.请简述NGUI中Panel和Anchor的作用
答:Panel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化,以减少绘制命令的调用。
Anchor是NGUI中屏幕分辨率的自适应性,来适应不同的分辨率的屏幕显示。
3.为何大家都在移动设备上寻求U3D原生GUI的替代方案
答:1.不美观
2.OnGUI很耗费时间
3.使用不方便
- drawcall很高
4.使用原生GUI创建一个可以拖动的窗口命令是什么?
答:GUI.DragWindow()
4.动态加载资源的方式?他们之间的区别
1.Resources.Load();
2.AssetBundle
5.使用Unity3d实现2d游戏,有几种方式?
答:1.使用本身的GUI
2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴
3.使用2d插件,如:2DToolKit
碰撞
6.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法
答:在两个平面上分别取一个向量,然后看是否相交
7.MeshCollider和其他Collider的一个主要不同点?
答:MeshCollider是网格碰撞器,对于复杂网状模型上的碰撞检测,比其他的碰撞检测精确的多,但是相对其他的碰撞检测计算也增多了,所以一般使用网格碰撞也不会在面数比较高的模型上添加,而会做出两个模型,一个超简模能表示物体的形状用于做碰撞检测,一个用于显示。
8.Unity3d中的碰撞器和触发器的区别?
答:1.碰撞器物体不能互相进入到对方内部,触发器可以
2.触发器角色控制器可以使用,碰撞器中不能使用
3.触发器没有物理属性了,碰撞器可以有力存在
4.碰撞器调用OnCollisionEnter/Stay/Exit函数,触发器调用OnTriggerEnter/Stay/Exit函数
9.物体发生碰撞的必要条件
答:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
CharacterController和Rigidbody的区别?
CharacterController自带胶囊碰撞器,里面包含有刚体的属性;
Rigidbody就是刚体,使物体带有刚体的特征。
10.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
答:穿透(碰撞检测失败)
避免的方法:把刚体的实时碰撞检测打开Collision Detection修改为Continuous Dynamic
在unity3d中物体发生碰撞的整个过程中,有几个阶段,分别列出对应的阶段函数
主要是三个阶段:1.Collider.OnCollisionEnter 进入碰撞, OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider. 当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用。 2.Collider.OnCollisionStay 逗留碰撞, OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider. 每个collider/rigidbody触动rigidbody/collider,将在每帧调用OnCollisionStay。通俗的说, 一个碰撞器或刚体触动另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。 3.Collider.OnCollisionExit 退出碰撞, OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider. 当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用。
11.CharacterController和Rigidbody的区别
Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件
12.简述prefab的用处
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。
动画
11.一个简单的游戏,怪物会走动\攻击\死亡,游戏角色会走动,跳跃\攻击\格挡\死亡,还会接受玩家从输入端输入的指令,NPC会走动,他们彼此之间可以互相通信.请画出以上三种角色的UML图示.
答:
12.请描述游戏动画有哪几种,以及其原理?
答:主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
1.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画。
2.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
3.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观,皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。
13.反向旋转动画的方法是什么?
答: 反转动画,将动画的速度调到-1。
14.写出Animation的五个方法
答:AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样 、CrossFade淡入淡出切换动画、IsPlaying是否正在播放某个动画
15.动画层(AnimationState Layers)的作用是什么?
答:动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画
16.Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法?
答:ITween是补间动画的一个插件,主要作用就是给出开始、结束的值、时间,此插件实现各种动画,晃动,旋转,移动,褪色,上色,音量控制等等。
方法:1.MoveTo 物体移动
2.ColorTo:随着时间改变对象的颜色组
3.LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置
17.法线贴图 、CG动画 ?
答:法线贴图:是一种特殊的纹理,可以应用在3D表面,让低模呈现出更明显的凹凸效果。一般应用在CG动画、美术效果要求较高的单机游戏
CG动画:游戏中的CG动画其实是用3D模拟引擎制作的游戏短片,一般画面效果比较真实。
线程和协程
18.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
答:Unity支持多线程,如果同时要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:1.虽然支持多线程,但是仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用,所以如果使用的话需要把组件中的数值传到开启的新线程中。 2.C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
19.Unity3D的协程和C#线程之间的区别是什么?
答:多线程程序同时运行多个线程,除主线程之外的线程无法访问Unity3D的对象、组件、方法,而在任一指定时刻只有一个协程在运行。
20.什么是协同程序?
答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。
四元数
21.四元数是什么?主要作用什么?对欧拉角的优点是什么?
答:所谓四元数,就是把4个实数组合起来的东西。4个元素中,一个是实部,其余3个是虚部
作用:四元数用于表示旋转 优点: 1)能进行增量旋转 2)避免万向锁 3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁]
四元数由4个数组成,旋转矩阵需要9个数
两个四元数之间更容易插值
四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易
与旋转矩阵类似,两个四元组相乘可表示两次旋转
摄像机
22.在场景中放置多个Camera并同时处于活动状态会发生什么?
答:游戏界面可以看到很多摄像机的混合
23.Unity摄像机有几种工作方式,分别是什么?
答:正交和透视
正交无法看到一个物体距离自己有多远,或者远近的变化,物体也不会随着距离而收缩,所以一般做2D游戏或者是UI时会使用正交摄像机。
透视一般看物体会随着距离有大小的变化,一般3D游戏里经常使用这种摄像机。
预制物
24.Prefab的作用?如何在移动环境的设备下恰当地使用它?
答:Prefab是预制物,一般当游戏中需要频繁创建一个物体时,使用预制物可以节省内存,方便创建,方便对游戏物体进行操作,方便对属性进行修改。
unity 当需要频繁创建一个物体对象时,怎样减少内存
答:动态加载再实例化,如果自己不主动清理内存的话,再次加载不会增加内存的,会自动去取之前已经加载好的assets,如果这一个assets你都嫌多的话,那你只能减资源了,比如,模型面数,纹理尺寸等
Shader
25.出光照计算中的diffuse的计算公式
答:实际光照强度l=环境光(lambient)+漫反射光(Idiffuse)+镜面高光(lspecular)
|
|
复制
26.MeshRender中material和shader的区别?
答:MeshRender是模型渲染的组件,有此组件物体才能显示出来
Material是材质球,实际就是shader的实例,并进行赋值,贴图、纹理、颜色等。
Shader是着色器,实际上是一段程序,还可以用来实现一些仅靠贴图不容易实现的效果,如玻璃。
Shader大致分为:1.表面着色器
2.顶点和片元着色器
3.固定功能着色器
27.alpha blend工作原理
答:Alpha Blend是 实现透明效果,Color = 原颜色alpha/255+目标色(255-alpha)/255
28.光照贴图 的优势是什么?
答:1.使用光照贴图比使用实时光源渲染要快
2.可以降低游戏内存消耗
3.多个物体可以使用同一张光照贴图
29.Vertex Shader是什么,怎么计算?
答:顶点着色器:顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的
transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
.unity3d提供了几种光源,分别是什么
答:4种,Directionl light ,Point Light ,Spot Light,Area Light
Unity系统API
物理更新一般在哪个系统函数里?
答:FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
30.OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
答:Awake –>OnEnable->Start OnEnable在同一周期中可以反复地发生
31.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
32.物理更新一般放在哪个系统函数里?
答:FixedUpdate因为不受到计算机帧频的影响,所以比较适合于做物理方面的更新。
33.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?
答:LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
34.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
答: 当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。 当renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible 当renderer(渲染器)在任何相机上可见时调用:OnBecameVisible
35.Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数
答:PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
36.动态加载资源的方式?区别是什么?
答:1.Resources.Load();
2.AssetBundle
区别:
Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。 简单说,Resources资源的加载是动态加载内部的,AssetBundle 是动态加载外部的
37.以下哪个函数在游戏进入新场景后会被马上调用?
答:MonoBehaviour.OnLevelWasLoaded
38.如何销毁一个UnityEngine.Object及其子类对象
答:Destory
39.获取、增加、删除组件的命令分别是什么?
答:获取:GetComponent
增加:AddComponent
没有删除组件只有让组件不生效:enable
40.Application.loadLevel命令是什么?
答:加载关卡
41.调试记录到控制台的命令是什么?
答: Debug.Log();
42.LayerMask.NameToLayer()这个方法有什么作用?
答:层索引
43.localPosition与Position的使用区别?
答:localPosition:自身位置,相对于父级的变换的位置,局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。
Position:在世界坐标transform的位置,世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。
44.物体自身旋转使用的函数?
答:Transform.Rotate()
45.物体围绕某点旋转使用的函数?
答:Transform.RotateAround()
46.U3D中用于记录节点空间几何信息的组件名称,及其父类名称
答:Transform 父类是 Component
47.写一个计时器工具,从整点开始计时,格式为:00:00:00
答:
|
|
复制
物理引擎
48.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.
答:添加刚体使小鸟模拟受到重力影响。
49.实现吊机吊物体的功能
50.上机题:用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可)。
答:在场景中添加一个Plan,Camera,Directional Light,Cube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。
1.鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:
2.鼠标实现在场景中拖动物体:
解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理
51.Material和Physic Material区别?
答:PhysicMaterial 物理材质:主要是控制物体的摩擦,弹力等物理属性。
Material材质:主要是控制一个物体的颜色,质感等显示。
52.CharacterController和Rigidbody的区别?
答:CharacterController自带胶囊碰撞器,里面包含有刚体的属性;
Rigidbody就是刚体,使物体带有刚体的特征。
53.Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。
54.什么叫做链条关节?
答:Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
55.什么是导航网格( NavMesh)?
答: Unity内一种用于实现自动寻路的网格
56.Unity3d提供了几种光源类型,分别是哪几种?
答:四种。
平行光:Directional Light
点光源:Point Light
聚光灯:Spot Light
区域光源:Area Light
Unity引擎问题
57.简述Unity3D支持的作为脚本的语言的名称
答:Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。 Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。 JavaScript C# Boo 目前已经取消了其他两种的语言,只剩下C#
58.向量的点乘、叉乘以及归一化的意义?
答:1)点乘计算两个向量之间的夹角,还可表示某一方向的投影 2)叉乘得到的是法向量 3)标准化向量:用在只关系方向,不关心大小的时候
59.矩阵相乘的意义及注意点?
答:用于表示线性变换:旋转、缩放、投影、平移、仿射 注意:矩阵的蠕变:误差的积累
60.为什么dynamic font在unicode环境下优于static font?
答:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。 使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
61.Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同
答:render是渲染器,渲染器可以使物体显示在屏幕上。
MeshRender是网格渲染,SkinnedMeshRender是蒙皮网格渲染器
62.简述SkinnedMesh的实现原理(这是模型相关的)
答:骨骼蒙皮动画,模型本身是静态的,是因为通过蒙皮,使模型每个点都有Skin数据,Skin数据包括顶点受到哪些骨骼影响以及这些骨骼影响顶点的权重值,还有动画数据,有了Skin数据的模型就可以根据动画数据进行显示动画了。
63.为什么Unity3D中会发生在组件上出现数据丢失的情况?
答:组件上绑定的对象被删除了
64.如何安全的在不同工程间安全地迁移asset数据?三种方法
答: 1)将Assets目录和Library目录一起迁移
2)导出资源包
3)用unity自带的assets Server功能(了解就行)
65.Lod是什么,优缺点是什么?
答:LOD是Level of detail简称,意为多层次细节,是最常用的游戏优化技术,LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态的选择渲染不同细节的模型
缺点:增加美工工作量,增大了游戏的容量。
66.两种阴影判断的方法、工作原理。
答:自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域收不到光照照射而形成的阴影。
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后在按视点位置对场景进行相应处理得到所要求的师徒(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)若是动态光源此方法就无效了。
67.MipMap是什么,作用?
答:MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
68.用代码实现第三角色控制器
代码自己写出来
69.Mecanim系统中,Body Mask的作用是?
答:指定身体的某一部分是否参与渲染 即身体遮罩
70.Unity连接数据库
答:需要得到Mono.Data.Sqlite.dll 文件与System.Data.dll文件 (可以说这一块不太了解)
71.如何优化内存?
答:1.压缩自带类库
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉
3.释放AssetBundle占用的资源
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小
5.使用光照贴图
6.使用多层次细节(LOD)
7.使用着色器(Shader)
8.使用预设(Prefab)等
72.你用过哪些插件?
答:NGUI/DF/ITeen/可以自己去找一些插件使用一下。或则看我博客的几款插件使用
在哪个模块下可以修改Render Path?
a. Camera
b. Light
c. Render settings
d. ProjectSetting=》Player=》OtherSettings
图形图像
1.什么是渲染管道?
答:是指在显示器上为了显示出图像而经过的一系列必要操作。
渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要有三步:应用程序阶段,几何阶段 光栅阶段
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。
2.什么是矢量图 ?
答:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。
3.什么是矩阵?矩阵运算?
答:矩阵:横轴排列的二维数据表格
矩阵运算:
加减 限制条件:行和列必须相同,对应相加相减得到结果
乘法 限制条件:要求左矩阵的行和右矩阵的列必须同,行数和左矩阵相等,列数和右矩阵相等,结果的第i行第j列,是左矩阵的第i行和右矩阵的第j列逐个相乘并把结果相加,得到结果是结果 的 第i行第j列
4.角度和弧度的转换
答:角度和弧度
度和弧度之间的换算 1弧度 = 180度 /pi(约57.3)
|
|
复制
5.矢量标量
答:矢量有方向如力速度 标量只有大小没有方向如温度
矢量取模就是只要大小不要方向
^单位向量 有方向 大小为1的向量
矢量的加法:是矢量的几何和,服从平行四边形规则
矢量满足交换律,满足结合律
在直角坐标系中,矢量等于骑在坐标轴上投影的矢量之和(二维矢量可以看做三维矢量的特例也就是说 三维成立,二维也成立)
矢量减法:
大小相等 方向相反 称为逆矢量
任意多个矢量首尾相连接组成闭合多边形,其结果必为0
矢量的乘法:点积(内积、标量积)、叉积(外积)结果是矢量
点积方法 dot