U3d经典必考面试题#持续更新##欢迎讨论交流#

UI

1.NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么?

答:1.直接监听事件:在按钮上绑定一个带有OnClick脚本,但这种方法不太好用,也不灵活。

   2.ButtonScript:在按钮上添加BoxCollider,在添加ButtonScript脚本,把要调用的方法放到场景中一个物体上,一般放在摄像机上,因为摄像机一直存在,然后把这个方法添加到ButtonScript脚本里写好的委托里面,所以可以添加多个方法,一旦点击就触发事件。

2.请简述NGUI中Panel和Anchor的作用 

答:Panel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化,以减少绘制命令的调用。  

 Anchor是NGUI中屏幕分辨率的自适应性,来适应不同的分辨率的屏幕显示。

3.为何大家都在移动设备上寻求U3D原生GUI的替代方案

答:1.不美观

2.OnGUI很耗费时间

3.使用不方便 

4.drawcall很高

4.使用原生GUI创建一个可以拖动的窗口命令是什么? 

答:GUI.DragWindow()

5.使用Unity3d实现2d游戏,有几种方式?

答:1.使用本身的GUI

2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴

3.使用2d插件,如:2DToolKit

碰撞

6.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法

答:在两个平面上分别取一个向量,然后看是否相交

7.MeshCollider和其他Collider的一个主要不同点?

答:MeshCollider是网格碰撞器,对于复杂网状模型上的碰撞检测,比其他的碰撞检测精确的多,但是相对其他的碰撞检测计算也增多了,所以一般使用网格碰撞也不会在面数比较高的模型上添加,而会做出两个模型,一个超简模能表示物体的形状用于做碰撞检测,一个用于显示。

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

答:1.碰撞器物体不能互相进入到对方内部,触发器可以

2.触发器角色控制器可以使用,碰撞器中不能使用

3.触发器没有物理属性了,碰撞器可以有力存在

4.碰撞器调用OnCollisionEnter/Stay/Exit函数,触发器调用OnTriggerEnter/Stay/Exit函数

9.物体发生碰撞的必要条件

答:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。

 

CharacterController和Rigidbody的区别?

CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

Rigidbody就是刚体,使物体带有刚体的特征。

 

10.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?

答:穿透(碰撞检测失败)

避免的方法:把刚体的实时碰撞检测打开CollisionDetection修改为Continuous Dynamic

 

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

主要是三个阶段:1.Collider.OnCollisionEnter进入碰撞,
OnCollisionEnter is called when this collider/rigidbody has begun touching
another rigidbody/collider.

collider/rigidbody开始触动另一个rigidbody/colliderOnCollisionEnter被调用。
2.Collider.OnCollisionStay
逗留碰撞,
OnCollisionStay is called once per frame for every collider/rigidbody that is
touching rigidbody/collider.

每个collider/rigidbody触动rigidbody/collider,将在每帧调用OnCollisionStay。通俗的说,

一个碰撞器或刚体触动另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。
3.Collider.OnCollisionExit
退出碰撞,
OnCollisionExit is called when this collider/rigidbody has stopped touching
another rigidbody/collider.

collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用。

 

 

动画

11.一个简单的游戏,怪物会走动\攻击\死亡,游戏角色会走动,跳跃\攻击\格挡\死亡,还会接受玩家从输入端输入的指令,NPC会走动,他们彼此之间可以互相通信.请画出以上三种角色的UML图示.

答:

12.请描述游戏动画有哪几种,以及其原理? 

答:主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。 

1.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画。 

2.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。   

3.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观,皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。

13.反向旋转动画的方法是什么?

答:  反转动画,将动画的速度调到-1。

14.写出Animation的五个方法  

答:AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样 、CrossFade淡入淡出切换动画、IsPlaying是否正在播放某个动画 

15.动画层(AnimationState Layers)的作用是什么? 

答:动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画

16.Itween插件的作用是什么,Itween作用于世界坐标还是局部坐标,请列举出3个其常用方法? 

答:ITween是补间动画的一个插件,主要作用就是给出开始、结束的值、时间,此插件实现各种动画,晃动,旋转,移动,褪色,上色,音量控制等等。

 方法:1.MoveTo  物体移动 

