Unity面试刷题库

2020-06-02 11:47:12 浏览数 (1)

C#问题

1.在类的构造函数前加上static会报什么错?为什么?

答:在构造函数如果有public修饰的静态构造函数时会报:“静态构造函数中不允许出现访问修饰符”,如果什么修饰符都不加的话不会报错,静态构造函数一般是起初始化作用。

2.C# StringBuilder类型比string类型的优势是什么?

答:StringBuilde的优势在于拼接,string的优势在于对字符串做一些处理,在使用过程中看具体的需求。

3.C# 函数Func(string a, string b)用Lambda表达式怎么写?

答:(a,b)=>{}

4.数列1,1,2,3,5,8,13...第n位数是多少?用C#递归算法实现

答:

5. 请简述值类型与引用类型的区别

答:区别: 1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中

存放的地址。 2.值类型存取快,引用类型存取慢。 3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。 4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。 5.值类型继承自System.ValueType,引用类型继承自System.Object。

6. 请简述ArrayList和List<>的主要区别

答:ArrayList是非泛型列表,存储数据时把所有的数据都当成object类型存储,存在装箱问题,取出来使用的时候存在拆箱问题,装箱拆箱会使性能变差,而且存在数据安全问题,但是优点在于可以让值类型和引用类型互相转换。

List是泛型列表,在使用的时候才去定义数据类型,泛型避免了拆箱装箱的问题,存入读取速度较快,类型也更安全。

7. 请简述GC(垃圾回收)产生的原因,并描述如何避免?

答:GC回收堆上的内存 避免:1)减少new产生对象的次数 2)使用公用的对象(静态成员) 3)如果字符串拼接多的将String换为StringBuilder

8. 请描述Interface与抽象类之间的不同

答:语法不同处:1.抽象类中可以有字段,接口没有。

2.抽象类中可以有实现成员,接口只能包含抽象成员。

3.抽象类中所有成员修饰符都可以使用,接口中所有的成员都是对外的,所以不需要修饰符修饰。

用法不同处:1.抽象类是概念的抽象,接口关注于行为。

代码语言:javascript复制
       2.抽象类的子类与父类的关系是泛化关系,耦合度较高,而实现类和接口之间是实现的关系,耦合度比泛化低。

       3.一个类只能继承一个类,但是可以实现多个接口。

9.下列代码在运行中会产生几个临时对象?

string a = new string("abc");
a = (a.ToUpper() "123").Substring(0, 2);

答:第一行是会出错的。应该这样初始化:

string b = new string(new char[]{'a','b','c'});

3个临时对象

10.下列代码在运行中会发生什么问题?如何避免?

List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });

foreach (int item in ls)

{

Console.WriteLine(item * item);

代码语言:javascript复制
    ls.Remove(item);

}

答:会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。

使用foreach时候不要对内容进行修改,如果要修改可以使用for

11.请简述关键字Sealed用在类声明和函数声明时的作用

答:Sealed访问修饰符用于类时,该类是密封类,可防止其他类继承此类。

在方法中使用时则可防止派生类重写此方法。

12.请简述private,public,protected,internal的区别

答:public:对任何类和成员都公开,无限制访问 private:仅对该类公开 protected:对该类和其派生类公开 internal:只能在包含该类的程序集中访问该类 protected internal:protected internal

13.反射的实现原理?

答:审查元数据并收集关于它的类型信息的能力。

14.Net与Mono的关系?

答:mono是.net的一个开源跨平台工具。.net只能在windows下运行,mono可以实现跨平台,可以运行于linux,Unix,Mac OS等。

15.请说出4种面向对象的设计原则,并分别简述它们的含义。

答:1) 单一职责原则:一个类,最好只做一件事,只有一个引起它的变化.

2) 开放-封闭原则:对于扩展是开放的,对于更改是封闭的

3) 里氏替换原则:子类必须能够替换其基类

4) 依赖倒置原则:依赖于抽象

5) 接口隔离原则 :使用多个小的专门的接口,而不要使用一个大的总接口。

16. Hashtable是无序的吗?

答:电脑没有绝对的无序,hashtable是通过哈希码让开发者感觉无序

