其实学习Unity3D引擎,我们除了懂得实操,同时兼顾理解一些理论知识,也是挺不错的积累。今天小编会把常用的一些理论问题汇总起来,后面可以做一个快速的记忆和学习。



1、请简述值类型与引用类型的区别。 区别:A.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址;B.值类型存取快,引用类型存取慢;C.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用;D.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放;E.值类型继承自System.ValueType,引用类型继承自System.Object。 参考:



2、C#中所有引用类型的基类是什么? 引用类型的基类是System.Object值类型的基类是System.ValueType,同时,值类型也隐式继承自System.Object。



3、请简述ArrayList和List的主要区别。 ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理)装箱拆箱的操作(费时),List是接口,ArrayList是一个实现了该接口的类,可以被实例化。



4、请简述GC(垃圾回收)产生的原因,并描述如何避免? GC回收堆上的内存,避免:A.减少new产生对象的次数;B.使用公用的对象(静态成员);C.将String换为StringBuilder。 5、请描述Interface与抽象类之间的不同。 抽象类表示该类中可能已经有一些方法的具体定义,但接口就是只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。 参考:



6、下列代码在运行中会产生几个临时对象? string a = new string("abc"); a = (a.ToUpper() + "123").Substring(0, 2); 其实在C#中第一行是会出错的(Java中倒是可行)。应该这样初始化: string b = new string(new char[]{'a','b','c'});



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



List
     
      ls 
     
     =
     
      
     
     new
     
      
     
     List
     
     (
     
     new
     
      
     
     int
     
     [
     
     ]
     
      
     
     {
     
      
     
     1
     
     ,
     
      
     
     2
     
     ,
     
      
     
     3
     
     ,
     
      
     
     4
     
     ,
     
      
     
     5
     
      
     
     }
     
     )
     
     ;
     
     
        
     
     foreach
     
      
     
     (
     
     int
     
      item 
     
     in
     
      ls
     
     )
     
     

        
     
     {
     
     

          Console
     
     .
     
     WriteLine
     
     (
     
     item 
     
     *
     
      item
     
     )
     
     ;
     
     

          ls
     
     .
     
     Remove
     
     (
     
     item
     
     )
     
     ;
     
     

        
     
     }



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



8、请简述关键字Sealed用在类声明和函数声明时的作用。 类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。



9、请简述private,public,protected,internal的区别。 public:对任何类和成员都公开,无限制访问 private:仅对该类公开 protected:对该类和其派生类公开 internal:只能在包含该类的程序集中访问该类 protected internal:protected + internal



10、反射的实现原理? 审查元数据并收集关于它的类型信息的能力。 参考: http://blog.163.com/xuanmingzhiy ... 762011612115124188/ 反射就是得到程序集中的属性和方法。 实现步骤: A.导入using System.Reflection; B.Assembly.Load("程序集")加载程序集,返回类型是一个Assembly C.得到程序集中所有类的名称



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



E.Type type = assembly.GetType("程序集.类名");获取当前类的类型 E.Activator.CreateInstance(type); 创建此类型实例 G.MethodInfomInfo = type.GetMethod("方法名");获取当前方法 H.mInfo.Invoke(null,方法参数);



11、 .Net与Mono的关系? Mono是 .net 的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,可以运行于linux,Unix,Mac OS等。



12、简述unity3d支持的作为脚本的语言的名称 Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。Unity编辑器里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。 JavaScript:和网页中常用的JavaScript不一样,它编译后的运行速度很快,语法方面也会有不少区别。 C#:类似于Java编程语言的变异型语言; Boo:可以看做是Python语言的变种,又糅合了Ruby和C#的特性,它是静态类型语言。



13、Unity3D是否支持写成多线程程序?如果支持的话需要注意什么? 仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用支持;如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。 参考: http://www.unitymanual.com/3821.html 注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象。



14、Unity3D的协程和C#线程之间的区别是什么? 多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。Unity3d没有多线程的概念,不过Unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用Yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死。



15、U3D中用于记录节点空间几何信息的组件名称,及其父类名称。 答:Transform 父类是 Component。



16、简述四元数的作用,四元数对欧拉角的优点? 四元数用于表示旋转,相对欧拉角的优点:A.能进行增量旋转;B.避免万向锁;C.给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)



17、向量的点乘、叉乘以及归一化的意义? 点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影。 叉乘得到的向量垂直于原来的两个向量 标准化向量:用在只关系方向,不关心大小的时候



18、矩阵相乘的意义及注意点。 用于表示线性变换:旋转、缩放、投影、平移、仿射;注意矩阵的蠕变:误差的积累。



19、为何大家都在移动设备上寻求U3D原生GUI的替代方案? 不美观,OnGUI很耗费时间,使用不方便。



20、请简述如何在不同分辨率下保持UI的一致性。 答:NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的Size。 原生GUI: http://unity3d.9ria.com/?p=2587 NGUI:



21、为什么dynamic font在unicode环境下优于static font。 Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。



22、Prefab的作用?如何在移动环境的设备下恰当地使用它? 答:Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。 参考:



23、如何销毁一个UnityEngine.Object及其子类 Destory。



24、为什么Unity3D中会发生在组件上出现数据丢失的情况? 组件上绑定的对象被删除了



