unity面试题

来源:互联网 发布:mac可以玩什么网游 编辑:程序博客网 时间:2024/05/16 11:30

u3d中Collider和Trigger的区别

在Collider组件中,如果没有勾选is trigger,即是Collider,反之,为Trigger。


Collider信息检测:
1.MonoBehaviour.OnCollisionEnter(Collisioncollision)进入碰撞器
2.MonoBehaviour.OnCollisonExit(Collsioncollision)退出触碰撞器
3.MonoBehaviour.OnCollisionStay(Collisoncollision)当逗留在碰撞器中
 
Trigger信息检测
1.MonoBehaviour.OnTriggerEnter(Collidercollider)进入触发器
2.MonoBehaviour.OnTriggerExit(Collidercollider)退出触发器
3.MonoBehaviour.OnTriggerStay(Collidercollider)当逗留在触发器中
 
当is Trigger为false时,碰撞器可以发生碰撞效果,比如汽车被撞飞,皮球掉在地上又弹起。
当is Trigger为true时,碰撞其将会被物理引擎忽略,没有碰撞效果。
 
发生碰撞的必要条件

发生碰撞的两个物体都必须有Collider组建,其中处于运动状态中的物体必须有rigibody组件。


委托的概念

委托是一个类,它定义了方法的类型和参数。先将方法动态的赋给委托的对象,在使用时,通过这个对象完成方法的调用。


委托和事件的区别

1.事件一定要使用+= 和-=来挂接和解除事件,而代理则不一定。如果使用=来分配代理,则导致其他任何挂接过的代理解除,会产生一定的安全问题。

2.委托的对象可以在类外部被调用,而事件只能在类中被调用。


CharacterController和Rigidbody的区别

rigidbody和CharacterController都能产生重力效果,但添加了前者是完全真实的物理特性,能够被施加外力,但后者可以说是受限的rigidbody,不能被施加外力,只能通过Move或SimpleMove,对象才能移动。后者一般添加在人物上。


unity中几种施加力的方式,描述出来
1.爆炸力AddExplosionForce用一个力来模拟爆炸效果,以中心点为爆炸中心,在半径范围的刚体都将收到力的作用,爆炸力将随着跟中心点的距离线性减弱,超出半径范围的缸体将不受力的作用。
2.力 AddForce,给刚体施加一个力,使其移动。
3.位置力 AddForceAtPosition,在position点施加一个力,主题将会收到力。

4.相对力AddRelativeForce,跟AddForce一样,只是方向是根据他的本地坐标。


物理引擎一般在哪个系统函数里更新

FixUpdate。因为FixUpdate里面是固定帧执行,Update是渲染帧执行。例如,将高速运行的子弹在FixUpdate中更新位置,判断子弹是否碰到墙体,使子弹快速就会停下。但是,当有的手机比较差,帧数比较低的时候,并且将高速运行的子弹在Update中更新位置,由于判断的时间间隔很长,可能导致子弹直接穿墙而过。


移动相机动作在哪个函数里,为什么在这个函数里
LateUpdate,在每帧执行完毕后调用,他是在所有update结束后才调用。如果移动相机的动作放在在update里,可能出现摄像头已经移动,但人物还没有出现的空帧。


prefab的用处和环境
prefab在实例化的时候被用到,用于经常被用到的物体,方便属性的修改。


简述一下对象池,你觉得在fps设计游戏里有哪些东西适合对象池
对象池即存放需要被反复利用资源的空间。如果每个对象都创建和销毁会很费时间,最好的方法就是将不用对象回收到对象池中,等到需要的时候再将其拿出。fps设计游戏中,子弹,敌人和粒子特效都适合做成对象池。


请简述ArrayList和List的主要区别?
ArrayList会把所有插入其中的数据都当作Object来处理,在去出其中的数据时可能会报类型不匹配的错误。而且用ArrayList会有一个装箱和拆箱的过程,很耗费性能。而List则是在定义的时候就确定了数据的类型。


unity完整生命周期的几个重要方法
Awake--OnEnable--Start--Update--FixedUpdate--LateUpdate--OnGUI--OnDisable--OnDestory