2.ColorTo:随着时间改变对象的颜色组

 3.LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置  

17.法线贴图 、CG动画 ?

答:法线贴图:是一种特殊的纹理,可以应用在3D表面,让低模呈现出更明显的凹凸效果。一般应用在CG动画、美术效果要求较高的单机游戏

CG动画:游戏中的CG动画其实是用3D模拟引擎制作的游戏短片,一般画面效果比较真实。

线程和协程

18.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?

答:Unity支持多线程,如果同时要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。

注意:1.虽然支持多线程,但是仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用,所以如果使用的话需要把组件中的数值传到开启的新线程中。
2.C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

19.Unity3D的协程和C#线程之间的区别是什么?

答:多线程程序同时运行多个线程,除主线程之外的线程无法访问Unity3D的对象、组件、方法,而在任一指定时刻只有一个协程在运行。

20.什么是协同程序?

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

四元数

21.四元数是什么?主要作用什么?对欧拉角的优点是什么? 

答:所谓四元数,就是把4个实数组合起来的东西。4个元素中,一个是实部,其余3个是虚部

作用:四元数用于表示旋转
优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁] 

四元数由4个数组成,旋转矩阵需要9个数

两个四元数之间更容易插值 

四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易 

与旋转矩阵类似,两个四元组相乘可表示两次旋转

摄像机

22.在场景中放置多个Camera并同时处于活动状态会发生什么?

答:游戏界面可以看到很多摄像机的混合

23.Unity摄像机有几种工作方式,分别是什么?  

答:正交和透视

正交无法看到一个物体距离自己有多远,或者远近的变化,物体也不会随着距离而收缩,所以一般做2D游戏或者是UI时会使用正交摄像机。

透视一般看物体会随着距离有大小的变化,一般3D游戏里经常使用这种摄像机。

预制物

24.Prefab的作用?如何在移动环境的设备下恰当地使用它?

答:Prefab是预制物,一般当游戏中需要频繁创建一个物体时,使用预制物可以节省内存,方便创建,方便对游戏物体进行操作,方便对属性进行修改。

 

unity 当需要频繁创建一个物体对象时,怎样减少内存

:动态加载再实例化,如果自己不主动清理内存的话,再次加载不会增加内存的,会自动去取之前已经加载好的assets,如果这一个assets你都嫌多的话,那你只能减资源了,比如,模型面数,纹理尺寸等

Shader

25.出光照计算中的diffuse的计算公式 

答:实际光照强度l=环境光(lambient)+漫反射光(Idiffuse)+镜面高光(lspecular)

    环境光:lambient=环境光强度(Aintensity)*环境光颜色(Acolor)

    漫反射光:ldiffuse=镜面光照强度(Dintensity)*镜面光颜色(Scolor)*(光的反射向量(R).观察者向量(V))^镜面光指数(n)

26.MeshRender中material和shader的区别?

答:MeshRender是模型渲染的组件,有此组件物体才能显示出来

Material是材质球,实际就是shader的实例,并进行赋值,贴图、纹理、颜色等。

Shader是着色器,实际上是一段程序,还可以用来实现一些仅靠贴图不容易实现的效果,如玻璃。

Shader大致分为:1.表面着色器

2.顶点和片元着色器

3.固定功能着色器

27.alpha blend工作原理 

答:Alpha Blend是 实现透明效果,Color = 原颜色*alpha/255+目标色*(255-alpha)/255

28.光照贴图 的优势是什么?

答:1.使用光照贴图比使用实时光源渲染要快

2.可以降低游戏内存消耗 

3.多个物体可以使用同一张光照贴图  

29.Vertex Shader是什么,怎么计算? 

答:顶点着色器:顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的

transformation和lighting,Vertex Shader主要操作顶点。 

Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。  

.unity3d提供了几种光源,分别是什么

 答:4种,Directionllight ,Point Light ,Spot Light,Area Light

 

Unity系统API

 

物理更新一般在哪个系统函数里?

 答:FixedUpdate每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。

 

 

30.OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?

答:Awake –>OnEnable->Start
    OnEnable在同一周期中可以反复地发生

31.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。

答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy

32.物理更新一般放在哪个系统函数里?

