Unity面试汇总——基础一(Unity常见基础)

1、什么是协同程序?

在主线程运行的同时开启一段逻辑处理,来协助当前程序的执行。(PS:协程很像多线程,却不是多线程,注意不要混淆)Unity的协程在每帧结束后去检测yield的条件是否满足。

2、Unity脚本生命周期:

Awake->OnEnable->Start->Update->FixedUpdate->LateUpdate->OnGUI
->OnDisable->OnDestory

  • Awake 和Start只会执行一次,OnEnable和OnDisable可以反复的发生
  • FixedUpdate:每固定帧绘制执行一次,和Update不同的是渲染帧执行(PS:当渲染效率下降的时候FixedUpdate调用次数就会跟着下降)FixedUpdate比较适用于物理引擎的计算,因为是跟每
  • LateUpdate:在所有的Update函数调用之后被调用,这可以用于调整脚本执行顺序。(PS:相机移动的操作就应该放在LateUpdate中,** **)

3、动态资源加载

  • Resource.Load():调用它的Load函数可以直接Load并返回某个类型的Object,但前提是需要把资源放在Resource命名的文件夹下,Unity不管有没有场景引用都会将其全部打包到安装包中。(PS:所有资源全部打入包中,不利于游戏的发布和升级,不推荐使用)
  • AssetBundle:把资源打包成AssetBundle放在服务器或本地磁盘,然后使用www模块get下来,之后从某个指定的Bundle中Load某个Object。
  • AssetDatabase.loadasset:这种方式只在editor范围内有效,游戏运行时明月这个函数,只能在开发中调用。
  • Unity 官方新出的Addressable 可寻 址地址系统,对Assetbundle系统进行了一层封装。

4、对象池

对象池存放需要被反复调用资源的一个空间,当一个对象会大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(PS:就是一个集合),当下次需要生成该对象时优先从对象池中查找是否有可用的对象,如果有就直接使用,没有才需要重新创建。利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象如:子弹、敌人、粒子等

5、Prefab

在游戏运行时实例化,Prefab相当于一个模板,对已有的素材、脚本、参数做一个默认的配置,以便于之后的修改,同时Prefab打包的内容简化了到出的操作,便于团队的交流。

6、CG(回收堆上的内存)

避免:

  • 减少new产生对象的次数

  • 使用公用的对象(静态成员)

  • 建String换为StringBuilder
    String和StringBuilder的区别:

  • 使用StingBuilder需要引入using System.Text;

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

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

7、PlayerPrefs(保存和读取数据的类)

PlayerPrefs类支持3中数据类型的保存和读取,浮点型(float),整形(int),和字符串型(string):

  • SetInt(); 保存整型数据;
  • GetInt(); 读取整型数据;
  • SetFloat(); 保存浮点数据;
  • GetFLoat(); 读取浮点数据;
  • SetString(); 保存字符串数据;
  • GetString(); 保存字符串数据;

8、Unity3D中的碰撞器和触发器

  • 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性;
  • 当IsTrigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter和OnCollisionExit函数;
  • 当IsTrigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter和OnTriggerExit函数;
  • 如果既要检测到碰撞物体的接触,又不想让碰撞检测影响物体移动,或者要检测一个物体是否经过空间中的某个指定的区域,这时就要用到触发器
  • 物体发生碰撞的条件: 两个物体都必须带有碰撞器(Collider),其中一个还必须带有Rigidbody,而且必须是运动的物体带有Rigidbody才能检测到碰撞。

9、Unity3D中内存优化

  • 压缩自带类库;
  • 将暂时不用以后还用的物体隐藏起来而不是直接Destory;
  • 释放AssetBundle占用的资源;
  • 降低模型的片面数,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab);
  • 代码中少产生临时变量。
    LOD简介:Level of detail 多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
    缺点:增加内存。

10、Unity提供的光源

  • 平行光:Directional Light;
  • 点光源:Point Light;
  • 聚光灯:Spot Light;
  • 区域光:Area Light;

11、渲染管道

是指在显示器上为了显示出图像而经过的一系列的操作(PS:从一个坐标系变换到另一个坐标系下):
本地坐标系-> 世界坐标系->视图坐标系->投影坐标系

12、关键链条

Hinge Joint,可以模拟两个物体间用一根链条在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。

13、MeshRender中meterial和sharedmaterial的区别

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

14、MVC模式

用一种业务逻辑、数据、界面显示分离的方法组织代码,,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重写编写业务逻辑。

15、MipMap

MipMaping:在三维计算机图形的贴图渲染中常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的题图被称为MipMap。

16、UnityShader

  • Surface Shader(表面着色器)
  • Vertex/Fragment Shader(顶点/片元着色器)(重点)
  • Fixed Function Shader(固定函数着色器)

17、向量

Vector3.Dot向量点乘,得到一个标量可以计算角度;Vector3.Cross向量叉乘,得到一个向量计算方向。

18、ref参数和out参数

ref参数和out参数的效果一样,都是通过关键字找到定义在主函数的变量的内存地址。不同点,ref 必须初始化,out 参数必须在函数里赋值。ref 参数是引用,out 参数是输出参数。

19、简述四元素

四元数表示选择,能进行增量旋转,避免万向锁。

20、请简述GC垃圾管理器,和GC产生的原因,并描述如何避免【重点面试题】

GC垃圾回收机制,避免堆内存溢出,定期回收那些没有有效引用的对象内存
GC优化,就是优化堆内存,减少堆内存,即时回收堆内存
GC归属于CLR

如何避免
1.减少new的次数
2.字符串拼接使用stringbuilder,字符串比较先定义一个变量存储,防止产生无效内存
3.list,new时候,规定内存大小
4.如果要射线检测,应该使用避免GC的方法XXXXNoAlloc函数
5.foreach迭代器容易导致GC(目前Unity5.5已修复),使用For循环
6.使用静态变量,GC不会回收存在的对象,但静态变量的引用对象可能被回收
7.使用枚举替代字符串变量
8.调用gameobject.tag=="XXX"就会产生内存垃圾;那么采用GameObject.CompareTag()可以避免内存垃圾的产生:
9.不要在频繁调用的函数中反复进行堆内存分配,比如OnTriggerXXX,Update等函数
10.在Update函数中,运行有规律的但不需要每一帧执行的代码,可以使用计时器,比如1秒执行一次某些代码!!!

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值