17.请简述ArrayList和List的主要区别?

ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理),装箱拆箱的操作(费时),List是泛型类,功能跟ArrayList相似,但不存在ArrayList所说的问题

18.简述一下对象池,你觉得在FPS里哪些东西适合使用对象池

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

19.结构体和类有何区别?

结构体是一种值类型,而类是引用类型。(值类型、引用类型是根据数据存储的角度来分的)就是值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作

20.C#的委托是什么?有何用处?

委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。用处:使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C 中的函数指针不同,委托是面向对象,而且是类型安全的。

21.请简述sealed关键字用在类声明时与函数声明时的作用

sealed修饰的类为密封类,类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。

22.C#中的排序方式有哪些?

鸡尾酒算法,选择排序,冒泡排序(两层for循环就是冒泡,另外理解鸡尾酒算法也就是定向冒泡排序),快速排序,插入排序,希尔排序,归并排序(可以百度学一下)

23.请简述GC(垃圾回收)产生的原因,并描述如何避免?

GC回收堆上的内存

避免:1.减少new产生对象的次数

2.使用公用的对象(静态成员) 3.将String换为StringBuilder

24.反射的实现原理?

审查元数据并收集关于它的类型信息的能力。实现原理:在运行时根据程序集及其中的类型得到元数据。下面是实现步骤:

导入using System.Reflection;

Assembly.Load(“程序集”)加载程序集,返回类型是一个Assembly

得到程序集中所有类的名称

foreach (Type type in assembly.GetTypes()) { string t = type.Name; }

  1. Type type = assembly.GetType(“程序集.类名”);获取当前类的类型

Activator.CreateInstance(type); 创建此类型实例

MethodInfo mInfo = type.GetMethod(“方法名”);获取当前方法

m.Info.Invoke(null,方法参数);

Unity问题

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.使用不方便

  1. drawcall很高

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

答:GUI.DragWindow()

4.动态加载资源的方式?他们之间的区别

1.Resources.Load();

2.AssetBundle

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.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?

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

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

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

主要是三个阶段:1.Collider.OnCollisionEnter 进入碰撞, OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider. 当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用。 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.CharacterController和Rigidbody的区别

Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件

12.简述prefab的用处

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

动画

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)

代码语言:javascript复制
环境光: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种,Directionl light ,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

答:

代码语言:javascript复制
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.实现吊机吊物体的功能

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

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

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

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

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

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提供了几种光源类型,分别是哪几种?

答:四种。

平行光:Directional Light

点光源:Point Light

聚光灯:Spot Light

区域光源:Area Light

Unity引擎问题

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

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

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

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

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

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

60.为什么dynamic font在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

图形图像

1.什么是渲染管道?

答:是指在显示器上为了显示出图像而经过的一系列必要操作。

渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

主要有三步:应用程序阶段,几何阶段 光栅阶段

本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。

2.什么是矢量图 ?

答:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。

3.什么是矩阵?矩阵运算?

答:矩阵:横轴排列的二维数据表格

矩阵运算:

加减 限制条件:行和列必须相同,对应相加相减得到结果

乘法 限制条件:要求左矩阵的行和右矩阵的列必须同,行数和左矩阵相等,列数和右矩阵相等,结果的第i行第j列,是左矩阵的第i行和右矩阵的第j列逐个相乘并把结果相加,得到结果是结果 的 第i行第j列

4.角度和弧度的转换

答:角度和弧度

度和弧度之间的换算 1弧度 = 180度 /pi(约57.3)

代码语言:javascript复制
                   1度=pi/180弧度(约0.017)

5.矢量标量

答:矢量有方向如力速度 标量只有大小没有方向如温度

矢量取模就是只要大小不要方向

^单位向量 有方向 大小为1的向量

矢量的加法:是矢量的几何和,服从平行四边形规则

矢量满足交换律,满足结合律

在直角坐标系中,矢量等于骑在坐标轴上投影的矢量之和(二维矢量可以看做三维矢量的特例也就是说 三维成立,二维也成立)

矢量减法:

大小相等 方向相反 称为逆矢量

任意多个矢量首尾相连接组成闭合多边形,其结果必为0

矢量的乘法:点积(内积、标量积)、叉积(外积)结果是矢量

点积方法 dot

0 人点赞