Unity 面试题(含答案)

先首先说一下 这个面试的题是转载的 非个人整理 

我个人感觉非常有必要在面试之前大体看一下  并且也建议大家看一下 在应聘之前做好准备

我的个人经历:在面试的时候遇到的题 大多这里都有 事后超后悔 所以自己整理了一下 方便下次面试

整理了一下文档  路径 https://download.csdn.net/download/m0_37583098/10596112

一.如何优化内存? 有很多种方式,例如

  1. 压缩自带类库;
  2. 将暂时不用的以后还需要使用的物体隐藏起来而不是直接 Destroy 掉;
  3. 释放 AssetBundle 占用的资源;
  4. 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
  5. 使用光照贴图,使用多层次细节 (LOD),使用着色器 (Shader),使用预设 (Prefab)。

二.什么是渲染管道?

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

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

1.Resources.Load();

2.AssetBundle

四:什么是协同程序?

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity 的协程实在每帧结束之后去检测 yield 的条件是否满足。

(扩展:一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。

协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多 CPU 的能力。)

五:Unity3D 中的碰撞器和触发器的区别?

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。

当 IsTrigger=false 时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用 OnCollisionEnter/Stay/Exit 函数;

当 IsTrigger=true 时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用 OnTriggerEnter/Stay/Exit 函数。

如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器

(扩展:要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器 (Collider),刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。)

六:物体发生碰撞的必要条件?

两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有 Rigidbody 刚体,而且必须是运动的物体带有 Rigidbody 脚本才能检测到碰撞。

触发信息检测:

1.MonoBehaviour.OnTriggerEnter(Collider collider) 当进入触发器

2.MonoBehaviour.OnTriggerExit(Collider collider) 当退出触发器

3.MonoBehaviour.OnTriggerStay(Collider collider) 当逗留触发器

碰撞信息检测:

1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器

2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器

3.MonoBehaviour.OnCollisionStay(Collision collision)  当逗留碰撞器

当未勾选碰撞器的 Is Trigger 选项时汽车与球体发生碰撞,进入方法 OnCollisionEnter,

落到地上

如果将碰撞器的 Is Trigger 属性选中,再次启动游戏让球体与汽车产生接触,这时进入方法 OnTriggerEnter。之后球体直接穿过汽车,但球体与汽车都没有产生碰撞效果:

七:请简述 ArrayList 和 List 的主要区别?

ArrayList 存在不安全类型(ArrayList 会把所有插入其中的数据都当做 Object 来处理)

装箱拆箱的操作(费时)


List 是接口,ArrayList 是一个实现了该接口的类,可以被实例化

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

  1. 将 Assets 目录和 Library 目录一起迁移
  2. 导出包,export Package
  3. 用 unity 自带的 assets Server 功能

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

Awake –>OnEnableStart,OnEnable 在同一周期中可以反复地发生。

(扩展:OnEnable 对应的有 OnDisable 当对象变为启用和激活时,将调用此函数。)

十:MeshRender 中 material 和 sharedmaterial 的区别?

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

十一:Unity 提供了几种光源,分别是什么

四种。

平行光:Directional Light

点光源:Point Light

聚光灯:Spot Light

区域光源:Area Light

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

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

十三:CharacterController 和 Rigidbody 的区别

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

十四:简述 prefab 的用处

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

十五:请简述 sealed 关键字用在类声明时与函数声明时的作用

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

十六:请简述 private,public,protected,internal 的区别

public:对任何类和成员都公开,无限制访问

private:仅对该类公开

protected:对该类和其派生类公开

internal:只能在包含该类的程序集中访问该类

十七:使用 Unity3d 实现 2d 游戏,有几种方式?

  1. 使用本身的 GUI,在 Unity4.6 以后出现的 UGUI
  2. 把摄像机的 Projection(投影) 值调为 Orthographic(正交投影),不考虑 z 轴;
  3. 使用 2d 插件,如:2DToolKit,和 NGUI

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

三个阶段,1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionExit

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

rigidbody.AddForce/AddForceAtPosition,都在 rigidbody 系列函数中。大家可以自己去查看一下 rigidbody 的 API

AddExplosionForce 对模拟爆炸效果的刚体施加力。

AddForce 向刚体添加力量。

AddForceAtPosition 适用于位置的力量。结果,这将在物体上施加扭矩和力。

AddRelativeForce 相对于其坐标系向刚体添加力。

AddRelativeTorque 相对于其坐标系向刚体添加扭矩。

AddTorque 为刚体增加一个扭矩。

ClosestPointOnBounds 最接近附加碰撞器边界框的点。

GetPointVelocity 全球空间中点世界点处刚体的速度。

GetRelativePointVelocity 相对点处相对于刚体的速度。

二十:什么叫做链条关节?

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

二十一:物体自身旋转使用的函数?

Transform.Rotate()

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

PlayerPrefs.SetInt() PlayerPrefs.GetInt()

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

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

二十四:物理更新一般放在哪个系统函数里?

FixedUpdate,每固定帧绘制时执行一次,和 Update 不同的是 FixedUpdate 是渲染帧执行,FixedUpdate 比较适用于物理引擎的计算,因为是跟每帧渲染有关。

Update 就比较适合做控制。

MonoBehaviour.FixedUpdate 固定更新

MonoBehaviour.update 跟当前平台的帧数有关

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

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

二十六:如何销毁一个 UnityEngine.Object 及其子类?

使用 Destroy() 方法;

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

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

二十八:LOD 是什么,优缺点是什么?

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

二十九:MipMap 是什么,作用?

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

三十:请描述 Interface 与抽象类之间的不同

抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公共只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。

三十一:.Net 与 Mono 的关系?

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

三十二:简述 Unity3D 支持的作为脚本的语言的名称

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

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

组件名称:Transform    父类:Component

三十四:向量的点乘、叉乘以及归一化的意义?

  1. 点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
  2. 叉乘得到的向量垂直于原来的两个向量
  3. 标准化向量:用在只关系方向,不关心大小的时候

三十五:为何大家都在移动设备上寻求 U3D 原生 GUI 的替代方案

