一、摄像机camera 中skybox、solid color、depth only、don’t Clear的区别
答:skybox未被摄像机渲染的地方用天空盒子填充,solid color未被摄像机渲染的地方用背景色填充,depth only只渲染某个深度,深度越大显示的时候最先显示;don`t Clear 不清除渲染和缓存
二、什么是观察者模式
答:观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF(设计模式的四个作者)给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
TencentNews 发布者—新闻信息的发布者
QQ用户 订阅者 — 接收发布者发布的新闻消息
微信用户 订阅者 — 接收发布者发布的新闻消息
三、谈谈什么是工厂模式
答:工厂模式提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象
四、重写和重载的区别
答:override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
五、什么是委托,什么是事件,事件和委托的区别
答:1、委托是一个类,可以实例化,可通过构造函数将方法作为参数传递给委托实例,事件是一种特殊的委托类型,而委托与事件的关系是:委托是事件的类型,事件是委托类型的对象
2、委托使用delegate定义,事件使用event定义
3、订阅方式不同,委托可使用+=,-=,=绑定和注销方法,事件使用+=,-=订阅和取消订阅方法(在事件定义的类中,可以使用=,在类外必须使用+=,-=)
4、触发方式不同,委托的触发有两种方式:委托对象.Invoke(参数列表),或委托对象(参数列表),事件的触发:事件对象(参数列表)
5、事件的触发必须在事件的定义类中执行
6、委托还有两种使用方式:Fanc<>和Action<>,两者的不同之处在于Action定义的委托是可以有参数但不具有返回值的委托类型,而Fanc定义的是可以有参数但必须具有返回值的委托类型
六、解释一下什么是面向对象和面向过程?
面向对象:以类为基础,所有功能在类中定义和实现,使用时通过对象调用,相对于面向过程来说,面向对象功能更加强大,也相对复杂。
面向过程:以方法为基础,把功能代码封装在函数进行调用。
七、使用字符串需要注意哪些问题?
String是字符串常量,是不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,存储新的值,所以效率很低,建议在不断更改String对象的地方不要使用String类型。此时可使用StringBuilder,StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改。
八、正交摄像机和透视摄像机的区别,第一人称摄像机Fov变化会产生怎样的摄像机效果?
摄像机的模式不同,渲染出来的画面也不同,正交模式渲染2d平面,制作UI时使用,透视模式可以渲染3d物体,会根据对象和摄像机的距离,产生远小近大的效果,一般在3d世界中使用。
Fov可调节摄像机的视口效果,改变Fov的值会影响摄像机渲染的物体的大小
九、给定屏幕一个点(x,y)如何进行对场景中的GameObject进行射线拾取?
需要把屏幕坐标转换成世界坐标进行射线检测
代码:Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
十、一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别吗?为什么?
没有区别,因为不管几张贴图只渲染一次。
十一、json与xml的优缺点比较
xml的优点
(1)格式统一
(2)容易与其他系统进行远程交互,数据共享比较方便
xml的缺点
(1)xml文件庞大,文件格式复杂,传输占带宽
(2)服务器和客户端都需要花费大量代码来解析xml,导致服务器和客户端代码变得异常复杂且不易维护
(3)客户端和服务端解析xml花费较多的资源和时间
json的优点
(1)数据格式比较简单,易于读写,格式是压缩的,占用带宽小
(2)易于解析,包括JavaScript可以通过简单的通过eval_r()进行json数据的读取
json的缺点
(1)没有xml那么通用
(2)json格式目前还在推广阶段
十二、什么是协同程序?跟线程的区别?
答:在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程
协程(协同程序): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。
线程: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。
1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component
2.线程,多线程是阻塞式的,每个IO都必须开启一个新的线程,但是对于多CPU的系统应该使用thread,尤其是有大量数据运算的时刻,但是IO密集型就不适合;而且thread中不能操作unity的很多方法和component
十三、Unity3d中碰撞器和触发器的区别?
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
触发检测的函数不一样
OnCollisionEnter/Stay/Exit
OnTriggerEnter/Stay/Exit
碰撞器有碰撞效果,而触发器没有碰撞效果
十四、物体发生碰撞的必要条件?
双方都需要碰撞器,一方有刚体,而且必须是运动的带有刚体的物体才能检测到碰撞
十五、如何安全的在不同工程间安全的迁移asset数据?三种方法
(1)将Assets目录和Library目录一起迁移
Library目录:Unity会把Asset下支持的资源导入成自身识别的格式,以及编译代码成为DLL文件,都放在Library文件夹中
(2)导出包,export Package
(3)用unity自带的assets Server功能
十六、清简述ArrayList和List的主要区别?
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理)装箱拆箱的操作(费时),List是接口,ArrayList是一个实现了该接口的类,可以被实例化
十七、C#中的5中访问权限修饰符是什么?区别?
public 对任何类和成员都公开,无访问限制
private 仅在该类中访问
protected 在该类和其派生类中可以访问
internal:只能在包含该类的程序集中访问该类
protected_internal:一种组合限制修饰符,它只可以被本组合体内所有的类和这些类的继承子类所存取。
十八、冒泡排序的原理?
每次对相邻的两个元素进行比较,若前者大于后者则进行交换,如此一趟下来最后一趟的就是最大元素,重复以上的步骤
算法优化:当里面的一层循环在某次扫描中没有交换则说明此时数组已经全部有序,无需再再次扫描。所以可以添加一个标记每交换一次就进行标记,如果某次没有没有标记就说明已经有序了
十九、解释一下C#中的索引器?可用于索引的类型有那些?索引器是否可以重载?
索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,是程序看起来更为直观,更容易编写
集合
可以
二十、OnEnable、Awake、Start运行时的发生顺序?以及在什么时候发生?
Awake OnEnable Start 如果OnEnable为false,则只运行Awake
都是在游戏开始运行前调用,Awake在挂载到游戏物体身上时会调用
二十一、MeshRender中的material和sharedmaterial的区别?
sharedmaterial是自身的材质,改变该材质只会影响自身,而改变material则会影响运用该材质的所有物体
二十二、Unity的光源有那些?那种可用于灯光烘培?
点光源,平行光源,区域光,聚光灯
区域光
二十三、简述一下对象池?什么时候能用到对象池?
存放一些对象的集合,当某些相同的对象需要重复的销毁和创建时可以用对象池,将对象存入对象池中,使用时设置setActive为true,销毁时设置为false,可以减少内存的消耗
二十四、CharacterController和Rigidbody的区别?
rigidbody是用来模拟真实的物理效果,它可以重力和其他作用力的效果
charactercontroller它自带一个胶囊体碰撞器,它可以收到重力这一影响,但是只有使用simpleMove函数进行移动时才会体现出重力,使用Move函数移动则不提现重力
二十五、什么是装箱?什么是拆箱?
装箱:将值类型转化为引用类型
拆箱:将引用类型转化为值类型
优缺点:可以方便的对数据进行转化,很消耗性能
优化:使用泛型可以避免很多装箱拆箱操作
二十六、什么是托管代码?什么是非托管代码?
托管代码是一种中间语言,比如C#就是一种拖管代码,独立于平台和语言,能更好的实现它们之间的兼容
非托管代码是.net 2002 发布之前的代码,被编译成机器码,运行在机器上,依赖于平台和语言
二十七、string str = null, 和 string str = “”;有什么区别?
null定义了一个字符串,它的内容为空,在内存中不占用空间
“”定义了一个字符串,并给它赋值为“”,会在内存中分配空间
二十八、类和结构的异同?
类是引用类型,结构是值类型,
结构不能继承和被继承,类可以,都可以实现接口
二十九、什么是GC?使用GC的好处?
GC就是垃圾回收机制,会定时的清理内存中未被使用的资源,提升程序性能
三十、使用Prefab的好处
存储在项目视图中的一种可以反复使用的游戏对象,当某一对象需要反复多次被使用时,就可以将它制作成一个prefab。
优点:可以放置到多个场景中,也可以在一个场景中放置多个该对象。
放一个prefab到场景中就创建了一个该prefab的实例
当改变prefab时,所有该prefab的实例都会改变
三十一、使用Unity实现2D 游戏,有几种方式
(1)在创建项目时直接创建一个2d项目
(2)使用本身的GUI;
(3)把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;
(4)使用2d插件,如:2DToolKit;
三十二、Unity3d物理引擎中有几种施加力的方式?
rigidbody.AddForce
AddForceAtPosition,
都在rigidbody系列函数中。
三十三、什么是链条关节?能在什么地方用到
Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
三十四、游戏对象自身旋转的函数有那个几个?
transform.Rotate transform.RotateAround围绕某点进行旋转
三十五、sealed关键字 类和函数的作用分别是什么?
sealed表示密封的意思
为了确保其他类不可以派生于某一个类,可以使用sealed关键字密封该类,防止其他类继承自该类;
限制其他派生类重写在当前类中提供的方法实现
三十六、抽象类和接口的区别?
1、抽象类可以提供成员方法的实现细节,而接口只能存在抽象方法
2、抽象类的成员类型可以是多种,而接口的成员类型只能public static final
3、一个类只能继承一个抽象类,但可以实现多个接口
4、抽象类是对整一个类的属性,行为等方面进行抽象,而接口则是对行为抽象。就好比飞机和鸟,抽象类抽象出的是飞行物类。而接口则是抽闲出飞行方法。
5、抽象类是一个模板式的设计,当在开发过程中出现需求更改的情况,只需要更改抽象类而不需要更改它的子类。接口是一种辐射性设计,当接口的内容发生改变时,需要同时对实现它的子类进行相应的修改。
6、抽象类可以类比为模板,而接口可以类比为协议
7、抽象类可以作用于引用类型,接口这可以作用于值类型和引用类型
三十七、进程和线程的区别?
进程是并发执行程序在执行过程中资源分配和管理的基本单位,一个程序的执行过程,一个程序至少有一个进程,
线程是程序执行的最小单位,
同一进程的所有线程存放在同一地址空间,
同一进程的所有线程共享同一资源,不同线程的资源不能共享
进程能够独立运行,而线程必须依赖于应用程序
当一个进程崩溃时,不会影响到其他进程,而一个线程崩溃时,此进程也会崩溃
三十八、堆和栈的区别?
堆:用来存放应用类型;栈:存放值类型
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
存放到栈中时会存储存放顺序,遵循先进后出的原则,是一片连续的存储内存,由系统自动分配和管理;堆中存储的数据是无序的,不连续的,由用户来管理和释放,当用户不释放时,当内存达到一定值之后将有GC来进行回收
三十九、Static修饰的成员变量和成员函数有什么作用?和非静态有什么区别?
可以直接使用类名来进行访问,可以不使用new一个新对象来访问,避免了new一个对象时的繁琐操作和资源消耗
而非静态的变量和方法只能通过实例来调用
四十、脚步声明周期函数函数有那些?
Awake、Start、
四十一、欧拉角、四元数的作用及区别?
欧拉角:使用x,y,z来表示三个轴上的旋转,范围是0~360,这个旋转角是针对世界坐标系来说的,第一次旋转不会影响后面的选择;
缺点:不容易产生任意方向的旋转,容易产生万向节死锁,旋转的次序无法确定
四元数:由一个旋转轴和一个旋转角度组成,当一个四元数乘以一个向量时,就是让该向量围绕这个旋转轴,旋转多少角度得到的一个向量。
万向节死锁:当某个方向旋转90和另一个方向重合时,这时候调节其他方向的选择回不到原来的情况
四十二、什么是LOD?缺点是什么?
多细节层次:根据模型的节点在显示环境中所处的位置和重要度,来决定物体渲染的资源分配,降低非重要物体的渲染面数和细节,从而达到高效率渲染。
缺点是:会占用大量内存
四十三、unity程序如何优化内存?
(1)对于重复利用的对象,可以使用对象池来进行调用
(2)释放AssetBundle占用的资源
(3)降低模型的面数、贴图的大小、骨骼的数量
(4)使用多层次细节(LOD)、使用着色器(Shader)、使用预设(Prefab)
四十四、相机跟随一般放在哪个函数中执行,为什么要放在这个函数中?
LateUpdate(); 因为LateUpdate是在所有脚本的update执行完之后执行,这样相机获取到物体的位置信息是最新的
四十五、当一个细小的物体高速撞向一个较大的物体时,会发生什么情况?怎么决解?
小物体会穿过去,
决解:
1、可以增大细小物体的碰撞体,
2、使用射线检测
3、将细小物体的刚体碰撞检测方式改为动态连续检测
四十六、物理更新一般放在那个函数中执行?
FixUpdate()
四十七、如何在场景中放置多个摄像机渲染画面(不分屏)?如同时渲染UI和3D物体?
使用一个摄像机专门渲染UI,将该摄像机的模式该为深度渲染,并且只渲染UI,调节画布模式为摄像机渲染,将该摄像机拖入,设置改摄像机的深度为-1, 用另一个摄像机不渲染UI,模式为深度渲染,深度为0
四十八、向量的点乘、叉乘以及归一化的意义?
点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影,常用于求两个向量的夹角
叉乘得到的向量垂直于原来的两个向量,求两个向量所在平面的法向量
标准化向量:用在只关系方向,不关心大小的时候
四十九、什么是TCP?什么是UDP?
TCP是网络编程中基于连接的通信协议,UDP是无连接的通信协议
五十、TCP的三次握手过程?发生在何时?
客户端向服务器发送一个链接请求,服务器回给客户端一个确认消息,
五十一、请简述如何在不同分辨率下保持UI的一致性?
NGUI中有屏幕分辨率的自适应,原理是计算出屏幕的宽高比跟原来预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。 UGUI中通过锚点、中心点和分辨率决解这个问题,canvas size的属性修改为size with screen size
五十二、射线检测碰撞物的原理是?
在摄像机的原点向一个方向发射一条无终点的线,当该线与其他物体发生碰撞时,它将停止发射
五十三、如何让已经存在的GameObject在LoadLevel后不被卸载掉?
DontDestroyOnLoad(transform.gameobject);
五十四、移动相机动作在哪个函数里,为什么在这个函数中?
LateUpdate();LateUpdate是在所有脚本的Update执行之后执行,因此相机获取的位置是最新的,
五十五、ref参数和out参数是什么?有什么区别?
ref和out是两个关键字,可以用来进行参数的传递,进行参数传递时必须显示声明
区别:ref在使用前必须对参数进行初始化,而out这不需要,因为它会在内部对参数进行初始化
五十六、C#的委托是什么?举例说明在哪里可以使用?
委托是一个类,可以通过构造函数将方法作为参数传递给委托实例
使用:同步两个界面中的信息
五十七、C#中的排序方式有哪些?选择一种你常用的解释一下它的实现原理
冒泡排序,选择排序,插入排序,快速排序
冒泡排序:从头开始遍历,比较相邻两个数的大小,如果前面的比后面的大就交换位置,在用后一个位置的数根它后一个位置的数进行比较,一轮下来就把最大的数放在了最后面,重复操作就可以排好顺序
选择排序:取数组中元素的最小值放在第一个位,然后取剩下元素中的最小值放在第二位,重复上诉操作
插入排序:将一个元素插入到一个有序的序列中,判断该元素在有序序列中的位置,然后放入其中
快速排序:采用了分治法,选定一个基准数,从右往左遍历,把比基准数小的元素放在左边,然后从左往右遍历,把比基准数大的元素放在右边
五十八、Unity3D的协程和C#线程之间的区别是什么?
协程在程序运行时开启一个新的逻辑处理来协同当前程序的执行,对任务的分时处理,协程避免了无意义的调度,由此可以提高性能
线程:同一时间可以开辟多个线程,开辟线程消耗很大,常用于同一时间对多个任务进行操作
五十九、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 修饰符修饰它。
后续更新中…