面试汇总

来源:互联网 发布:linux 写文件命令 编辑:程序博客网 时间:2024/05/18 18:44

第一部分

1. 请简述值类型与引用类型的区别
答:区别:
1.
值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址。
2.
值类型存取快,引用类型存取慢。
3.
值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。
4.
栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。
5.
值类型继承自System.ValueType,引用类型继承自System.Object。
可参考http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html
2.C#中所有引用类型的基类是什么
答:引用类型的基类是System.Object 值类型的基类是System.ValueType
同时,值类型也隐式继承自System.Object
3.请简述ArrayListList<Int>的主要区别
答:ArrayList存在不安全类型‘(ArrayList会把所有插入其中的数据都当做Object来处理)
装箱拆箱的操作(费时)
List是接口,ArrayList是一个实现了该接口的类,可以被实例化。
4.请简述GC(垃圾回收)产生的原因,并描述如何避免?
答:GC回收堆上的内存
避免:1)减少new产生对象的次数
2)使用公用的对象(静态成员)
3)将String换为StringBuilder
5.请描述Interface与抽象类之间的不同
答:抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公公只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。
类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。
实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。


参考http://www.cnblogs.com/seapub/archive/2012/08/08/2628433.html
6.下列代码在运行中会产生几个临时对象?

 

答:其实在C#中第一行是会出错的(Java中倒是可行)。应该这样初始化:

string b = new string(new char[]{'a','b','c'});
7.下列代码在运行中会发生什么问题?如何避免?

答:会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。
8.请简述关键字Sealed用在类声明和函数声明时的作用
答:类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
9.请简述privatepublicprotectedinternal的区别
答:
public
:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
protected internal:protected + internal
10.反射的实现原理?
答:审查元数据并收集关于它的类型信息的能力。
参考http://blog.163.com/xuanmingzhiyou@yeah/blog/static/1424776762011612115124188/
反射个人认为,就是得到程序集中的属性和方法。
实现步骤:
1,导入using System.Reflection;
2,Assembly.Load("程序集")加载程序集,返回类型是一个Assembly
3, foreach (Type type in assembly.GetTypes())
            {
                string t = type.Name;
            }
   得到程序集中所有类的名称
4,Type type = assembly.GetType("程序集.类名");获取当前类的类型
5,Activator.CreateInstance(type); 创建此类型实例
6,MethodInfo mInfo = type.GetMethod("方法名");获取当前方法
7,mInfo.Invoke(null,方法参数);
13.Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
答:参考http://www.unitymanual.com/3821.html
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
14.Unity3D的协程和C#线程之间的区别是什么?
答:http://blog.csdn.net/kongbu0622/article/details/8775037
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。 
15.U3D中用于记录节点空间几何信息的组件名称,及其父类名称
答:Transform 父类是 Component
16.简述四元数的作用,四元数对欧拉角的优点?
答:四元数用于表示旋转
相对欧拉角的优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
17.向量的点乘、叉乘以及归一化的意义?
1)点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
2
)叉乘得到的向量垂直于原来的两个向量
3)标准化向量:用在只关系方向,不关心大小的时候
18.矩阵相乘的意义及注意点
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累
19.为何大家都在移动设备上寻求U3D原生GUI的替代方案
不美观,OnGUI很耗费时间,使用不方便 ,DrawCall
20.请简述如何在不同分辨率下保持UI的一致性
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size
原生GUI http://unity3d.9ria.com/?p=2587
NGUI http://blog.csdn.net/mfc11/article/details/17681429
21.为什么dynamic fontunicode环境下优于static font
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
22.Render的作用?描述MeshRenderSkinnedMeshRender的关系与不同
A renderer is what makes an object appear on the screen

Mesh就是指模型的网格(同名组件是用于调整网格属性的),MeshFilter一般是用于获得模型网格的组件,而MeshRender是用于把网格渲染出来的组件,
23.
简述SkinnedMesh的实现原理

http://blog.csdn.net/n5/article/details/3105872
24.在场景中放置多个Camera并同时处于活动状态会发生什么?
答:游戏界面可以看到很多摄像机的混合
25.Prefab的作用?如何在移动环境的设备下恰当地使用它?
答:Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改
http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html
26.如何销毁一个UnityEngine.Object及其子类
答:Destory
27.为什么Unity3D中会发生在组件上出现数据丢失的情况?
答:组件上绑定的对象被删除了
28.如何安全的在不同工程间安全地迁移asset数据?三种方法
答:

将Assets目录和Library目录一起迁移

导出包