不美观,OnGUI 很耗费时间,效率不高,使用不方便

三十六:请简述如何在不同分辨率下保持 UI 的一致性

NGUI 很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的 size。

UGUI 通过锚点和中心点和分辨率也解决这个问题

三十七:什么是 LightMap?

LightMap: 就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。

三十八:Unity 和 cocos2d 的区别

  1. Unity3D 支持 C#、javascript 等,cocos2d-x 支持 c++、Html5、Lua 等。
  2. cocos2d 开源 并且免费
  3. Unity3D 支持 iOS、Android、Flash、Windows、Mac、Wii 等平台的游戏开发,cocos2d-x 支持 iOS、Android、WP 等。

三十九:C# 和 C++ 的区别?

c++ 在设计之初希望提供先进的面向对象特性,同时提供很好的性能。但是为了保证和以往的程序、开发人员的知识兼容,c++ 与 c 语言几乎完全兼容

简单的说:C# 与 C++ 比较的话,最重要的特性就是 C# 是一种完全面向对象的语言,而 C++ 不是,另外 C# 是基于 IL 中间语言和. NET Framework CLR 的,在可移植性,可维护性和强壮性都比 C++ 有很大的改进。C# 的设计目标是用来开发快速稳定可扩展的应用程序,当然也可以通过 Interop 和 Pinvoke 完成一些底层操作。

四十:结构体和类有何区别?

结构体是一种值类型,而类是引用类型。(值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。)那么结构体就是当成值来使用的,类则通过引用来对实际数据操作

四十一:ref 参数和 out 参数是什么?有什么区别?

ref 和 out 参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小。不同点就是输出参数必须对参数进行初始化。

ref 必须初始化,out 参数必须在函数里赋值。ref 参数是引用,out 参数为输出参数。

四十二:C# 的委托是什么?有何用处?

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

四十三:C# 中的排序方式有哪些?

选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序

四十四:射线检测碰撞物的原理是?

射线是 3D 世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。

四十五:Unity 中,照相机的 Clipping Planes 的作用是什么?调整 Near、Fare 两个值时,应该注意什么?

剪裁平面 。从相机到开始渲染和停止渲染之间的距离。

四十六:如何让已经存在的 GameObject 在 LoadLevel 后不被卸载掉?

void Awake(){
 
    DontDestroyOnLoad(transform.gameObject);
 
}

四十七:请简述 GC(垃圾回收)产生的原因,并描述如何避免?

GC 回收堆上的内存

避免:

  1. 减少 new 产生对象的次数
  2. 使用公用的对象(静态成员)
  3. 将 String 换为 StringBuilder

四十八:反射的实现原理?

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

  1. 导入 using System.Reflection;
  2. Assembly.Load(“程序集”) 加载程序集, 返回类型是一个 Assembly
  3. 得到程序集中所有类的名称
foreach (Type type in assembly.GetTypes())
{
   string t = type.Name;、
}
  1. Type type = assembly.GetType(“程序集. 类名”); 获取当前类的类型
  2. Activator.CreateInstance(type); 创建此类型实例
  3. MethodInfo mInfo = type.GetMethod(“方法名”); 获取当前方法
  4. m.Info.Invoke(null, 方法参数);

四十九:简述四元数的作用,四元数对欧拉角的优点?

四元数用于表示旋转

相对欧拉角的优点:

  1. 能进行增量旋转
  2. 避免万向锁(万向锁产生时两个旋转轴平行(旋转面共面)是模型的旋转失去的一个方向的旋转。)(最简单的万向锁 将模型 x 轴旋转 90 度(或者 - 90 度)紧接着旋转 y 轴或者 z 轴)
  3. 给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

五十:移动相机动作在哪个函数里,为什么在这个函数里?

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

五十一:GPU 的工作原理

简而言之,GPU 的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序) 顶点处理:这阶段 GPU 读取描述 3D 图形外观的顶点数据并根据顶点数据确定 3D 图形的形状及位置关系,建立起 3D 图形的骨架。在支持 DX8 和 DX9 规格的 GPU 中,这些工作由硬件实现的 Vertex Shader(定点着色器)完成。 光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。 纹理帖图:顶点单元生成的多边形只构成了 3D 物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成 “真实” 的图形。TMU(Texture mapping unit)即是用来完成此项工作。 像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU 完成对像素的计算和处理,从而确定每个像素的最终属性。在支持 DX8 和 DX9 规格的 GPU 中,这些工作由硬件实现的 Pixel Shader(像素着色器)完成。 最终输出:由 ROP(光栅化引擎)最终完成像素的输出,1 帧渲染完毕后,被送到显存帧缓冲区。

总结:GPU 的工作通俗的来说就是完成 3D 图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。

五十二:重载和重写的区别?

重写 (overriding):子类的方法覆盖父类的方法,要求返回值、方法名和参数都相同。

方法重载 (overloading): 重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,

五十五:请描述游戏动画有哪几种,以及其原理?

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

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

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

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

五十六:alpha blend 工作原理

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

五十七:写出光照计算中的 diffuse 的计算公式

diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射系数、colorLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中 N 与 L 点乘,如果结果小于等于 0,则漫反射为 0。

五十八:两种阴影判断的方法、工作原理。

本影和半影:参考本影和半影

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

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

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

五十九: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 几个过程。

六十:下列代码在运行中会产生几个临时对象?

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

在 C# 中第一行是会报错的(Java 中倒是可行)。

应该这样初始化:

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

答案为:5 个临时对象

六十一:下列代码在运行中会发生什么问题?如何避免?

List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
{
    Console.WriteLine(item * item);
    ls.Remove(item);
}  

产生运行时错误,在 ls.Remove(item) 这行,因为 foreach 是只读的。不能一边遍历一边修改。

六十二:Unity3D 是否支持写成多线程程序?如果支持的话需要注意什么?

仅能从主线程中访问 Unity3D 的组件,对象和 Unity3D 系统调用

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

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

六十三:Unity3D 的协程和 C# 线程之间的区别是什么?

