关于Unity3D的一些笔试题(3)

摄像机
1.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?

LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。


2.一个场景放置多个camera并同时处于活动状态,会发生什么

答:游戏界面可以看到很多摄像机的混合。可以用depth(深度),Layer(层)+ Culling Mask,enable = false/true来控制


射线
射线是一个点向另外一个点发生的一条线,一旦与其他模型发生碰撞,他将停止发射。
注意这条件是逻辑上的,界面上看不到。
一般使用射线判断是否发射至某个游戏对象上或者获得鼠标点击的游戏对象等。
1:Raycast碰撞的物体。
1:RaycastAll碰撞的所有物体。


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


2.动画层(Animation Layers)的作用是什么?
动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画


3.写出Animation的五个方法
AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样


碰撞

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

碰撞器有碰撞的效果,IsTrigger=false,可以调用OnCollisionEnter\/Stay\/Exit函数;
触发器没有碰撞效果,IsTrigger=true,可以调用OnTriggerEnter\/Stay\/Exit函数。


2.碰撞检测需要物体具备什么属性?

能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器
【Physics.Overlapsphere相交球检测碰撞,碰撞检测需要包围盒】


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

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

什么是协同程序?
在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。
换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。


1.UGUI的三种渲染模式,以及他们的作用?

(1)Screen Space-Overlay(屏幕控件-覆盖模式)的画布会填满整个屏幕空间,并将画布下面的所有的UI元素置于屏幕的最上层,或者说画布的画面永远“覆盖”其他普通的3D画面,如果屏幕尺寸被改变,画布将自动改变尺寸来匹配屏幕

(2)Screen Space-Camera(屏幕空间-摄影机模式)和Screen Space-Overlay模式类似,画布也是填满整个屏幕空间,如果屏幕尺寸改变,画布也会自动改变尺寸来匹配屏幕。所不同的是,在该模式下,画布会被放置到摄影机前方。在这种渲染模式下,画布看起来 绘制在一个与摄影机固定距离的平面上。所有的UI元素都由该摄影机渲染,因此摄影机的设置会影响到UI画面。在此模式下,UI元素是由perspective也就是视角设定的,视角广度由Filed of View设置。

(3)World Space即世界控件模式。在此模式下,画布被视为与场景中其他普通游戏对象性质相同的类似于一张面片(Plane)的游戏物体。画布的尺寸可以通过RectTransform设置,所有的UI元素可能位于普通3D物体的前面或者后面显示。当UI为场景的一部分时,可以使用这个模式。  它有一个单独的参数Event Camera,用来指定接受事件的摄像机,可以通过画布上的aphicRaycaster组件发射射线产生事件。


2.ref参数和out参数是什么,分别有什么作用?

ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。
使用ref前必须对变量赋值,out不用。
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。 


3.transform.localposition和transform.position有什么区别?

transform.localposition是自身坐标 ,transform.position是世界坐标
TransformPoint
function TransformPoint (position : Vector3) : Vector3
function TransformPoint (x : float, y : float, z : float) : Vector3

把一个点从自身相对坐标转换到世界坐标


4.GameObject.Find和Trandform.Find有什么区别 ?

GameObject.Find通过名字或路径查找游戏对象。
(1).无法查找隐藏对象 
隐藏对象包括查找路径的任何一个父节点隐藏(active=false)
(2).如果查找不在最上层,建议合理使用路径查找,路径查找是把双刃剑
优点1:解决查找中可能出现的重名问题。 
优点2:如果有完全的路径,减少查找范围,减少查找时间。
缺点: 路径或结构调整后,容易影响到程序中的查找,需要重新定位查找路径。
(3).如果路径查找中的任何一个父节点active=false,这个对象都将查找不到。
(4).使用方便但效率低下 
此查找相当于递归遍历查找,虽使用方便但效率堪忧,建议在Start()函数中查找对象并保存引用,切忌在Update()中动态查找。
Transform.Find
(1).可以查找隐藏对象 
(2).支持路径查找 
(3).查找隐藏对象的前提是transform所在的根节点必须可见,即active=true


5.值类型和引用类型的区别?

(1).值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,
    而内存单元中只存放堆中对象的地址。
(2).值类型存取速度快,引用类型存取速度慢。
(3).值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
(4).值类型继承自System.ValueType,引用类型继承自System.Object
(5).栈的内存分配是自动释放;而堆在.NET中会有GC来释放       
(6).值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
(7).值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际
数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储
可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量
占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两
个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用
,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,
因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这
个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保
存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。


6.C#String类型比StringBuilder类型的优势是什么?

如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringBuilder是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用stringBuilder这样比较节约内存。但是string 类的方法和功能仍然还是比stringBuilder类要强。


7.灯光有那四种类型列举出来?

Point Lights 点光源丶Spot Lights 聚光灯丶Directional Lights 方向光源 丶 ambient light 环境光丶 Area Light,俗称面灯
U3D中有四种类型的灯光:PointLight,Spotlight,DirectionalLight,AreaLight,AmbientLight。其中,AmbientLight不是独立的灯光元素,而是位于渲染设置中,可对场景中的背光进行色彩调节(通常是冷色系),用于模拟环境反射光(多为天光)。方向光常用于模拟阳光,灯光的所在位置不影响照明效果,因为它是基于朝向的。


8.装箱和拆箱的概念以及过程?

装箱就是值类型到引用类型的转化过程。首先会在托管堆上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,最后返回新分配的对象内存地址。
装箱操作是可逆的,所以还有拆箱操作。拆箱操作获取指向对象中包含值类型部分的指针,然后由程序员手动将其对应的值拷贝给值类型变量。


9.UGUI和NGUI分别是怎样控制深度的?

NGUI的深度就是一个指定的数值,数值越大越靠前

UGUI控制显示顺序的深度不是值,而是位置。只要通过管理UI控件的位置,就可以很好的管理UI的显示顺序。


10.如何定义和使用一个协同程序,以及对协同程序的理解?

猜你喜欢

转载自blog.csdn.net/ji2570489271/article/details/78667281
今日推荐