答:FixedUpdate因为不受到计算机帧频的影响,所以比较适合于做物理方面的更新。

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

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

34.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?

答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。

     当renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible 当renderer(渲染器)在任何相机上可见时调用:OnBecameVisible  

35.Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数

答:PlayerPrefs.SetInt()          

PlayerPrefs.GetInt()

36.动态加载资源的方式?区别是什么?

答:1.Resources.Load();

2.AssetBundle

区别:

Resources是动态内部调用,Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle是外部调用,要用AssetBundle首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。
简单说,Resources资源的加载是动态加载内部的,AssetBundle是动态加载外部的

37.以下哪个函数在游戏进入新场景后会被马上调用? 

答:MonoBehaviour.OnLevelWasLoaded  

38.如何销毁一个UnityEngine.Object及其子类对象

答:Destory

39.获取、增加、删除组件的命令分别是什么? 

答:获取:GetComponent 

增加:AddComponent 

没有删除组件只有让组件不生效:enable

40.Application.loadLevel命令是什么?

答:加载关卡 

41.调试记录到控制台的命令是什么?

答: Debug.Log();  

42.LayerMask.NameToLayer()这个方法有什么作用? 

答:层索引

43.localPosition与Position的使用区别? 

答:localPosition:自身位置,相对于父级的变换的位置,局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。 

 Position:在世界坐标transform的位置,世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。

44.物体自身旋转使用的函数?

答:Transform.Rotate()

45.物体围绕某点旋转使用的函数?

答:Transform.RotateAround()

46.U3D中用于记录节点空间几何信息的组件名称,及其父类名称

答:Transform 父类是 Component

47.写一个计时器工具,从整点开始计时,格式为:00:00:00  

答:

int scend;

int minte;

int hour;

void Start()

{

scend=0;

minte=0;

hour=0;

}

void Update()

{

If(scend<60)

{

Scend+=time.deltime;

}

Else

{

Scend-=60;

Minte+=1;

}

If(minte>=60)

{

  Minte-=60;

  Hour+=1;

}

}

物理引擎

48.<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.

答:添加刚体使小鸟模拟受到重力影响。

49.实现吊机吊物体的功能  

1.  答:using UnityEngine;  

2. using System.Collections;  