多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问 Unity3D 的对象、组件、方法。

Unity3d 没有多线程的概念,不过 unity 也给我们提供了 StartCoroutine(协同程序)和 LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine 为什么叫协同程序呢,所谓协同,就是当你在 StartCoroutine 的函数体里处理一段代码时,利用 yield 语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。

六十四:矩阵相乘的意义及注意点

用于表示线性变换:旋转、缩放、投影、平移、仿射

注意矩阵的蠕变:误差的积累

六十五:为什么 dynamic font 在 unicode 环境下优于 static font

Unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。

使用动态字体时,Unity 将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。

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

穿透(碰撞检测失败)

六十七:请简述 OnBecameVisible 及 OnBecameInvisible 的发生时机,以及这一对回调函数的意义?

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

六十八:什么叫动态合批?跟静态合批有什么区别?

如果动态物体共用着相同的材质,那么 Unity 会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要你进行额外的操作。

区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。静态批处理:自由度很高,限制很少,缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。

六十九:简述 StringBuilder 和 String 的区别?

String 是字符串常量。

StringBuffer 是字符串变量 ,线程安全。

StringBuilder 是字符串变量,线程不安全。

String 类型是个不可变的对象,当每次对 String 进行改变时都需要生成一个新的 String 对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改 String 对象的地方不要使用 String 类型。

StringBuilder 对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用 StringBuilder 对象。

七十:Unity3D Shader 分哪几种,有什么区别?

表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。

顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与 Unity 的渲染管线完美集成。

固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫 Shader 的时,还可以通过固定功能管线着色器来绘制出一些基本的内容。

七十一:已知 strcpy 函数的原型是:char * strcpy(char * strDest,const char * strSrc); 1. 不调用库函数,实现 strcpy 函数。2. 解释为什么要返回 char *

char * strcpy(char * strDest,const char * strSrc)
{
    if ((strDest==NULL)||(strSrc==NULL))
        throw "Invalid argument(s)";
    char * strDestCopy=strDest;
    while ((*strDest++=*strSrc++)!='\0');
    return strDestCopy;
}

七十二:C# 中四种访问修饰符是哪些?各有什么区别?

  1. 属性修饰符 2. 存取修饰符 3. 类修饰符 4. 成员修饰符。

属性修饰符:

Serializable:按值将对象封送到远程服务器。

STATread:是单线程套间的意思,是一种线程模型。

MATAThread:是多线程套间的意思,也是一种线程模型。

存取修饰符:

public:存取不受限制。

private:只有包含该成员的类可以存取。

internal:只有当前工程可以存取。

protected:只有包含该成员的类以及派生类可以存取。

类修饰符:

abstract:抽象类。指示一个类只能作为其它类的基类。

sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。

成员修饰符:

abstract:指示该方法或属性没有实现。

sealed:密封方法。可以防止在派生类中对该方法的 override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed 修饰符总是和 override 修饰符同时使用。

delegate:委托。用来定义一个函数指针。C# 中的事件驱动是基于 delegate + event 的。

const:指定该成员的值只读不允许修改。

event:声明一个事件。

extern:指示方法在外部实现。

override:重写。对由基类继承成员的新实现。

readonly:指示一个域只能在声明时以及相同类的内部被赋值。

static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。

virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。

new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。

七十三:Heap 与 Stack 有何区别?

1.heap 是堆,stack 是栈。

2.stack 的空间由操作系统自动分配和释放,heap 的空间是手动申请和释放的,heap 常用 new 关键字来分配。

3.stack 空间有限,heap 的空间是很大的自由区。

七十四:值类型和引用类型有何区别?

  1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
  2. 值类型存取速度快,引用类型存取速度慢。
  3. 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
  4. 值类型继承自 System.ValueType,引用类型继承自 System.Object
  5. 栈的内存分配是自动释放;而堆在. NET 中会有 GC 来释放
  6. 值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

七十五:请写出求斐波那契数列任意一位的值得算法

斐波那契数列的规则是  1,1,2,3,5,8,13,21…… 依次类推,用算法计算出第 n 个数字的值。

这里主要要从第三个数字开始看,后面每个数字是前面两个数字之和

static int Fn(int n)
        {
            if (n <= 0)
            {
                throw new ArgumentOutOfRangeException();
            }
            if (n == 1||n==2)
            {
                return 1;
            }
            return checked(Fn(n - 1) + Fn(n - 2)); // when n>46 memory will  overflow
        }

七十六:协同程序的执行代码是什么?有何用处,有何缺点?

function Start() {
 
    // 协同程序 WaitAndPrint 在 Start 函数内执行, 可以视同于它与 Start 函数同步执行.
 
    StartCoroutine(WaitAndPrint(2.0));
 
    print ("Before WaitAndPrint Finishes" + Time.time);
 
}
 
function WaitAndPrint (waitTime : float) {
 
    // 暂停执行 waitTime 秒
 
    yield WaitForSeconds (waitTime);
 
    print ("WaitAndPrint"+ Time.time);
 
}

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

缺点:协同程序并非真线程,可能会发生堵塞。

七十七:什么是里氏代换原则?

里氏替换原则 (Liskov Substitution Principle LSP) 面向对象设计的基本原则之一。通俗点:就是子类对象可以赋值给基类对象,基类对象不能赋值给子类对象

七十八:Mock 和 Stub 有何区别?

Mock 与 Stub 的区别:Mock: 关注行为验证。细粒度的测试,即代码的逻辑,多数情况下用于单元测试。Stub:关注状态验证。粗粒度的测试,在某个依赖系统不存在或者还没实现或者难以测试的情况下使用,例如访问文件系统,数据库连接,远程协议等。

七十九:概述序列化:

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

八十一:概述事件和委托的关系?

委托(delegate):委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用 If-Else(Switch) 语句,同时使得程序具有更好的可扩展性。

事件是一种特殊的委托的实例,或者说是受限制的委托,是委托一种特殊应用,在类的外部只能施加 +=,-= 操作符

八十一:概述 c# 中代理和事件?

代理就是用来定义指向方法的引用。