用unity自带的assets Server功能
29.MeshCollider和其他Collider的一个主要不同点?
答:Meshcollider再快也是基于V3顶点~~ 建议还是用boxcollider,boxcollider本身是基于算法,没有面的概念。
30.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
穿透(碰撞检测失败)
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
(
碰撞体变大,FixedUpdate, 代码限制)
31.OnEnableAwakeStart运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
答:Awake -》OnEnable-》Start
OnEnable在同一周期中可以反复地发生
http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html
32.请简述OnBecameVisibleOnBecameInvisible的发生时机,以及这一对回调函数的意义?
答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
33.Unity3D如何获知场景中需要加载的数据?
答:题目是获取的意思?
Resource.Load
AssetBundle

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

 

 

 

 

 

 

第二部分

 

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

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

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

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

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

2.alpha blend 工作原理

实际显示颜色 = 前景颜色*Alpha/255 + 背景颜色*(255-Alpha)/255

3.写光照计算中的diffuse的计算公式

实际光照强度 I= 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);

环境光:Iambient= Aintensity* Acolor; (Aintensity表示环境光强度,Acolor表示环境光颜色)

漫反射光:Idiffuse = Dintensity*Dcolor*N.L;

(Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)

镜面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;

(Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量,n称为镜面光指数)

4.lod是什么,优缺点是什么

LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

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

缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。

5.两种阴影判断的方法工作原理

阴影由两部分组成:本影与半影

本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)

半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)

求阴影区域的方法:做两次消隐过程

一次对每个光源进行消隐,求出对于光源而言不可见的区域L

一次对视点的位置进行消隐,求出对于视点而言可见的面S

shadow area= L ∩ S

阴影分为两种:自身阴影和投射阴影

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

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

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

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

若是动态光源此方法就无效了。

5.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几个过程。

6.MipMap是什么?作用?

在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。

7.用u3d实现2d游戏,有几种方式?

   1.利用引擎自带的GUI

   2.把摄像机设为Orthographic,用面片作为2d元素

   3.利用第三方插件:NGUI、2dToolkit

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

collider碰撞器会有碰撞的效果,IsTrigger = false,可以调用OnCollisionEnter/Stay/Exit函数

trigger触发器没有碰撞效果,isTrigger = true,可以调用OnTriggerEnter/stay/exit函数

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

物体A必须带有(collider+rigidbody)或者CharacterController,另一个物体也必须至少带有collider

10.CharacterController和Rigidbody的区别

Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的。

11.物体发生碰撞时,有几个阶段,分别对应的函数

三个阶段,OnCollisionEnter/Stay/Exit函数

12.u3d中,几种施加力的方式,描述出来

rigidbody.AddForce/AddForceAtPosition,都是rigidbody的成员函数

13.什么叫做链条关节

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

14.物体自旋转使用的函数叫什么

     transform.Rotate

15.物体绕某点旋转使用函数叫什么

     transform.RotateAround

16.u3d提供了一个用于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数

     PlayerPrefs.SetInt 与 PlayerPrefs.GetInt

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

平行光:Directional Light

聚光灯:Spot Light

点光源:Point Light

区域光源:Area Light(只用于烘培)

18.unity3d从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法。

Awake –>OnEnable –> Start  –> Update –> FixedUpdate –> LateUpdate –> OnGUI –> Reset –> OnDisable –> OnDestroy

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

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

20.移动相机动作在哪个函数里,为什么在这个函数里。

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

21.当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存。

做一个pool,游戏开始时预先实例化足够的数量,然后用的时候取不用的时候收回

22.一个场景放置多个camera并同时处于活动状态,会发生什么

实际看到的画面由多个camera的画面组成,由depth、Clear Flag、Culling Mask都会影响最终合成效果。

23.简述prefab的用处和环境

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

24.如何销毁一个UnityEngine.Object以及其子类

Destroy

25.为什么u3d会出现组件上数据丢失的情况

一般是组件上绑定的物体对象被删除了

26.u3d下如何安全的在不同工程迁移asset数据

方法1,可以把assets目录和Library目录一起迁移,

方法2,导出包

方法3,用unity带的assets server功能

 

 

 

第三部分

 

1.什么是渲染管道?

是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

主要步骤有:

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

2.如何优化内存?

有很多种方式,例如

1.压缩自带类库;

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

3.释放AssetBundle占用的资源;

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

5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

3、动态加载资源的方式?(有时候也问区别,具体请百度)

1.Resources.Load();

2.AssetBundle

4、什么是协同程序?

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