3. public class QizhongjiCS : MonoBehaviour {  

4.     private float dianX = 0;  

5.     public GameObject hook;  

6.     private float yuandianX;  

7.     private Vector3 hookV;  

8.     private int flag=0;  

9.     private delegate void HookMove();  

10.     private  HookMove _hookMove=null;  

11.     private int speed=3;  

12.     public HookZhongWu hzw;  

13.     private int zwFlag=0;  

14.     private GameObject zhongwu;                 //抓住的重物;  

15.     public GameObject shengzi;  

16.     public GameObject heng;  

17.     // Use this for initialization  

18.     void Start () {  

19.         hookV = hook.transform.localPosition;  

20.         yuandianX = hookV.x;  

21.     }  

22.     // Update is called once per frame  

23.     void Update () {  

24.         if (flag == 0) {  

25.             if (Input.GetMouseButtonDown(0))  

26.             {  

27.                 dianX = Input.mousePosition.x;  

28.             }  

29.             else if (Input.GetMouseButton(0))  

30.             {  

31.                 float dx = Input.mousePosition.x - dianX;  

32.                 if (Mathf.Abs(dx) > 0.1f)  

33.                 {  

34.   

35.                     hookV.x = yuandianX + dx / 32;  

36.                     if (hookV.x > -6 && hookV.x < 6)  

37.                     {  

38.                         hook.transform.localPosition = hookV;  

39.                     }  

40.   

41.                 }  

42.             }  

43.             else if (Input.GetMouseButtonUp(0))  

44.             {  

45.                 //yuandianX = hookV.x;  

46.                 flag = 1;  

47.                 _hookMove = hookDown;  

48.                 StartCoroutine(downZhua());  

49.             }   

50.         }  

51.     }  

52.     IEnumerator downZhua() {  

53.         yield return new WaitForSeconds(0.01f);  

54.         //1、向下移动, +speed  

55.         //2、判断移动的位置 如果大于某个位置 ,返回 speed为负  

56.         if (_hookMove != null)  

57.         {  

58.             _hookMove();  

59.             yield return StartCoroutine(downZhua());  

60.         }  

61.         else {  

62.             yield return null;  

63.         }  

64.         //3、判断移动回到原点    整个钩子向原始位置水平运动  

65.         //4、判断钩子回到原点   停止协程  flag=0  

66.         yield return StartCoroutine(downZhua());  

67.     }  

68.     void hookDown() {  

69.         hook.transform.Translate(Vector3.down * Time.deltaTime * speed);         changeShengZi();  

70.         if (hook.transform.localPosition.y < -2) {  

71.             if (zwFlag == 1) {  

72.                 zhongwu.transform.parent = null;  

73.                 zhongwu = null;  

74.                 zwFlag = 0;  

75.             }  

76.             _hookMove = hookUp;  

77.         }  

78.     }  

79.     void hookUp()  

80.     {  

81.         hook.transform.Translate(Vector3.up * Time.deltaTime * speed);  

82.         changeShengZi();  

83.         if (hook.transform.localPosition.y >3.2)  

84.         {  

85.                 _hookMove = HMove;  

86.         }  

87.     }  

88.     void HMove()  

89.     {  

90.         hook.transform.Translate(Vector3.left * Time.deltaTime * speed);

91.         if (hook.transform.localPosition.x <=-4.5)  

92.         {  

93.             if (zwFlag == 0)  

94.             {  

95.                 flag = 0;  

96.                 _hookMove = null;  

97.             }  

98.             else {  

99.                 _hookMove = hookDown;  

100.              }  

101.          }  

102.      }  

103.      public void zhuaZhongWu(GameObject zhongwu) {  

104.          _hookMove = hookUp;  

105.          zwFlag = 1;  

106.          this.zhongwu = zhongwu;  

107.      }  

108.      void changeShengZi() {  

109.          Vector3 hookPosition = hook.transform.position;  

110.          Vector3 hengliangP = heng.transform.position;  

111.          float dy = hookPosition.y - hengliangP.y;  

112.          Vector3 shengziP = shengzi.transform.position;  

113.          shengziP.y = hengliangP.y + dy / 2;  

114.          shengzi.transform.position = shengziP;  

115.          //改变 绳子长度  

116.          Vector3 shengziSclae = shengzi.transform.localScale;  

117.          shengziSclae.y = dy/2;  

118.          shengzi.transform.localScale = shengziSclae;  

119.      }  

120.  }  

HookZhongWu.cs用来判断钩子是否和重物碰撞

碰上的时候将重物设置成钩子的子对象 就可以实现带着往上升的效果了

1.  public class HookZhongWu : MonoBehaviour {  

2.      public QizhongjiCS qzj;  

3.      void OnTriggerEnter(Collider collision)  

4.      {//当碰撞时  

5.          print("OnTriggertEnter+" + collision.gameObject.name);  

6.          if (collision.gameObject.name == "zhongwu") {  

7.              collision.gameObject.transform.parent = this.gameObject.transform;  

8.              Vector3 v = collision.gameObject.transform.localPosition;  

9.              v.y = -1.2f;  

10.             collision.gameObject.transform.localPosition = v;  

11.             qzj.zhuaZhongWu(collision.gameObject);  

12.         }  

13.     }  

14. }  

 

50.上机题:用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可)  

答:在场景中添加一个Plan,Camera,Directional Light,Cube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。

1.鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

void Update () {

    //鼠标滚轮的效果

  //Camera.main.fieldOfView 摄像机的视野

  //Camera.main.orthographicSize 摄像机的正交投影

  //Zoom out

   if (Input.GetAxis("Mouse ScrollWheel") < 0)

    {

    if (Camera.main.fieldOfView <= 100)

    Camera.main.fieldOfView += 2;

   if (Camera.main.orthographicSize <= 20)

      Camera.main.orthographicSize += 0.5F; }

        //Zoom in

    if (Input.GetAxis("Mouse ScrollWheel") > 0)

     {

      if (Camera.main.fieldOfView > 2)

        Camera.main.fieldOfView -= 2;

      if (Camera.main.orthographicSize >= 1)

         Camera.main.orthographicSize -= 0.5F;

        }}

  2.鼠标实现在场景中拖动物体:

  解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理

   主要代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