C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器

八十二:客户端与服务器交互方式有几种?

socket 通常也称作” 套接字”, 实现服务器和客户端之间的物理连接,并进行数据传输,主要有 UDP 和 TCP 两个协议。Socket 处于网络协议的传输层。

http 协议传输的主要有 http 协议 和基于 http 协议的 Soap 协议(web service), 常见的方式是 http 的 post 和 get 请求,web 服务。

八十三:Unity 和 Android 与 iOS 如何交互?

Unity 可以到处 Android 和 iOS 的工程,然后通过安卓或者 iOS 的类去给 Unity 发消息,调用 Unity 中的方法

八十四:如何在 Unity3D 中查看场景的面试,顶点数和 Draw Call 数?如何降低 Draw Call 数?

在 Game 视图右上角点击 Stats。

降低 Draw Call 的技术是 Draw Call Batching

这个在 5.0 以后在 window-》Profiler 下面 

(扩展:DrawCall 是 CPU 调用底层图形接口。比如有上千个物体,每一个的渲染都需要去调用一次底层接口,而每一次的调用 CPU 都需要做很多工作,那么 CPU 必然不堪重负。但是对于 GPU 来说,图形处理的工作量是一样的。所以对 DrawCall 的优化,主要就是为了尽量解放 CPU 在调用图形接口上的开销。所以针对 drawcall 我们主要的思路就是每个物体尽量减少渲染次数,多个物体最好一起渲染。所以,按照这个思路就有了以下几个方案:

使用 Draw Call Batching,也就是描绘调用批处理。Unity 在运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们。具体下面会介绍。

通过把纹理打包成图集来尽量减少材质的使用。尽量少的使用反光啦,阴影啦之类的,因为那会使物体多次渲染。)

八十六:UNITY3d 在移动设备上的一些优化资源的方法

  1. 使用 assetbundle,实现资源分离和共享,将内存控制到 200m 之内,同时也可以实现资源的在线更新
  2. 顶点数对渲染无论是 cpu 还是 gpu 都是压力最大的贡献者,降低顶点数到 8 万以下,fps 稳定到了 30 帧左右
  3. 只使用一盏动态光,不是用阴影,不使用光照探头

粒子系统是 cpu 上的大头

  1. 剪裁粒子系统
  2. 合并同时出现的粒子系统
  3. 自己实现轻量级的粒子系统

animator 也是一个效率奇差的地方

  1. 把不需要跟骨骼动画和动作过渡的地方全部使用 animation,控制骨骼数量在 30 根以下

8.animator 出视野不更新

  1. 删除无意义的 animator

10.animator 的初始化很耗时(粒子上能不能尽量不用 animator)

  1. 除主角外都不要跟骨骼运动 apply root motion
  2. 绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动

NUGI 的代码效率很差,基本上 runtime 的时候对 cpu 的贡献和 render 不相上下

13 每帧递归的计算 finalalpha 改为只有初始化和变动时计算

14 去掉法线计算

15 不要每帧计算 viewsize 和 windowsize

16filldrawcall 时构建顶点缓存使用 array.copy

  1. 代码剪裁:使用 strip level ,使用. net2.0 subset
  2. 尽量减少 smooth group
  3. 给美术定一个严格的经过科学验证的美术标准,并在 U3D 里面配以相应的检查工具

八十七:四元数有什么作用?

对旋转角度进行计算时用到四元数

八十八:将 Camera 组件的 ClearFlags 选项选成 Depth only 是什么意思?有何用处?

如果把摄像机的 ClearFlags 勾选为 Deapth Only, 那么摄像机就会只渲染看得见的对象,把背景会完全透明,这种情况一般用在两个摄像机以上的场景中

八十九:在编辑场景时将 GameObject 设置为 Static 有何作用?

设置游戏对象为 Static 时,这些部分被静态物体挡住而不可见时,将会剔除(或禁用)网格对象。因此,在你的场景中的所有不会动的物体都应该标记为 Static。

九十:有 A 和 B 两组物体,有什么办法能够保证 A 组物体永远比 B 组物体先渲染?

把 A 组物体的渲染对列大于 B 物体的渲染队列,通过 shader 里面的渲染队列来渲染

九十一:将图片的 TextureType 选项分别选为 ““Texture” 和“Sprite”有什么区别

Sprite 作为 UI 精灵使用,Texture 作用模型贴图使用。Sprite 需要 2 的整次幂,打包图片省资源

九十二:问一个 Terrain,分别贴 3 张,4 张,5 张地表贴图,渲染速度有什么区别?为什么?

没有区别,因为不管几张贴图只渲染一次。

九十三:什么是 DrawCall?DrawCall 高了又什么影响?如何降低 DrawCall?

Unity 中,每次引擎准备数据并通知 GPU 的过程称为一次 Draw Call。DrawCall 越高对显卡的消耗就越大。降低 DrawCall 的方法:

  1. Dynamic Batching
  2. Static Batching
  3. 高级特性 Shader 降级为统一的低级特性的 Shader。

九十四:实时点光源的优缺点是什么?

可以有 cookies – 带有 alpha 通道的立方图 (Cubemap) 纹理。点光源是最耗费资源的。

九十五:Unity 的 Shader 中,Blend SrcAlpha OneMinusSrcAlpha 这句话是什么意思?

作用就是 Alpha 混合。公式:最终颜色 = 源颜色 x 源透明值 + 目标颜色 x(1 - 源透明值)

九十六:简述水面倒影的渲染原理

原理就是对水面的贴图纹理进行扰动,以产生波光玲玲的效果。用 shader 可以通过 GPU 在像素级别作扰动,效果细腻,需要的顶点少,速度快

九十七:简述 NGUI 中 Grid 和 Table 的作用?

对 Grid 和 Table 下的子物体进行排序和定位

九十八:请简述 NGUI 中 Panel 和 Anchor 的作用

  1. 只要提供一个 half-pixel 偏移量,它可以让一个控件的位置在 Windows 系统上精确的显示出来(只有这个 Anchor 的子控件会受到影响)
  2. 如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘

3.UIPanel 用来收集和管理它下面所有 widget 的组件。通过 widget 的 geometry 创建实际的 draw call。没有 panel 所有东西都不能够被渲染出来, 你可以把 UIPanel 当做 Renderer

九十九:能用 foreach 遍历访问的对象需要实现 _ 接口或声明 ____ 方法的类型

IEnumerable;GetEnumerator

第二部分

1. 以下哪一个选项不属于 Unity 引擎所支持的视频格式文件(D)

A. 后缀为 mov 的文件

B. 后缀为 mpg 的文件

C. 后缀为 avi 的文件

D. 后缀为 swf 的文件

2.Unity 引擎使用的是左手坐标系还是右手坐标系(A)

A. 左手坐标系

B. 右手坐标系

C. 可以通过 ProjectSetting 切换右手坐标系

 D. 可以通过 Reference 切换左手坐标系

3. 什么是导航网格(NavMesh)(B)

A. 一种用于描述相机轨迹的网格

B. 一种用于实现自动寻址的网格

C. 一种被优化过的物体网格

D. 一种用于物理碰撞的网格

4. 下列选项中有关 Animator 的说法错误的是?(D)

A.Animator 是 Unity 引擎中内置的组件

B. 任何一个具有动画状态机功能的 GameObject 都需要一个 Anim 组件

C. 它主要用于角色行为的设置,包括 StateMachine、混合树 BlendTrees 以及同通过脚本控制的事件

D.Animator 同 Animation 组件的用法是相同的

5.Application.loadLevel 命令为(A)

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

6. 下列选项中,关于 Transform 组件的 Scale 参数描述正确的是(A)

A.Transform 组件的 Scale 参数不会影响 ParticleSystem 产生粒子的大小

B.Transform 组件的 Scale 参数不会影响 GUITexture 的大小

C. 添加 Collider 组件后的 GameoObject,其 Collider 组件的尺寸不受 Transform 组件的 Scale 参数影响

D. 添加 Rigidbody 组件后的物体,大小将不再受 Transform 组件中 Scale 参数的影响

7. 在 Unity 中的场景中创建 Camera 时,默认情况下除了带有 Transform、Camera、GUILayer、Flare Layer 组件之外,还带有以下哪种组件(C)

A.Mouse Look B.FPS Input Controller C.Audio Listener D.Character Motor

8. 如果将一个声音剪辑文件从 Project 视图拖动到 Inspector 视图或者 Scene 视图中的游戏对象上,该游戏对象会自动添加以下哪种组件(C)

A.Audio Listener B.Audio Clip C.Audio Source D.Audio Reverb Zone

9. 下列叙述中有关 Prefab 说法错误的是哪一项(B)

A.Prefab 是一种资源类型

B.Prefab 是一种可以反复使用的游戏对象

C.Prefab 可以多次在场景进行实例

D. 当一个 Prefab 添加到场景中时,也就是创建了它的一个实例

10. 关于 MonoBehaviour.LateUpdate 函数描述错误的是:(B)

A. 当 MonoBehaviour 类被启用后,每帧调用一次

B. 常被用于处理 Rigidbody 的更新

C. 在所有 Update 函数执行后才能被调用

D. 常被用于实现跟随相机效果,且目标物体的位置已经在 Update 函数中被更新

11. 下列哪个函数不属于碰撞事件(C)

A.OnCollisionEnter B.OnCollisionExit

C.OnCollisionUpdate D.OnCollisionStay

12. 以下关于 MonoBehaviour.OnGUI() 的描述错误的是(D)

A. 如果 MonoBehaviour 没有被启用,则 OnGUI 函数不会被调用

B. 用于绘制和处理 GUI events

C. 每帧可能会被绘制多次,每次对应于一个 GUI event

D. 每帧被调用一次

13. 以下哪组摄像机中 Normalized View Port Rect 的数值设置可以使摄像机显示的画面位于 1280*720 分辨率的屏幕画面右上角(D)

A.X=640,Y=360,W=640,H=360

B.X=640,Y=0,W=640,H=360

C.X=0,Y=0,W=0.5,H=0.5

D.X=0.5,Y=0.5,W=0.5,H=0.5

14. 在 Unity 引擎中,Collider 所指的是什么(D)

A.collider 是 Unity 引擎中所支持的一种资源,可用作存储网格信息

B.Collider 是 Unity 引擎中内置的一种组件,可用对网格进行渲染

C.Collider 是 Unity 引擎中所支持的一种资源,可用作游戏对象的坐标转换

D.Collider 是 Unity 引擎中内置的一种组件,可用作游戏对象之间的碰撞检测

15. 以下关于 WWW.LoadFromCacheOrDownload 描述正确的是(C)

A. 可被用于将 Text Assets 自动缓存到本地磁盘

B. 可被用于将 Resource 自动缓存到本地磁盘

C. 可被用于将 Asset Bundles 自动缓存到本地磁盘

D. 可被用于将任意格式的 Unity 资源文件自动缓存到本地磁盘

16. 如何实现加载外部视频并播放?

外部视频文件:目前测试仅支持 ogg 格式(设置网络获取视频时,必须将 MIME 设置. ogg 为 application/octet-stream)

场景设置:MainCamera 上添加 AudioSource 脚本;播放物体上(如 Plane)添加 MovieTest 脚本

MovieTest 脚本:

using UnityEngine;  
using System.Collections;  
 
public class MovieTest : MonoBehaviour  
{  
    // 视频纹理   
    protected MovieTexture movTexture;
    AudioClip audio;
    AudioSource AudioSource1;
 
    void Start()  
    {  
        StartCoroutine(DownLoadMovie());   
    }  
 
    void OnGUI()  
    {  
        if (GUILayout.Button(" 播放 / 继续 "))  
        {  
            // 播放 / 继续播放视频   
            if (!movTexture.isPlaying)  
            {  
                movTexture.Play();  
                AudioSource1.Play();
            }  
        }  
 
        if (GUILayout.Button(" 暂停播放 "))  
        {  
            // 暂停播放   
            movTexture.Pause();  
            AudioSource1.Pause();
        }  
 
        if (GUILayout.Button(" 停止播放 "))  
        {  
            // 停止播放   
            movTexture.Stop();  
            AudioSource1.Stop();
        }  
    }  
 