5、你用过哪些插件?

(最好多熟悉几个插件,问的时候好回答)

 

 

 

第四部分

 

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

2.碰撞检测需要物体具备什么属性?

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

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

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

获取:GetComponent

增加:AddComponent

删除:Destroy

6.Animation.CrossFade命令作用是:(C)

A.动画放大 B.动画转换 C.动画的淡入为其他动画

7.Application.loadLevel命令为:(A)

A.加载关卡 B.异步加载关卡 C.加载动作

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

Debug.Log();

9.编辑器类存放路径是什么?

工程目录下的Assets/Editor文件夹下。

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

 GUI.DragWindow();

11.localPosition与Position的使用区别?

localPosition:自身位置,相对于父级的变换的位置。 Position:在世界坐标transform的位置

12.意义连线

Mathf.Round  四舍五入

Mathf.Clamp  限制

Mathf.Lerp   插值

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

14.写出Animation的五个方法

15.怎么拿到一个对象上脚本的方法

GameObject.GetComponent<>();

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

17.请简述向量的点乘,向量的叉乘以及向量归一化的几何意义?

 点乘的几何意义是:计算两个向量之间的夹角,以及在某一方向上的投影;

叉乘的几何意义是:创建垂直于平面,三角形,或者多边形的向量;参考:http://blog.sina.com.cn/s/blog_9283b6f601017hfw.html

 

 

 

 

 

第五部分

 

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

构造函数格式为 public+类名如果加上static会报错(静态构造函数不能有访问修饰符)
原因:静态构造函数不允许访问修饰符,也不接受任何参数; 
无论创建多少类型的对象,静态构造函数只执行一次; 
运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数; 
静态构造函数执行先于任何实例级别的构造函数; 
显然也就无法使用this和base来调用构造函数。
2,C# String类型比stringBuilder类型的优势是什么?

如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringBuilder是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用stringBuilder这样比较节约内存。但是string 类的方法和功能仍然还是比stringBuilder类要强。

 

string类由于具有不可变性(即对一个string对象进行任何更改时,其实都是创建另外一个string类的对象),所以当需要频繁的对一个string类对象进行更改的时候,建议使用StringBuilder类,StringBuilder类的原理是首先在内存中开辟一定大小的内存空间,当对此StringBuilder类对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充,而不是重新创建一个对象,这样如果对一个字符串对象进行频繁操作的时候,不会造成过多的内存浪费,其实本质上并没有很大区别,都是用来存储和操作字符串的,唯一的区别就在于性能上。

String主要用于公共API,通用性好、用途广泛、读取性能高、占用内存小。

StringBuilder主要用于拼接String,修改性能好。

不过现在的编译器已经把 String 的 + 操作优化成 StringBuilder 了,所以一般用String就可以了

String是不可变的,所以天然线程同步。

StringBuilder可变,非线程同步。

http://zhidao.baidu.com/question/240364840.html?qbl=relate_question_0&word=String%C0%E0%D0%CD%B1%C8stringBuilder%C0%E0%D0%CD%B5%C4%D3%C5%CA%C6
3,C# 函数Func(string a, string b)用Lambda表达式怎么写?

答:https://msdn.microsoft.com/zh-cn/library/bb397687.aspx
4,数列1,1,2,3,5,8,13...第n位数是多少?用C#递归算法实现

通项公式应该是an = a(n-1) + a(n-2)

a3=2=1+1
a4=3=1+1+1
a5=1+1+1+2
a6=1+1+1+2+3
.........
an=1+1+1+2+3+...+(n-2)+(n-3)
=2+(n-2)(n-3)/2 (n>=3) 
这是通项公式,至于递归?…


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

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

OnClick()

主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick() OnPress()等函数,可以说NGUI的按钮是通过发消息这个方式调用的。
7,怎么判断两个平面是否相交?不能用碰撞体,说出计算方法

答:

https://www.baidu.com/s?wd=怎么判断两个平面是否相交&rsv_spt=1&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_pq=abcac720000083b6&rsv_t=ecdctoXQNURcfX%2FVm8MQdPtiBLttYO4HqJrZ1yNsNcxUqDe6DM4ovlQT4HdHZJMh6guT&inputT=2590&oq=C%23%20lamb&rsv_n=2&bs=c%23%20lambda

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

 Vector3 v代表初速度v'代表现在的速度,假设小鸟是沿的z轴也就是transform.forward方向运动的质量为1,那么v‘=v-new Vector3(0,g*t,f*t),transform.Translate(v')做的就是抛物线运动(g为重力加速度不要用现实中的需要自己调试,f为阻力也要自己调试设置,t为时间)