25、如何安全的在不同工程间安全地迁移asset数据?三种方法 将Assets目录和Library目录一起迁移; 导出包; 用Unity自带的Assets Server功能。



26、当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免? 答:穿透(碰撞检测失败) 参考: http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed



27、OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生? Awake -》OnEnable-》Start OnEnable在同一周期中可以反复地发生 参考: http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html



28、请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义? 当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。



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



30、物体发生碰撞时,有几个阶段,分别对应的函数? 3个阶段:开始碰撞:Enter:OnTriggerEnter/OnCollisionEnter 持续碰撞:Stay:OnTriggerStay/OnCollisionStay 结束碰撞:Exit:OnTriggerExit/OnCollisionExit



31、物体发生碰撞时,几种施加压力的方式,描述出来? 3种: AddForce添加普通力;AddExplosionForce添加爆炸力;AddForceAtPosition添加位置力。



32、物理更新一般在哪个系统函数里? FixedUpdate,每固定帧绘制时执行一次可以在edit->project setting->time设置 update 是在渲染帧执行,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。



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



34、 Unity3D常用的组件有哪些? Transform、Camera、Rigidbody、NavMeshAgent、Animator、Button、Text、Image、代码类组件等。



35、 Unity3D里的游戏对象(GameObject)有哪些属性? 公用的有Transform,不同的游戏对象有不同的属性,如Camera、Rigidbody、NavMeshAgent、Animator、Button、Text、Image、代码类组件等。



36、 什么是3D渲染管线? 是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。 主要步骤有: 本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化



37、C#中命名空间如何写?作用是什么? C#中的类是利用命名空间组织起来的。命名空间提供了一种从逻辑上组织类的方式,防止命名冲突。 命名空间声明用namespace 关键字用于声明一个命名空间。此命名空间范围允许您组织代码并为您提供了创建全局唯一类型的方法。namespace name {类型定义} 其中:在命名空间中,可以声明类、接口、结构、枚举、委托 命名空间。



38、C#静态与非静态成员变量的区别是什么? 区别:静态成员先分配内存,只能调用静态成员; 非静态成员在对象实例化后才分配内存,可以调用静态成员。



39、 C#中什么是重写(override)? 重写”父类方法就是修改它的实现方式或者说在子类中对它进行重新编写。父类前面就加virtual,子类后面加override。



40、C#中什么是重载? 方法名相同,参数不同,参数不同主要体现在参数的位置、个数、类型不同。 41、图像中的RGBA指的什么? 答:RGBA是代表Red(红色) Green(绿色) Blue(蓝色)和 Alpha(透明度)的色彩空间。也叫颜色空间。



42、 游戏中的常用的寻路算法有哪些? 方法:1)、A*寻路算法;2)、智能寻路:NavMeshAgent;3)、WayPoint寻路插件



43、游戏中的摄像机的作用是什么?什么情况下需要多个摄像机? 作用:渲染它能照射到的对象; 当需要单独渲染某一层时,需要用到多个摄像机。



44、 什么叫做漫反射贴图,法向贴图,高光贴图,凹凸贴图,环境贴图? 漫反射贴图:表现出物体表面的反射和表面颜色。换句话说,它可以表现出物体被光照射到而显出的颜色和强度。 法线贴图:法线贴图定义了一个表面的倾斜度或者法线。换一种说法,他们改变了我们所看到的表面的倾斜度。法线贴图把空间坐标的参数(X,Y,Z)记录在像素中(R,G,B)。



45、OpenGL 和 DirectX是什么? OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图象(二维的亦可),是一个功能强大,调用方便的底层图形库。 DirectX:由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM,DirectX加强3D图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低了用户安装及设置硬件的复杂度。从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多的意思,从这一点上可以看出DirectX的出现就是为了为众多软件提供直接服务的。



46、 Unity3D中制作关卡地形的技术有哪些? Unity3D手册中介绍了两种地形制作方法:    A.在SceneView中使用height tools直接绘制    B.使用外部工具制作的heightmaps。



47、 Unity3D中动画系统有几种?各自特点是什么?如何配置一个模型的行走动画? Legacy:是老的动画系统,这里就多说了。 Generic:是新的动画系统,它就是支持非人形的动画,建议使用它。但是它不能向Humanoid重定向动画。 Humanoid:就是新的人形重定向动画系统。



48、 协同程序的执行代码是什么?有何用处,有何缺点?



MB
     
     .
     
     StartCoroutine
     
     (
     
     Load
     
     (
     
     path
     
     ,
     
      UA
     
     )
     
     )
     
     ;
     
     

     
     static
     
      
     
     IEnumerator
     
      
     
     Load
     
     (
     
     string
     
      path
     
     ,
     
     UnityAction
     
      _UA
     
     )
     
     
    
     
     {
     
     
        
     
     //加载打包文件
     
     
        
     
     WWW
     
      www 
     
     =
     
      
     
     new
     
      
     
     WWW
     
     (
     
     path
     
     )
     
     ;
     
     

        
     
     //等待加载完成
     
     
        
     
     yield
     
      
     
     return
     
       www
     
     ;



作用:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。 缺点:协同程序并非真线程,可能会发生堵塞。



49、概述序列化 序列化简单理解成把对象转换为容易传输的格式的过程。比如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器端之间传输该对象。



50、概述c#中代理和事件? 代理就是用来定义指向方法的引用。C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器。