    IEnumerator DownLoadMovie()  
    {  
        WWW www = new WWW ("http://127.0.0.1/Wildlife.ogg");//"file://" + Application.dataPath + "/Resources/Wildlife.ogg");  
        yield return www;   
        movTexture = www.movie;
        // 获取主相机的声源
        AudioSource1 = Camera.main.GetComponent(typeof(AudioSource)) as AudioSource;
        // 获取视频的声音设置到声源上
        AudioSource1.clip = movTexture.audioClip;
        audio = AudioSource1.clip;
        // 设置当前对象的主纹理为电影纹理   
        renderer.material.mainTexture = movTexture;  
        // 设置电影纹理播放模式为循环
        movTexture.loop = true;
    }  
}

17. 游戏对象 B 是游戏对象 A 的子物体,游戏对象 A 经过了旋转,请写出游戏 B 围绕自身的 Y 轴进行旋转的脚本语句,以及游戏对象 B 围绕世界坐标的 Y 轴旋转的脚本语句。

绕世界坐标旋转:transform.Rotate (transform.up*speed*Time.deltatime);

绕自身 Y 轴旋转:transform.Rotate (Vector.up*speed*Time.deltatime);

18.Unity 中用过哪些插件?具体功能

FXMaker,制作粒子特效;

NGUI,制作 2D 界面;

EasyTouch,摇杆;

shaderForge,制作 shader;

Itween,制作动画;

19. 当删除 Unity 工程 Assets 目录下地 meta 文件时会导致什么?为什么?

会导致在场景中游戏对象看不到,或者报错,材质找不到资源。多人协作的时候会导致资源的重复产生。因为每个资源文件都对应一个. meta 文件,这个. meta 文件中的 guid 就是唯一标识这个资源的。材质就是通过这个 guid 来记录自己使用了那些资源,而且同一个资源的 guid 会因为不同的电脑而不同,所以当你上传了丢失了. meta 文件的资源的时候,到了别人的机器上就会重新产生 guid,那个这个资源就相当于垃圾了。

20. 频繁创建 GameObject 会降低程序性能为什么?怎么解决?

频繁创建游戏对象,会增加游戏的 Drawcall 数,降低帧率,GPU 会一直在渲染绘制。可以通过对象池来管理对象:当需要创建一个游戏对象时,先去对象池中查找一下对象池中是否存在没有被正在使用的对象,如果有的话直接使用这个对象,并把它标记为正在使用,没有话就创建一个,并把它添加到池中,然后标记为使用中。一个游戏对象使用完毕的时候,不要销毁掉,把它放在池中,标记为未使用。

——————————-

21. 关于 Vector3 的 API,以下说法正确的是(BC)

A.Vector3.normalize 可以获取一个三维向量的法线向量

B.Vector3.magnitude 可以获取一个三维向量的长度

C.Vector3.forward 与 Vector3(0,0,1) 是一样的意思

D.Vector3.Dot(向量 A, 向量 B) 是用来计算向量 A 与向量 B 的叉乘

22. 以下哪个函数在游戏进入新场景后会被马上调用(B)

A.MonoBehaviour.OnSceneWastLoaded()

B.MonoBehaviour.OnSceneEnter()

C.MonoBehaviour.OnLevelEnter()

D.MonoBehaviour.OnLevelWastLoaded()

23. 采用 Input.mousePosition 来获取鼠标在屏幕上的位置,以下表达正确的是(C)

A. 左上角为原点(0,0),右下角为(Screen.Width, Screen.Height)

B. 左下角为原点(0,0),右下角为(Screen.Height, Screen.Width)

C. 左下角为原点(0,0),右上角为(Screen.Width, Screen.Height)

D. 左上角为原点(0,0),右下角为(Screen.Height, Screen.Width)

24. 如何通过脚本来删除其自身对应的 Gameobject(A)

A.Destroy(gameObject) B.this.Destroy()

C.Destroy(this) D. 其他三项都可以

25. 某个 GameObject 有一个名为 MyScript 的脚本,该脚本中有一个名为 DoSomething 的函数,则如何在该 Gameobject 的另外一个脚本中调用该函数?(A)

A.GetComponent().DoSomething()

B.GetComponent

C.GetComponent().Call(“DoSomething”)

D.GetComponent

26.Animator.CrossFade 命令作用是:(B)

A. 动画放大 B. 动画转换 C.Update() D.OnMouseButton()

27.OnEnable,Awake,Start 运行时的发生顺序?(A)

A.AwakeOnEnableStart B.AwakeStartOnEable

C.OnEnable-AwakeStart D.StartOnEnableAwake

28. 以下选项中,正确的是(D)

A.Mathf.Round 方法作用是限制 B.Mathf.Clamp 方法作用是插值

C.Mathf.Lerp 方法作用是四舍五入 D.Mathf.Abs 方法作用是取得绝对值

29. 以下选项中,将游戏对象绕 Z 轴逆时针旋转 90 度(C)

A.transform.rotation = Quaternion.Euler(0,0,90)

B.transform.rotation = Quaternion.Angle(0,0,90)

C.transform.Rotate(new Vector3(0,0,90))

D.transform.Rotate(new Vector3(90,0,0))

30.public static function InitializeServer (connections :int,listenPort:int,useNat:bool):NetworkConnectionError 解释一下函数,参数以及返回值的意思。

初始化服务器。connections 是允许的入站连接或玩家的数量,listenPort 是要监听的端口,useNat 设置 NAT 穿透功能。如果你想要这个服务器能够接受连接使用 NAT 穿透,使用 facilitator,设置这个为 true。如果有错误会有返回错误。

31. 请写出以下函数的含义和运算结果

delegate b Func<a, b>(a a1);

static void Main(string[] args)

{

    Func<int, bool> mFunc = x x == 5;

    Console.WriteLine(mFunc(6));

}