最先执行的方法是:

1、(激活时的初始化代码)Awake,2、Start、3、Update【FixUpdate、LateUpdate】、4、(渲染模块)OnGUI、5、再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy

高频问答的问题:

1.什么是渲染管道?

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

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

主要步骤有:

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

2.如何优化内存?

有很多种方式,例如

A、压缩自带类库;

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

C、释放AssetBundle占用的资源;AssetBundle资源包

D、降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;

E、使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

3.动态加载资源的方式?(有时候也问区别,具体请百度)

1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。Resources.Load();

2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。AssetBundle

3.通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的【AssetDatabase 资源数据库】

区别:Resources的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以unity推荐的方式是不用它,都用bundle的方式替代,把资源达成几个小的bundle,用哪个就load哪个,这样还能分包发布和patch,但是在开发过程中,不可能没更新一个资源就打一次bundle,所以editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,在不同的环境下做不同实现。

动态资源的存放

  有时我需要存放一些自己的文件在磁盘上,例如我想把几个bundle放在初始的安装里, unity有一个streaming asset的概念,用于提供存储接口的访问。我们需要在编辑器建立一个StreamingAssets名字的文件夹,把需要我们放在客户磁盘上的动态文件放在这个文件夹下面,这样安装后,这些文件会放在用户磁盘的指定位置,这个位置可以通过  Application.streamingAssetsPath 来得到。 

4.什么是协同程序?

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

5.你用过哪些插件?

一 界面制作 推荐:NGUI

二 2D游戏制作 推荐:2D Toolkit   //[ˈtu:lkɪt] 工具包,工具箱

三 可视化编程 推荐:PlayMaker

四 插值插件 推荐:iTween,HOTween

五 路径搜寻 推荐:Simple Path

六 美术及动画制作 推荐:RageSpline,Smooth Moves

七 画面增强    推荐:Bitmap2Material,Strumpy Shader Editor

八 摄像机管理  推荐:Security Camera

九 资源包  推荐:Nature Pack 

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

1.使用本身的GUI;

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

//[ˌɔ:θə'ɡræfɪk] adj. 正字法的,拼字正确的;正射

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

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

碰撞器有碰撞的效果,IsTrigger=false,可以调用OnCollisionEnter/Stay/Exit函数;

{[kəˈlɪʒn]n. 碰撞;冲突;(意见,看法)的抵触;(政党等的)倾轧}

触发器没有碰撞效果,IsTrigger=true,可以调用OnTriggerEnter/Stay/Exit函数。

a.如果不想让碰撞检测影响物体移动但是又想检测到碰撞这时用到触发器(Trigger)

b.触发器用来检测一个物件是否经过空间中的某个区域 

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

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

8.1 .CharacterController和Rigidbody的区别?

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

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

[CharacterController:角色控制器]

Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的

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

三个阶段

1.OnCollisionEnter(进入碰撞) 2.OnCollisionStay (逗留碰撞) 3.OnCollisionExit(当退出碰撞) 

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

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

11.什么叫做链条关节?

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

{ [hɪndʒ] n. 铰链,折叶;关键,转折点;枢要,中枢}

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

Transform.Rotate()

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

Transform.RotateAround()

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

PlayerPrefs.SetInt() PlayerPrefs.GetInt()

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

四种。

平行光:Directional Light 点光源:Point Light

聚光灯:Spot Light 区域光源:Area Light

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

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

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

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

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

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

19.当游戏中需要频繁创建一个物体时,我们需要怎样做能够节省内存?

使用预制物体对象Prefab,然后复制创建。

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

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

21.请描述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它?

Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。

如何销毁一个UnityEngine.Object及其子类?

使用Destroy()方法;

22.请简述Unity3d下如何安全的在不同工程间迁移asset数据,请列举出三种方法?

1.可以把assets目录和Library目录一起迁移

2.导出包

3.用Unity带的assets Server功能 

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

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

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

b.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;

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

24.请描述为什么Unity3d中会发生在组件上出现数据丢失的情况

一般是组件上绑定的物体对象被删除了

25.alpha blend工作原理

Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。

{['ælfə] 透明(度); [blend] 混合;把…掺在一起}

26.写出光照计算中的diffuse的计算公式

计算公式为: Idiffuse = Dintensity*Dcolor*N.L ; (Dintensity表示漫反射强度, Dcolor 表示漫反射光颜色, N 为该点的法向量, L 为光源向量 其中N与L点乘,如果结果小于等于0,则漫反射为0。){[dɪ'fju:z] vi. 传播;四散|intensity[ɪn'tensətɪ] n. 强烈;(感情的)强烈程度;强度;烈度}

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

LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

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

A.阴影由两部分组成:本影与半影

a.本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)

b.半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)