在场景中放置多个Camera并同时处于活动状态会发生什么?
游戏界面可以看到多个摄像机的混合,其中depth和clear flags控制摄像机的渲染顺序。


简述一下你对数据结构的存取有什么看法
批量取,经常遍历的数据用List来存储,经常查找的会采取字典存储。如果有多个字段比较重要,我会采取多个字典进行存储。


简述一下值类型和引用类型的区别
区别:1.值类型存储在栈上,引用类型数据存储在内存堆中;2.值类型存取快,引用类型存取慢。3.值类型表示实际的数据,引用类型表示指向存储在内存堆中的数据的指针和引用。4.栈的内存是自动释放的,堆内存是.NET中的GC自动释放。5.值类型继承自System.ValueType,引用类型继承自System.Object。

请简述GC产生的原因,并描述如何避免
GC主要用来回收堆上面的内存。避免:1.减少new产生堆箱的次数2.多使用公共的对象(静态成员)3.将String换成StringBuild。

请描述Interface与抽象类之间的不同
相同点:
    (1) 都可以被继承
    (2) 都不能被实例化
    (3) 都可以包含方法声明
    (4) 派生类必须实现未实现的方法
区 别:
    (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
    (2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。”
    (3) 接口可以被多重实现,抽象类只能被单一继承
    (4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
    (5) 抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
    (6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法    
    (7) 接口可以用于支持回调,而继承并不具备这个特点
    (8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的 
    (9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
个人意见:抽象类的作用是为了重用,接口的作用是为了解耦。参考:点击打开链接

下列代码在运行中会产生几个临时对象?

1string a = new string("abc");

2.             a = (a.ToUpper() + "123").Substring(0, 2);  


答:其实在C#中第一行是会出错的(Java中倒是可行)。应该这样初始化:

1.  string b = new string(newchar[]{'a','b','c'});


下列代码在运行时会发生什么问题,如何避免?

List<int> ls = new List<int>(new int[ ]{1,2,3,4,5});

foreach(int item in ls)

{

Console.WriteLine(item * item);

ls.Remove(item);

}


运行时会产生错误,在ls.Remove(item)这行,因为foreach是只读的,不能一边遍历一边修改。


什么是协同程序

协程即在主程序运行时同时开启的另外一段逻辑处理程序,来协助当前程序的执行。


Unity3D是否支持协程多线程程序?如果支持的话需要注意什么?

支持,如果同时要处理很多事情或者与Unity的对象互动小的可以用thread,否则使用coroutine。仅能从主线程中访问Unity3D的组件,对象和Unity系统调用。


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

多线程同时运行多个线程,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只有在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。


矩阵相乘的意义和注意点

用于表示线性变换:旋转、缩放、投影、平移、仿射

注意矩阵的蠕变:误差的积累


当一个细小的告诉物体撞向另一个较大的物体时,会出现什么情况?应如何避免

穿透(碰撞检测失败)。应该使碰撞体变大,或者减少FixedUpdate的检测间隔。


Unity3D 如何获去场景中需要加载的数据

Resource.Load和AssetBundle


MeshRender中的material和sharedmaterial的区别

修改sharedmaterial将改变所有使用这个材质的物体的外观,并且也改变存储在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material。


MeshCollider和其他Collider的一个主要不同点

MeshCollider是基于V3顶点,而boxcollier本身是基于算法,没有面的概念。


Render的作用?描述MeshRender和SkinnedMeshRender的关系和不同

Render即渲染器,使物体能够被看到。前者为网格渲染器,后者为蒙皮的网格渲染器,主要用在有蒙皮的人物或动物上。


internal,sealed

internal只能在包含该类的程序集中访问该类;sealed在类声明时可防止其他类继承此类,在方法中声明可防止派生类重写此方法。


反射的概念和实现步骤

概念:反射就是得到程序集中的类和方法。

实现步骤:1, using System.Reflection; 导入

      2,Assembly.Load(“程序集”)加载程序集 

    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,mInfo.Invoke(null, 方法参数)


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

主要有关节动画,

关节动画:把角色分成若干独立部分,一个部分对应一个网格模型以及相关动画,部分的动画连接成一个整体的动画。

单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置以及其该变量,然后通过插值运算实现动画效果,角色动画较逼真。

骨骼动画:骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一顶点都会受到骨骼的影响,从而实现完美的动画。


lod是什么,优缺点是什么

LOD技术即Levels of Detail的简称,以为多细节层次。LOD技术指根据物体模型的节点在现实环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。


用u3d实现2d游戏,有哪几种方法

1.用系统自带的GUI

2.将摄像机设为Orthographic(正交)

3.用第三方插件,如NGUI,2DToolkit


什么是渲染管道?

是指在显示器上为了显示出图像而经过的一系列必要操作。渲染管道中有很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中。

主要步骤有:本地坐标 -> 视图坐标 -> 背面裁剪 -> 光照 -> 裁剪 -> 投影 -> 视图变换 -> 光栅化。


动态加载资源的方式

Resource.Load()和AssetBundle

Resource.Load()主要是内部调用,调用的是Resource文件夹中的资源,Resource打包后这个文件夹是不存在的,会同意生成assets资源;AssetBundle是外部调用,首先把资源打包成.assetbundle文件,再动态的加载这个文件,本地或者网络服务器都可以。


反向旋转动画的方法是什么

将动画的速度调到-1,animation.speed = -1


调试记录到控制台的命令是什么

Debug.Log();


编辑器类存放的路径是什么

工程目录下的Assets/Editor文件夹下。


写出Animation的五个方法

play, stop,crossfade,IsPlaying,AddClip


请简述向量的点乘,叉乘以及响亮归一化的几何意义。

点乘的几何意义:计算两个向量之间的夹角,以及在某一方向上的投影;

叉乘的几何意义:创建一个垂直于两向量所构成平面的向量。


在类的构造函数前加上static会报什么错?为什么

报错:静态构造函数不能有访问修饰符。

因为无论创造什么类型的对象,静态构造函数只执行一次;创建类实例或首次访问静态成员之前,运行库调用静态构造函数,静态构造函数执行先于其他构造函数。


C# String类型和StringBuilder类型的区别及两者各自的优势

String:每次都要创建一个新的对象并且分配新的内存地址。String主要用于公共API,通用性好,用途广泛,读取性能高,占用内存小。

StringBuild:首先创建一个对象并且分配一定大小的内存空间,当对此对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充。主要用于拼接String,修改性能好。


NUGI Button怎样接受用户点击并调用函数,具体方法名称是什么

主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick(),OnPress()等函数。具体方法名称是OnClick。


<愤怒的小鸟>给予初速度后,怎么让小鸟受到中立和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法

v代表初速度,假设小鸟沿着z轴方向运动,质量为1,v‘ = v - new Vector3(0,g*t,f*t)


什么是装箱和拆箱

装箱就是把值类型转化成object引用类型,拆箱即把object类型转化为值类型。


ArrayList和List的主要区别

ArrayList存在不安全类型(会把所有插入其中的数据都当着object类型来处理),存在装箱和拆箱的费时操作,List只能放相同类型的数据。


下列代码在运行时会产生几个临时对象?

1.string a = new string("abc");

2.a = (a.ToUpper() + "123").Substring(0,2);

其实在第一行会报错,因为C#中没有符合这样类型的String构造函数。在java中可行,并且第一行会产生两个临时对象,第二行会产生3个临时对象。

C#中写法应该是string b = new string(new char[]{'a', 'b', 'c'});


请简述如何在不同分辨率下保持UI的一致性

以竖屏小游戏为例,UI就用锚点定位为主,对于背景图片,其宽度保持设备的宽度,如果实际长宽比超出预设长宽比,上下两边留黑边,如果长宽比小于预设长宽比,则对背景图片进行裁剪。


Unity 中安卓和ios如何进行交互

1.安卓:unity通过调用继承UnityPlayerActivity的java类中的函数跟安卓进行交互,安卓通过调用UnityPlayer.UnitySendMessage跟unity发生交互。

2.IOS:


Func(string a, string b)用Lambda表达式怎么写?

(string a, string b) => Func(string a, string b)


socket通信流程


Unity3D Shader分哪几种,有什么区别?

答:1.表面着色器。表面着色器的抽象层次比较高,它可以轻松的以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。

2.ding点片段着色器。定点片段着色器可以非常灵活地实现完美的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。

3.固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行酷炫的Shader时,还可以通过固定功能管线着色器来绘制出一些基本的内容。


概述序列化

序列化简单理解为将对象转换成容易传输的格式的过程。比如,可以序列号化一个对象,然后使用HTTP通过Internet在客户端和服务端之间传输该对象。


射线检测碰撞物的原理

射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞,则停止发射。


客户端和服务器的交互方式有几种

1.使用socket套接字进行数据传输,主要有UDP和TCP两个协议。处于网络传输层。

2.使用http协议进行传输。


Unity中,照相机的Clipping Planes的作用是什么?调整Near,Fare两个值时,应该注意什么?

裁剪平面。从相机开始渲染和停止渲染之间的距离。


如何查看Unity3D中场景的面数,顶点数和Draw Call数?如何降低Draw Call数?

在Game视图中右上角点击Stats。降低Draw Call:1.Draw Call Batching(将一些渲染状态一致的物体合成一个大物体,一次性交给gpu进行绘制),分成静态批处理和动态批处理。进行批处理的物体必须拥有相同的材质;2.高级特性的shader降级为统一的低级特性的shaer。


问一个Terriain,分别贴3,4,5张地表贴图,渲染速度有什么区别,为什么

没有区别,因为采用了dc批处理技术,不管几张贴图,相同材质只渲染一次。


在移动设备上面的一些优化资源的方法

1.使用assetbundle,实现资源的分离和共享,将内存控制在200m之内,同时还能实现资源的在线更新。

2.降低顶点数和面数,降低模型的骨骼数量,降低贴图的大小。

3.尽量不适用实时光,不是用阴影。

4.裁剪例子系统,合并同时出现的粒子系统。

5.将暂时不用的以后还需使用的物体隐藏而不是直接Destroy掉。

6.禁止那些不带刚体带包围盒的物体运动。

7.去掉法线计算。

8.使用光照贴图,使用多层次细节,使用预设;



实时光源的优缺点

优点:可以有cookies-带有alpha通道的立方图纹理。缺点:点光源是最耗费资源的。


将Camera组建的clearFlags选项选成Depth only是什么意思。什么用处?

仅深度,该模式用于对象不被裁剪。


编辑场景时将GameObject设置为Static有什么作用

说明该object是静止不变的。unity内部有不少操作检测gameobject是否为static,对于static的物体有一些特殊的处理,比如occlusion culling(遮挡剔除)会剔除对被static物体挡住的网格对象,在rendering优化时也会根据是否为static来进行不同的优化,在lightmaping时,会根据是否是static来进行光照。


NGUI中Panel和Anchor的作用

Anchor可以让一个控件的位置在屏幕上精确显示出来,UIPanel可以使物体被渲染出来。


NGUI中Grid和Table的作用

对Grid和Table组件下的物体进行排序和定位。

什么是协同程序

协程即在主程序运行时同时开启的另外一段逻辑处理程序,来协助当前程序的执行。


队列、堆、栈区别

1、队列先进先出,而栈后进先出。而对于堆而言,先进的和后进的都是存放临时数据的地方。我们可以随心所欲的进行增加变量和删除变量,不管什么次序。

2、栈是由操作系统自动分配释放,堆是由.net回收。

3、栈存取速度快,堆存取速度慢。


已知二叉树后续遍历序列是cdbgfea,中序遍历序列是cbdaegf,它的前序遍历序列是abcdefg,请画出这个树的结构?

从前序遍历可以看出,根节点为a,再从中序遍历看出cbd为左节点,egf为右节点再进行,再从前序看出e为根右节点的根节点由此可以画出图(每个节点跟它临近节点进行比较)

          A                             /  \                            B    E                           /\       \                          C  D     F                                   /                                 G

请描述栈和队列的相同点和不同点

相同点:都是线性表。

不通电:读写方式不一样,栈是先进后出,队列是先进先出。


什么是泛型编程?

泛型编程的主要思想是姜算法和数据结构完全分离开来,使得一次定义的算法能够作用于多种数据结构,从而实现高度可重用的开发。

0 0
原创粉丝点击