false,就是定义一个 delegate,返回值类型为 b,有一个参数,类型为 a。

32. 编写一个函数,输入一个 32 位整数,计算这个整数有多少个 bit 为 1.

uint BitCount (uint n)

{

    uint c = 0; // 计数器

    while (n> 0) {

        if ((n & 1) == 1) // 当前位是 1

            ++c; // 计数器加 1

        n >>= 1; // 移位

    }

    return c;

}

  1. 某游戏中的装备系统有 16 种附加属性,每种附加属性使用一个 32 位的 ID 表示 (比如 10001 表示加人物 hp 的附加属性,10002 表示加人物 mp 的附加属性),一件装备做多有 4 个附加属性,请写一个程序输出所有附加属性的组合。

(16 个属性 4 配对 有多少情况)

16 中任意选 4 个数排列成 4 位数, 共有 A(16,4)=161514*13

34. 请实现如下函数,在 Unity 中有一副骨骼树,请使用递归方式与非递归方式实现先序遍历,在 Unity 的 Console 输出所有骨骼名。

可能用到的函数

public Transform GetChild(int index);

public int Transform.childCount

public void OutputTree(Transform root)

{

}

36.32 位整数 256 和 255 按位异或后的结果是(511 解:1 异或****任何数都等于 1**)**

37.unix/linux 系统将所有的 I/O 设备模型化为文件, c 语言中的(stdin),(stdout) 和 (stderr) 分别表示 标准输入,标准输出,标准错误。

38.k 层二叉树最多有 2^k - 1 个结点。

  1. 中缀算式 (8 + x*y)-2x/3 的后缀算式是 _。
  2. 对以下二叉树进行前序遍历的结果是(ABDGCEHF 解二又树前序遍历是指;先左下后右上)
  3. 写出一个 C 类 ip 地址(192.168.1.105), 该 ip 地址一个合法的网格掩码是(255.255.255.224).

42.c/c++ 程序运行时有堆内存与栈内存之分,请写一个语句在堆中分配一个整数:(int a = new int(4)), 在栈内存中分配一个整数:(int a = 5)。

  1. 简述从 C/C++ 源代码生成可执行文件所经历的几个过程和每个过程中所做的事情。

预编译 -》编译 -》链接 -》执行

44. 简述 TCP 建立连接的过程,最好能画出时序图。

三次握手;

45. 有一个 c 语言函数

unsigned int getN(unsigned int v){

    v—;

    v |= v >> 1;

    v |= v >> 2;

    v |= v >> 4;

    v |= v >> 8;

    v |= v >> 16;

    v++;

    return v;

}

请问这个函数的功能是什么?

返回的结果是 v 或者 2 ^ 跟下 v 次方 + 1(比如 125 返回 128,128 返回的就是 128)

46. 列出 c 语言中 static 关键字的用法。

static 关键字至少有下列几个作用:

