自己总结unity的一些面试题

来源:互联网 发布:java构建redis连接池 编辑:程序博客网 时间:2024/05/22 06:47

1.GameObject和transform.Find的区别。

GameObject通过名字或者路径来查找游戏对象:GameObject.Find("a")

(1)无法查找隐藏对象。在查找路径上任意一个父物体隐藏都查不到

(2)如果查找不在最上层,就需要根据路径查找,但路径查找是把双刃剑

优点1:解决查找中可能出现的重名问题

优点2:如果有完全的路径,减少查找范围,减少查找时间

缺点:结构或路径调整后,容易影响到物体的查找,需要重新定位查找路径

(3)使用方便但效率低下。

此查找相当于递归遍历查找,虽然操作方便,但效率低下,建议在start中查找对象并保存引用,切忌在update中动态查找。

transform.Find

(1)可以查找隐藏对象

(2)支持路径查找

(3)查找隐藏对象的前提是transform所在的根节点必须可见,即active=true

**其他查找:

GameObject.FindWithTag

GameObject.FindGameObjectsWithTag

**隐藏根节点也可查找:使用Resouces.FindObjectsOfTypeAll

2.物体自身旋转使用的函数是Transform.Rotate;围绕一个物体旋转使用的函数是Transform.RotateAround

3.unity中使用LitJSON,将对象转化成字符串使用JsonMapper.ToJson();将字符串转换成对象使用JsonMapper.ToObject()

4.简述一下什么是GC,GC的流程

GC:垃圾回收器

流程:标记,计划和清理,引用更新和压缩

5.unity3d从唤醒到销毁有一段生命流程,请列出系统调用的几个重要方法

Awake->OnEnable->Start->Update->FixUpdate->LateUpdate->OnGUI->Reset->OnDisable->OnDestroy

6.请简述值类型和引用类型的区别

值类型都是存在栈中;引用类型存放在堆中,并会把地址存放在栈中。如果为在另一个方法中调用值类型,并不会改变原方法中值类型的值;如果在另一个方法中调用引用类型的值,则会将引用类型的值改变。

值类型:byte,int,short,long,char,float,double,bool,枚举:enum,结构体:struct

引用类型:类,接口,委托,object,string

7.碰撞器和触发器

碰撞器和触发器都必须先引用collider组件,触发器的方法:OnCollisionEnter,OnCollisionStay,OnCollisionExit;碰撞器:OnTriggerEnter,OnTriggerStay,OnTriggerExit

碰撞器是触发器的载体,触发器是碰撞器的一个组件,如过选用了isTrigger=true,则不再碰撞,如果一个是触发器,一个是碰撞器,则会调用触发器的方法OnTriggerEnter,执行触发效果,而不碰撞

8.什么情况下脚本前面的对号不显示

当脚本中没有如下函数时:Start,Update,FixUpdate,LateUpdate,OnGUI,OnEnable,OnDisable

9.Update,FixUpdate,LateUpdate的区别和含义

Update:更新,与当前平台的帧数有关,每一帧被调用

FixUpdate:固定更新,每一帧被调用,是真实时间

LateUpdate:每一帧被调用,是在Update调用后调用

10.协同程序:即主程序运行的同时开启另一段逻辑处理,来协同当前程序的执行

其类似线程,但不是;用yield return返回,yield return 0表示等待一帧,可以在协同程序中再开启协程,嵌套;yield return new WaitForFixUpdate等待下一帧的开始。

11.再NavMeshAgent组件中表示最大加速度的是Acceleration

12.已知一个数据类,没有继承MonoBehavior,现在我们需要再其他脚本中调用次数据类中的内容,需要添加什么特性?       Serializable

13.再List集合中想要移出某个索引位置的元素,采用list.RemoveAt

14.射线检测碰撞物体的原理是什么?

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

15.如何让已存在的GameObject在场景加载之后不被卸载掉?

gameobject.DontDestroyOnLoad()

16.请说明transform.parent和transform.SetParent的区别

parent可以get和set;SetParent只能set

17.unity提供了4种光源,平行光Derectional Light;点光源Point Light;区域光源Area Light;聚光源Spot Light

18.物理更新放在FixUpdate中比较合适,按照固定时间执行,默认0.02S

19.获取的命令时GetComponent,增加是AddComponent,Destroy删除

20.请简述AnimatorController中的Has Exit Time的作用是什么。

当我们勾选了此项,在动画转换时会等待当前动画播放完毕后才会才会转换到下一个动画,如果当前动画时循环动画会等待本次播放完毕转换,所以对需要立即转换动画的情况下一定要取消勾选此项;

还有一种情况时,当前动画播放完毕后会自动转换到箭头所指的下一条状态(没有其它条件时),此时必须勾选此项,否则动画播放完毕后会卡在最后一帧,如果是循环动画,则会一直循环播放。

21.链表和数组的区别

二者都属于同一种数据结构

从逻辑结构上来看:

1.数组申请的是一块连续的内存空间,编译阶段就确定了空间大小,是不允许改变的,不能适应数据动态的增减的情况。当数据增加时,可能会会超出原先定义的数组个数,造成数据越界;当数据减少时,造成资源浪费。

2.链表动态地进行存储分配,现用现申请,可以适应数据动态增减的情况,且可以方便地插入删除数据项。(数组中插入和删除数据项时,需要移动其他的数据项,非常繁琐)链表必须根据next指针找到下个元素

从内存存储上来看:

1.数组从栈中分配空间,对于程序员方便快速,但是自由度小,数组可以根据下标直接存储数据。如果数组中需要增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放入其中。同样的道理,如果想要删除一个元素,需要移动大量的元素去填掉被移动的元素。如果需要快速访问数据,很少或不插入或删除元素,应使用数组。

2.链表从堆中分配空间,自由度大但是申请管理比较麻烦,链表是物理上非连续的内存空间,对于访问数据,需要从头遍历整个链表直到找到要访问的数据,没有数组有效,但是在添加和删除数据方面,只要知道操作位置的指针,很方便实现增删,较数组比较灵活youxiaolv。

从上面可以看出,如果经常访问数组,而很少增加和删除数据,可以用数组;如果经常增加和删除数据,用链表。

22.用sealed修饰的类有什么特点?

无法作为其他类的父类,不能含有虚方法和抽象方法;当sealed修饰方法时,该方法不能被子类重写。

23.MVC模式,M,V,C分别代表什么?

MVC是model-view-controller的缩写,模型-视图-控制器

M是数操作数据逻辑的部分,V是显示的应用模型数据或交互界面,C是程序的视图和操作逻辑的协调者。

24.类和结构体的区别

1.类是引用类型,结构体是值类型。

2.结构体和类初始化都使用了new,但一个是分配在堆上,一个在栈上。

3.结构体是隐式的sealed,不能被继承,也不能从另一个类或结构体继承;类可以。

当处理数量小的场合使用结构体比较好;对于大量的逻辑对象,使用类比较好。

原创粉丝点击