求阴影区域的方法:做两次消隐过程

一次对每个光源进行消隐,求出对于光源而言不可见的区域L;

一次对视点的位置进行消隐,求出对于视点而言可见的面S;

shadow area= L ∩ S

B.阴影分为两种:自身阴影和投射阴影

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

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

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

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

若是动态光源此方法就无效了。

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几个过程。

30.MipMap是什么,作用?

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

31.机试:二选一

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

2.实现吊机吊物体的功能  
【吊机吊物体需要节点挂接和坐标系转换】 

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

【反转动画,讲动画的速度调到-1,碰撞时,被碰撞物体与碰撞物体有collider组件,碰撞物体有刚体组件,或角色碰撞得包含角色组件 OR 改变animation.speed】

33.碰撞检测需要物体具备什么属性?

能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器

【Physics.OverlapSphere相交球检测碰撞,碰撞检测需要包围盒】

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

获取:GetComponent 增加:AddComponent  删除:Destroy

35.Animation.CrossFade命令作用是:(C)  {Fadevi. 褪去,失去光泽;}

A.动画放大 B.动画转换 C.动画的淡入为其他动画

36.Application.loadLevel命令为:(A)

A加载关卡 B.异步加载关卡 C.加载动作

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

Debug.Log();

39.编辑器类存放路径是什么?

工程目录下的Assets/Editor文件夹下。

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

GUI.DragWindow();

41.localPosition与Position的使用区别?

localPosition:自身位置,相对于父级的变换的位置。

Position:在世界坐标transform的位置

意义连线

Mathf.Round 插值

Mathf.Clamp 四舍五入

Mathf.Lerp 限制

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

43.写出Animation的五个方法

AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样

44.怎么拿到一个对象上脚本的方法

GameObject.GetComponent<>();

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

45.请简述向量的点乘,向量的叉乘以及向量归一化的几何意义?

点乘的几何意义是:计算两个向量之间的夹角,以及在某一方向上的投影;

叉乘的几何意义是:创建垂直于平面,三角形,或者多边形的向量; 

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

支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine.{ [k  ə ru:'ti:n]  n. 协同程序} 

注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

47.Unity3D中的协程(Coroutine)和C#线程之间的区别是什么?  
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜asynchronous[e  ɪˈ s ɪŋ kr ə n ə s] .synchronous同步 

48.请简述四元数的作用以及四元数相对于欧拉角的优点

A.四元数一般定义如下:q=w+xi+yj+zk其中 w,x,y,z是实数。同时,有: i*i=-1    j*j=-1    k*k=-1

B.四元数也可以表示为: q=[w,v]

有多种方式可表示旋转,如   axis/angle 、欧拉角 (Euler angles) 、矩阵 (matrix) 、四元组等。 相对于其它方法,四元组有其本身的优点:

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

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

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

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

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

49.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及他们执行的意义?

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

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

50.动画层(Animation Layers)的作用是什么?  
动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画 

51.

52.请说出4种面向对象的设计原则,并分别简述它们的含义。  
1) 单一职责原则 (The Single Responsiblity Principle,简称SRP):一个类,最好只做一件事,只有一个引起它的变化. 

2) 开放-封闭原则 (The Open-Close Principle,简称OCP):对于扩展是开放的,对于更改是封闭的

3) Liskov 替换原则(The Liskov Substitution Principle,简称LSP):子类必须能够替换其基类

4) 依赖倒置原则(The Dependency Inversion Pricinple,简称DIP):依赖于抽象

5) 接口隔离原则 (The Interface Segregation Principle,简称ISP):使用多个小的专门的接口,而不要使用一个大的总接口。

53.Material和Physic Material区别?

PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。

Material材质(材质类)为了获得一个对象使用的材质,可以使用 Renderer.materia属性:  

54.法线贴图 、CG动画

A.法线贴图:是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。 

B.CG动画:原为Computer Graphics的英文缩写。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成,国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为CG。它既包括技术也包括艺术,几乎囊括了当今电脑时代中所有的视觉艺术创作活动,如平面印刷品的设计、网页设计、三维动画、影视特效、多媒体技术、以计算机辅助设计为主的建筑设计及工业造型设计等。


0 0
原创粉丝点击