// Use this for initialization

    void Start ()

    {

        StartCoroutine(OnMouseDown());

    }

 

    IEnumerator OnMouseDown()

    {

        //将物体由世界坐标系转换为屏幕坐标系

        Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标

        //完成两个步骤 1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系 

        //    //             2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离

        //将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离

        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));

        while (Input.GetMouseButton(0))

        {

            //得到现在鼠标的2维坐标系位置

            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);

            //将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量

            Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;

            //curPosition就是物体应该的移动向量赋给transform的position属性

            transform.position = curPosition;

            yield return new WaitForFixedUpdate(); //这个很重要,循环执行

        }

    }

 

51.Material和Physic Material区别?

答:PhysicMaterial 物理材质:主要是控制物体的摩擦,弹力等物理属性。 

Material材质:主要是控制一个物体的颜色,质感等显示。

52.CharacterController和Rigidbody的区别?

答:CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

Rigidbody就是刚体,使物体带有刚体的特征。

53.Unity3d的物理引擎中,有几种施加力的方式,分别描述出来

答:rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。

54.什么叫做链条关节?

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

55.什么是导航网格( NavMesh)?  

答: Unity内一种用于实现自动寻路的网格  

56.Unity3d提供了几种光源类型,分别是哪几种?

答:四种。

平行光:DirectionalLight                 

点光源:PointLight

聚光灯:SpotLight                             

区域光源:AreaLight

Unity引擎问题

57.简述Unity3D支持的作为脚本的语言的名称

答:Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
JavaScript

C#
Boo

58.向量的点乘、叉乘以及归一化的意义?

答:1)点乘计算两个向量之间的夹角,还可表示某一方向的投影
2)叉乘得到的是法向量
3)标准化向量:用在只关系方向,不关心大小的时候

59.矩阵相乘的意义及注意点?

答:用于表示线性变换:旋转、缩放、投影、平移、仿射
注意:矩阵的蠕变:误差的积累

60.为什么dynamicfont在unicode环境下优于static font?

答:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。

61.Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同

答:render是渲染器,渲染器可以使物体显示在屏幕上。

MeshRender是网格渲染,SkinnedMeshRender是蒙皮网格渲染器

62.简述SkinnedMesh的实现原理

答:骨骼蒙皮动画,模型本身是静态的,是因为通过蒙皮,使模型每个点都有Skin数据,Skin数据包括顶点受到哪些骨骼影响以及这些骨骼影响顶点的权重值,还有动画数据,有了Skin数据的模型就可以根据动画数据进行显示动画了。

63.为什么Unity3D中会发生在组件上出现数据丢失的情况?

答:组件上绑定的对象被删除了

64.如何安全的在不同工程间安全地迁移asset数据?三种方法

答:1)将Assets目录和Library目录一起迁移

2)导出包

3)用unity自带的assets Server功能

65.Lod是什么,优缺点是什么? 

答:LOD是Level of detail简称,意为多层次细节,是最常用的游戏优化技术,LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

   优点:可根据距离动态的选择渲染不同细节的模型

缺点:增加美工工作量,增大了游戏的容量。

66.两种阴影判断的方法、工作原理。 

答:自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面

工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。

投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域收不到光照照射而形成的阴影。

工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后在按视点位置对场景进行相应处理得到所要求的师徒(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)若是动态光源此方法就无效了。

67.MipMap是什么,作用? 

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

68.用代码实现第三角色控制器 

答:  

69.Mecanim系统中,Body Mask的作用是?

答:指定身体的某一部分是否参与渲染  

70.Unity连接数据库 

答:需要得到Mono.Data.Sqlite.dll 文件与System.Data.dll文件  

71.如何优化内存?

答:1.压缩自带类库

2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉

3.释放AssetBundle占用的资源

4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小

5.使用光照贴图

6.使用多层次细节(LOD)

7.使用着色器(Shader)

8.使用预设(Prefab)等

72.你用过哪些插件?

答:NGUI/DF/ITeen

 


在哪个模块下可以修改Render Path?


a.      Camera

b.      Light

c.       Render settings

d.      ProjectSetting=》Player=》OtherSettings

 

 

你可能感兴趣的:(Unity面试题及详解)