Unity面试题以及算法数据结构(2020)


1.请简述值类型和引用类型的区别?
值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。
引用类型包括:数组,用户定义的类、接口、委托,object,字符串,null类型,类。
2.C#中所有引用的基类是什么?
所有引用的基类是Object,包名是System
3.请简述ArrayList和List<Int>它们有什么区别?
ArrayList 是一个数组,继承实现了List基类,是比较传统使用的程序数组变量,存在拆箱装箱操作,比较耗时。
List<int>是调用List<T>,用了C#的泛型特性
4.简述四元数的作用,四元数对欧拉角的优点?
四元素用于表示旋转
1)增量旋转
2)避免万向锁
3)给定方位的表达式有2种,互为正负(欧拉角有多种
5.position和LocalPosition的区别?
1)position是根据世界原点为中心点
2)localPosition是根据父节点为中心点,如果 没有父节点。localPosition和position没有区别
3)选中一个物体左上角Global和Local切换看物体世界坐标轴和本地坐标轴
4)transform组件下的Position属性是一个先对于父对象的局部坐标,当然,如果没有父对象,其属性框里显示的自然也是世界坐标了。如果有父对象,那么在unity编辑器显示的值是这个transform以上一级父对象为基准的坐标。
6.RebderTexture是什么,他有什么作用?
是一种特殊的Textrue的类型,渲染纹理(镜头的模糊效果,后视镜)
7.谈谈你所知道的Unity内存优化方法?
方法有很多种:
压缩自带类库
将暂时不用的以后还需要的物体隐藏起来而不是直接Destroy掉(对象池)
释放AssetBundle占用的资源
降低模型的片面数,降低模型的骨骼数量,降低贴图的大小
使用光照贴图,使用多层细节(LOD),使用着色器(shader),使用预设(Prafab)
代码中少产生临时变量
8.什么是DrawCall?如何降低DrawCall?
在unity中,每次引擎准备数据并通知GPU的过程称为一次DrawCall
DrawCall越高对显卡消耗就越大,降低DrawCall的方法:
Dynamic Batching
static Batching 静态批处理
高级特性Shader降低为统一的低级特性的Shader
具体详细内容可以看大佬总结:https://blog.csdn.net/yupu56/article/details/50177935?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
9.如何安全的在不同工程间安全的迁移Asset数据?
三种方法:
将Assets目录和Library目录一起迁移
导出包 exprot Package
用unity自带的assets Server功能
10.向量的点乘,叉乘以及归一化的意义是什么?
点乘描述了两个向量的相似程度,结果越大两个向量越相似,可表示投影
叉乘得到的向量垂直于原来的两个向量
标准化向量用在关系的方向,不关心大小的时候
11.不同的手机设备尺寸分辨率都不一样,该如何进行适配
NGUI很好的解决了这一点,屏幕分辨率的自适应,原理就是计算出屏幕的宽高比
跟原来的预设的屏幕分辨率求出一个对比值,然后修改相机的size
UGUI通过锚点和中心点和分辨率也可以解决这个问题
12.unity中的碰撞器和触发器的区别?
一个有碰撞效果(碰撞器),一个没有碰撞效果(触发器)
13.动态加载资源的方式有哪些?
Resources和AssetBundle的方式加载资源
14.请简述一个对象池,你觉得在FPS里哪些东西适合使用对象池?
对象池就是存放需要被反复调用资源的一个空间,当一个对象会大量生成的时候,
如果每次都销毁创建会很浪费时间,通过对象池把暂时不用的对象放到一个池子中
(也就是一个集合),当下次要重新生成这个对象的时候先去池子中查找一下是否
有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池子中没有可
用的对象,才会需要重新创建,利用空间换时间来达到游戏的高速运行的效果,
在FPS游戏中要常被大量复制的对象包括,子弹,敌人,粒子 等
15.请简述private,public,protected,internal的区别?
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:保护修饰符,对该类和其派生类公开
internal:只能在包含该类的程序集中访问
16.Unity3D脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法?
Awake——>OnEnable——>Start——>Update——>FixedUpdate——>
LateUpdate——>OnGUI——>OnDisable——>OnDestroy
17.物理更新一般放在哪一个系统函数里?
FixedUpdate没固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较使用于物理引擎计算,因为是跟每帧渲染有关。Update就比较适合做控制。
18.在场景中放置多个Camera并同时处于活动状态会发生什么?
游戏界面可以看到很多相机的混合
19.Readonly和Const的区别是什么?请简单描述
readonly只读字段可以不设置初始值,而const常量就不行必须在创建时设置初始值
readonly可以在构造方法中进行赋值,而const常量就不可以
20.C#中的排序方式有哪些?
冒泡排序,选择排序,插入排序,快速排序,希尔排序,归并排序
21.C#中反射的实现原理?
审查元数据并收集关于它的类型信息的能力。实现原理:在运行时根据程序集及其中的类型得到元数据
22.C#中四种访问修饰符是哪些?各有什么区别?
属性修饰符:
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 修饰符修饰它。
23.Heap与Stack有何区别?
heap是堆,stack是栈。
stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
stack空间有限,heap的空间是很大的自由区。
24.值类型和引用类型有何区别?
1)值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2)值类型存取速度快,引用类型存取速度慢。
3)值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4)值类型继承自System.ValueType,引用类型继承自System.Object
5)栈的内存分配是自动释放;而堆在.NET中会有GC来释放
6)值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