(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量。

47. 解释一下 Unity3D 中的协程(coroutine)是什么?并举例说明

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity 的协程实在每帧结束之后去检测 yield 的条件是否满足。

48. 物体自旋转使用的函数叫什么?物体绕某点旋转使用函数叫什么?

物体自旋转函数 transform.Rotate,物体绕某点旋转函数:transform.RotateAround

49. 使用 prefab 预制物体有什么好处?

1.Prefab 一个重要的优势就是编辑 prefab 资源后,场景中所有使用 Prefab 克隆的游戏对象将全部使用新编辑的资源,无需一个一个的给场景中的对象赋值。

  1. 当游戏中需要频繁创建一个物体时,使用 Prefab 能够节省内存。
  2. 当你在一个场景中增加一个 Prefabs,你就实例化了一个 Prefabs。
  3. 设有如下关系表 R1 和 R2

R1(NO, NAME, SEX, AGE, CLASS)

R2(NO, SUBJECT, SCORE)

主关键字是 NO, 其中 NO 为学号,NAME 为姓名,SEX 为性别,AGE 为年龄,CLASS 为班号,SUBJECT 为科目,SCORE 为成绩。写出实现下列功能的 SQL 语句。查找学号为 20 的学生的姓名,科目,成绩。

SELECT NAME,SUBJECT,SCORE FORM R1 INNER JOIN R2 ON R1.NO=R2.NO WHERE R1.NO = 20

  1. 如果在脚本的 Awake()函数中,调用了 this.gameObject.AddComponent()(PS:GameController 为另一个继承 Mono 的脚本类),请问此时脚本函数的调用顺序是否发生变化?

53.if(go.CompareTag(“Enemy”)) 和 if(go.tag == “Enemy”)两种判断方法哪种是合适的,为什么?

第一种合适,因为第二种会占用更多内存。

54.DestroyImmediate 和 Destroy 的区别是?

DestroyImmeditate 销毁对象的时候,会立即释放资源。Destroy 只是从该场景销毁,但是还在内存当中。

55. 详细说明 Unity 中资源加载的方法,以及他们的区别?

  1. 通过 Resources 模块,调用它的 load 函数:可以直接 load 并返回某个类型的 Object,前提是要把这个资源放在 Resource 命名的文件夹下,Unity 不关有没有场景引用,都会将其全部打入到安装包中。
  2. 通过 bundle 的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用 WWW 模块 get 下来,然后从这个 bundle 中 load 某个 object。
  3. 以下函数的功能是计算斐波那契数列的第 n 项,请填空

int func(int n)

{

    if(n2) return 1;

    return n + func(n-1);

}

59.C 语言中宏定义中若有多行,可以使用字符(\).

60.C 语言中 32 位整数能表达的最小的数是 - 2^31~2^31-1.

  1. 使用(点乘)向量运算可以很方便地计算出三维空间中两个单位向量之间夹角的 cos 值。
  2. 类 unix 系统中某文件的权限为:drw-r–r–,用八进制数值形式表示该权限为 (411), 首位 d 代表目录(文件夹)
  3. 若有如下程序段,其中 s,a,b,c 均已定义为整型变量,且 a,c 均已赋值(c 大于 0)

s = a;

for(b = 1; b c; b++)

    s = s + 1;

则与上述程序段功能等价的赋值语句是(B)

A.s = a + b B.s = a + c C.s = s + c D.s = b + c

64. 简述 static 和 const 关键字的作用

static 关键字至少有下列几个作用:

(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量。

const 关键字至少有下列几个作用:

(1)欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;

(2)对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;

(3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

(4)对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;

(5)对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为 “左值”。

65. 用你熟悉的语言及你认为最简洁的方法书写计算 s = 1!+2!+3!+…+num! 的代码。num 为输入,s 为输出。(!代表阶乘 3!= 1 * 2 * 3

Console.ReadLine(num)

int s = 0;

for(int i = 1; i num; i++)

{

    s += JieCheng(num);

}

public int JieCheng(int num)

{

    if(num < 0)

    {

        Console.WriteLine(“error”);

        return;

    }

    if(num 1)

    {

        return 1;

    }

    else {

        return num * JieCheng(num - 1)

    }

}

  1. 用你熟悉的语言从一个字符串中去掉相连的重复字符,例如原字符串 “adffjkljaalkjhl” 变为“adfjkljalkjhl”

int GetResult(char[] input, char[] output)  

{  

    int i, j, k = 0;  

    int flag;  

    int length;  

    if(input NULL || output NULL)  

    {  

        return -1;  

    }  

    length=strlen(input);// 求数组的长度  

    for(i = 0; i<length; i++)  

    {  

        flag = 1;  

        for(j = 0; j < i; j++)  

        {  

            if(output[j] == input [i])  

            flag = 0;  

        }  

        if(flag)  

        output[k++] = input[i];  

    }  

    printf(” 最终的字符串为:”);  

    output[k] = ‘\0’;  

    for(int m = 0; m < output.Length; m++)

    {

        print (output [m]);

    }

    return 0;  

}  

第三部分

  1. 哪种实时光源是 Unity 中没有的?(D)

A. 点光源 B. 方向光 C. 聚光灯 D. 日光灯

  1. 如何在 Unity 中创建地形系统?(D)

A.TerrainCreate Terrain B.ComponentCreate Terrain

C.AssetCreate Terrain D.WindowsCreate Terrain

  1. 以下哪种操作步骤可以在场景中添加 “Wind Zone”?(B)

A.TerrainWind Zone B.GameObjectCreate otherWind Zone

C.ComponentPhysicsWind Zone D.AssetsCreateWind Zone

  1. 在 Unity 编辑器中创建一个 Directional Light,以下步骤正确的是?(B)

A.EditRendering SettingDirectional Light

B.GameObjectCreate OtherDirectional Light

C.ComponentRenderingDirectional Light

D.AssetsDirectional Light

  1. 下列哪一项不属于 Camera 中的 “Clear Flags”?(D)

A.Skybox B.Solid Color C.Depth Only D.Background

  1. 以下哪种脚本语言是 Unity 编辑器所不支持的?(D)

A.Javascript B.C# C.Boo D.Perl

  1. 对于 Prefab,以下说法错误的是?(D)

A.Prefab 资源可以在项目中多次重复使用

B. 由 Prefab 实例出的 GameObject,其在 Hierarchy 试图中表现为蓝色

C.Prefab 上的组件信息一经改变,其实例出的 GameObject 也会自动改变

D. 实例出的 GameObject 上的组件信息一经改变,其对应出的 Prefab 也会自动改变

  1. 下面哪种做法可以打开 Unity 的 Asset Store?(A)

A.WindowsAsset Store

B.EditAsset Store

C.FileAsset Store

D.AssetsAsset Store

  1. 在哪个面板中可以修改物体的空间属性,如位置,朝向,大小等(B)

A.Project B.Inspector C.Hierarchy D.Toolbar

  1. 如何为一个 Asset 资源设定一个 Label,从而能够方便准确的搜索到?(D)

A. 在 Project 窗口中选中一个 Asset,右键 CreateLabel

B. 在 Project 窗口中选中一个 Asset,右键 Add Label

C. 在 Project 窗口中选中一个 Asset,在 Inspector 窗口中点击添加 Label 的图标

D. 在 Project 窗口中选中一个 Asset,在 Inspector 窗口中点击按钮 “Add Label”

11.Mecanim 系统中,Body Mask 的作用是?(D)

A 指定身体的某一部分是否参与骨骼动画

B. 指定身体的某一部分是否参与物理模拟

C. 指定身体的某一部分是否可以输出骨骼信息

D. 指定身体的某一部分是否参与渲染

  1. 以下哪种操作步骤可以打开 Unity 编辑器的 Lightmapping 视图?(C)

A.FileLightmapping B.AssetsLightmapping

C.WindowsLightmapping D.ComponentLightmapping

  1. 下列关于光照贴图,说法错误的是?(C)

A. 使用光照贴图比使用实时光源渲染要快

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

C. 可以增加场景真实感

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

  1. 如何为物体添加光照贴图所使用的 UV?(B)

A. 不用添加,任何时候都会自动生成

B. 更改物体导入设置,勾选 “Generate Lighting UVs”

C. 更改物体导入设置,勾选 “Swap UVs”

D. 更改物体导入设置,在 UVs 选项中选择 “Use Lightmaps”

  1. 在哪个模块下可以修改 Render Path?(A)

A.Camera B.Light C.Render Settings D.Project SettingQuality

  1. 以下哪项技术下不是目前 Unity 所支持的 Occlusion Culling 技术?(D)

A.PVS only B.PVS and dynamic objets

C.Automatic Portal Generation D.Dynamic Only

  1. 关于 Vector3 的 API,以下说法正确的是?(C)

A.Vector3.normalize 可以获取一个三维向量的法线向量

B.Vector3.magnitude 可以获取一个三维向量的长度

C.Vector3.forward 与 Vector3(0,0,1)是一样的

D.Vector3.Dot(向量 A,向量 B) 是用来计算向量 A 与向量 B 的叉乘

  1. 下列那些选项不是网格层属性的固有选项?(B)

A.Default B.Walkable C.Not Walkable D.Jump