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范围内有效,游戏运行时明月这个函数,只能在开发中调用。

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(固定函数着色器)

你可能感兴趣的:(Unity,游戏开发之路)