面试题

一、 C#语言

1. 重载和重写的区别

1) 所处位置不同 重载在同类中 重写在父子类中

2) 定义方式不同 重载方法名相同 参数列表不同 重写方法名和参数列表都相同

3) 调用方式不同 重载使用相同对象以不同参数调用 重写用不同对象以相同参数调用

4) 多态时机不同 重载时编译时多态 重写是运行时多态

2. 面向对象的三大特点

封装、继承、多态

1.继承: 提高代码重用度,增强软件可维护性的重要手段,符合开闭原则。

2.封装: 封装是将数据和行为相结合,通过行为约束代码修改数据的程度,增强数据的安全性,属性是C#封装实现的最好体现。

3.多态性: 多态性是指同名的方法在不同环境下,自适应的反应出不同得表现,是方法动态展示的重要手段。

3. 简述值类型和引用类型有什么区别

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

是堆中存放的地址。

2.值类型存取快,引用类型存取慢。

3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。

4.栈的内存是自动释放的,堆内存是.NET 中会由 GC 来自动释放。

5.值类型继承自 System.ValueType,引用类型继承自 System.Object

4. 请简述privatepublicprotectedinternal的区别

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

private:仅对该类公开

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

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

protected internalprotected + internal

5. C#中所有引用类型的基类是什么

引用类型的基类是 System.Object 值类型的基类是 System.ValueType

同时,值类型也隐式继承自 System.Object

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

ArrayList 不带泛型 数据类型丢失

List 带泛型 数据类型不丢失

ArrayList需要装箱拆箱 List不需要

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

GC 为了避免内存溢出而产生的回收机制

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

2)使用公用的对象(静态成员)

3)将 String 换为 StringBuilder

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

1.接口不是类 不能实例化 抽象类可以间接实例化

2.接口是完全抽象 抽象类为部分抽象

3.接口可以多继承 抽象类是单继承

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

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

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

忽略错误的话:

1."abc"

2.a.ToUpper()

3."123"

4.a.ToUpper()+"123"

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

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

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

类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。

12. 反射的实现原理?

可以在加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息

反射即在运行期动态获取类、对象、方法、对象数据等的一种重要手段

主要使用的类库:System.Reflection

核心类:

1.Assembly描述了程序集

2.Type描述了类这种类型

3.ConstructorInfo描述了构造函数

4.MethodInfo描述了所有的方法

5.FieldInfo描述了类的字段

6.PropertyInfo描述类的属性

通过以上核心类可在运行时动态获取程序集中的类,并执行类构造产生类对象,动态获取对象的字段或属性值,更可以动态执行类方法和实例方法等。

13.  .Net 与 Mono 的关系?

.Net是一个语言平台,Mono.Net提供集成开发环境,集成并实现了.NET的编译器、CLR 和基础类库,使得.Net既可以运行在windows也可以运行于 linuxUnixMac OS 等。

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

构造函数格式为 public+类名如果加上 static 会报错(静态构造函数不能有访问修饰符)

原因:静态构造函数不允许访问修饰符,也不接受任何参数;无论创建多少类型的对象,静态构造函数只执行一次;运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;静态构造函数执行先于任何实例级别的构造函数;显然也就无法使用 this 和 base 来调用构造函数。

15. C# String 类型比 stringBuilder 类型的优势是什么?

如果是处理字符串的话,用 string 中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而 stringBuilder 是在原来的内存里对字符串进行修改,所以在字符串处理

方面还是建议用 stringBuilder 这样比较节约内存。但是 string 类的方法和功能仍然还是比 stringBuilder 类要强。

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

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

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

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

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

StringBuilder 可变,非线程同步。

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

(a,b) => {};

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

public int CountNumber(int num) {

       if (num == 1 || num == 2) {

           return 1;

       } else {

           return CountNumber(num -1) + CountNumber(num-2); 

       } 

  }

18. 冒泡排序(手写代码)

public static void BubblingSort(int[]array) {

      for (int i = 0; i < array.Length; i++){

          for (int j = array.Length - 1; j > 0; j--){

              if (array[j] < array[i]) {

                  int temp = array[j];

                  array[j] = array[j-1];

                  array[j - 1] = temp;

              }

          }

      }

  }

19. C#中有哪些常用的容器类,各有什么特点。

List,HashTable,Dictionary,Stack,Queue

List:索引泛型容器 访问速度快 修改速度慢

HashTable/Dictionary:散列表格式 查询效率高 空间占用较大

Stack:后进先出

Queue: 先进先出

20. C#中常规容器和泛型容器有什么区别,哪种效率高?

不带泛型的容器需要装箱和拆箱操作 速度慢 所以泛型容器效率更高 数据类型更安全

21. 有哪些常见的数值类?

简单值类型--包括 整数类型、实数类型、字符类型、布尔类型

复合值类型--包括 结构类型、枚举类型

22. C#中委托和接口有什么区别?各用在什么场合?

接口(interface)是约束类应该具备的功能集合,约束了类应该具备的功能,使类从千变万化的具体逻辑中解脱出来,便于类的管理和扩展,同时又合理解决了类的单继承问题。 

C#中的委托是约束方法集合的一个类,可以便捷的使用委托对这个方法集合进行操作。

在以下情况中使用接口:

1.无法使用继承的场合

2.完全抽象的场合

3.多人协作的场合

以上等等

在以下情况中使用委托:多用于事件处理中

23. C#unsafe关键字是用来做什么的?什么场合下使用?

非托管代码才需要这个关键字 一般用在带指针操作的场合

24. C#refout关键字有什么区别?

ref修饰参数,表示进行引用传递,out修饰参数也表示进行引用传递,但传递的引用只为带回返回值 ref又进又出 out不进只出

25. ForforeachEnumerator.MoveNext的使用,与内存消耗情况

for 循环可以通过索引依次进行遍历,foreachEnumerator.MoveNext通过迭代的方式进行遍历。内存消耗上本质上并没有太大的区别。但是在Unity中的Update中,一般不推荐使用foreach 因为会遗留内存垃圾。

26. 函数中多次使用string+=处理,会产生大量内存垃圾(垃圾碎片),有什么好的方法可以解决。

通过StringBuilder那进行append,这样可以减少内存垃圾

27. 当需要频繁创建使用某个对象时,有什么好的程序设计方案来节省内存?

设计单例模式进行创建对象或者使用对象池

28. JIT AOT区别

Just-In-Time - 实时编译

执行慢 安装快 占空间小一点

Ahead-Of-Time - 预先编译

执行快 安装慢 占内存占外存大

29. 给定一个存放参数的数组,重新排列数组

void SortArray(Array arr){Array.Sort(arr);}

30. Foreach循环迭代时,若把其中的某个元素删除,程序报错,怎么找到那个元素?以及具体怎么处理这种情况?(注:Try.....Catch捕捉异常,发送信息不可行)

foreach 不能进行元素的删除,因为迭代器会锁定迭代的集合,解决方法:记录找到索引或者key值,迭代结束后再进行删除。

31. GameObject a=new GameObject()  GameObject b=a  实例化出来了A,将A赋给B,现在将B删除,问A还存在吗?

存在,b删除只是将它在栈中的内存删除,而A对象本身是在堆中,所以A还存在

32. 你拥有A块钱,一瓶水B块钱,每瓶水可以得到一个瓶盖,每C个瓶盖可以换一瓶水请写出函数求解上面题目,上面题目ABC为参数

public static int Buy(int a,int b,int c) {

    return a/b + ForCap(c,a/b);

}

public static int ForCap(int c,int d) {

    if (d

    return 0;

    } else {

    return d/c + ForCap(c,d/c + d%c);

    }

}

33. 有一排开关,第一个人把所有的开关打开,第二个人按2的倍数的开关,第三个人按3的倍数的开关,以此类推,现在又n个开关,k个人,写函数求最后等两者的开关,输入参数nk

static void Main(string[] args) {

       int n = int.Parse(Console.ReadLine());

       int k = int.Parse(Console.ReadLine());

       Function(100,100);

  }

  static void Function(int n, int k) {

       int i, j = 0;

       bool[] a = new bool[1000]; //初始false:关灯,true:开灯 

       for (i = 1; i <= k; i++)      //k个人

           for (j = 1; j <= n; j++)  //n个灯

               if (j % i == 0)

                   a[j] = !a[j]; //取反,falsetrue,原来开变关,关变开

           for (i = 1; i <= n; i++) //最后输出a[i]的值就可以了

               if (a[i]) //灯亮着

                   Console.WriteLine(i);

}

34. 数制转换,将任意整数转换成8进制形式

static void Main(string[] args) {

      int n;

      n =int.Parse(Console.ReadLine());

      Console.WriteLine("输入的10进制为:{0}",n);

      Console.Write("转换为8进制数为: "); 

      d2o(n);

}

static void d2o(int n) {

     if (n > 7) {

          d2o(n / 8);

     } 

     Console.Write(n%8);

}

35. 找出200以内的素数。

static void Main(string[] args) {

    int count = 0;

    for (int i = 1; i < 200; i++) {  //外层循环:要判断的数

        for (int j = 2; j <=i; j++){

            if (i % j == 0&& i!=j) {

                 break;

             }

             if (j == i ) {  //结束的条件:最后一个数还没有被整除 

                  count++;

                  Console.WriteLine(i);

             }

        }

    }

    Console.WriteLine(count);

}

36. 打印杨辉三角形

public static void YHSJ(){

    int [][]a= new int[7][] ;

    a[0] = new int[1];  //a[0][0]=1; 

    a[1] = new int[2] ;

    for (int i = 0; i < 7; i++) {

        a[i] = new int[i+1] ;  

        a[i][0] =1;

        a[i][i]=1;

        if(i>1) {  //求出中间的数据

    for(int j=1;j

                a[i][j]= a[i-1][j-1]+a[i-1][j];

            }

        }

     }

     for (int i=0; i

         for (int k = 0; k < a.Length-1-i; k++) {

             Console.Write("");

         }

         for(int j=0;j

             Console.Write(a[i][j] + "");

         }

         Console.WriteLine();

     }

}

37. 中国有句俗话“三天打鱼两天晒网”,某人从200011日起开始“三天打鱼两天晒网”,问这个人在今后的某天中“打鱼”还是”晒网”

public static void Compute(){

   Console.WriteLine ((DateTime.Now - DateTime.Parse("2000-01-01")).Days%5<3?"打鱼":"晒网");

}

38. 假设当前市场价一只鸡10元,一只鸭125角。请写一个函数ShowPrice,输入参数分别为鸡和鸭的个数(非负整型),功能为显示出总价钱,精确到分。例如调用ShowPrice5,10)后输出175.00。请注意程序的可读性和易于维护性。

static void ShowPrice(int num_chicken, int num_duck)  {

      float totalPrice = 0.00f;

      float price_chicken = 10f;

      float price_duck = 12.5f;

      totalPrice = num_chicken * price_chicken + num_duck * price_duck;

      Console.WriteLine("总价钱为:{0:0.00}", totalPrice);

  }

39. 请写一个函数,用于返回n!(阶乘)结果末尾连续0的个数,如GetZeroCount5)返回1,因为5! = 120,末尾连续10

    static void Main(string[] args) {

        int fac = Factorial(5);

        Console.WriteLine(CountZero(fac));

    }

    public static int Factorial(int n) {

        if (n == 1) {

            return 1;

        } else {

            return n * jiecheng(n - 1);

        } 

    }

    //求连续的0的个数

    public static int CountZero(int num) {

        int result = 0; // 最后的结果

        String numStr = num.ToString();

        for (int i = numStr.Length - 1; i >= 0; i--) {

            if (numStr[i] == '0') {

               result ++;

            } else {

                break;

            }

        }

        return result;

    }

二、 Unity编辑器基础

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

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

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

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

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

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

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

42. GUIUGUI的优点和缺点

GUI不方便控制,UGUI所见即所得,方便控制。GUI使用在生命周期函数OnGUI中使用,脚本来书写控制。UGUI使用Canvas画布和事件系统。UGUI适应屏幕上比GUI简单。

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

实际看到的画面由多个 camera 的画面组成,由 depthClear FlagCulling Mask 都会影响最终合成效果。

44. 使用过哪些第三方插件?

一、界面制作 推荐:NGUI

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

三、可视化编程 推荐:PlayMaker

四、插值插件 推荐:iTween,HOTween

五、路径搜寻 推荐:Simple Path

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

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

八、摄像机管理 推荐:Security Camera

九、资源包 推荐:Nature Pack

十、造路插件 EasyRoads3D

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

Transform 父类是 Component

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

不美观,OnGUI 很耗费时间,使用不方便 ,DrawCall

47. 请简述如何在不同分辨率下保持 UI 的一致性

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

48. 为什么 dynamic font 在 unicode 环境下优于 static font

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

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

Mesh 就是指模型的网格(同名组件是用于调整网格属性的),MeshFilter 一般是用于获得模型网格的组件,而 MeshRender 是用于把网格渲染出来的组件

50. 简述 SkinnedMesh 的实现原理

Skinned Mesh 中文一般称作骨骼蒙皮动画.这种动画中包含骨骼( Bone )和蒙皮 (Skinned Mesh) 两个部分, Bone 的层次结构和关节动画类似, Mesh 则和关节动画不同:关节动画中是使用多个分散的 Mesh, 而 Skinned Mesh 中 Mesh 是一个整体,也就是说只有一个 Mesh, 实际上如果没有骨骼让 Mesh 运动变形, Mesh 就和静态模型一样了。Skinned Mesh 技术的精华在于蒙皮,所谓的皮并不是模型的贴图。而是 Mesh 本身,蒙皮是指将 Mesh 中的顶点附着(绑定)在骨骼之上,而且每个顶点可以被多个骨骼所控制,这样在关节处的顶点由于同时受到父子骨骼的拉扯而改变位置就消除了裂缝。可以理解为具有蒙皮信息的 Mesh 或可当做皮肤用的 Mesh ,这个皮肤就是 Mesh 。而为了有皮肤功能, Mesh 还需要蒙皮信息,即 Skin 数据,没有 Skin 数据就是一个普通的静态 Mesh 了。 Skin 数据决定顶点如何绑定到骨骼上。顶点的 Skin 数据包括顶点受哪些骨骼影响以及这些骨骼影响该顶点时的权重 (weight) ,另外对于每块骨骼还需要骨骼偏移矩阵 (BoneOffsetMatrix) 用来将顶点从 Mesh 空间变换到骨骼空间。

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

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

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

Destory

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

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

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

Meshcollider 是基于顶点的。建议还是用 boxcolliderboxcollider 本身是基于算法,没有面的概念。

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

穿透(碰撞检测失败)(碰撞体变大,FixedUpdate, 代码限制)

56. MeshRender 中 material 和 sharedmaterial 的区别?

修改 sharedMaterial 将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。

不推荐修改由 sharedMaterial 返回的材质。如果你想修改渲染器的材质,使用 material替代。

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

1.利用引擎自带的 GUI2D系统

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

3.利用第三方插件:NGUI2dToolkit

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

collider 碰撞器会有碰撞的效果,IsTrigger = false, 可以调用OnCollisionEnter/Stay/Exit 函数trigger 触发器没有碰撞效果, isTrigger = true,可以调用 OnTriggerEnter/stay/exit 函数

59. CharacterController 和 Rigidbody 的区别

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

60. 什么叫做链条关节

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

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

平行光:Directional Light

聚光灯:Spot Light

点光源:Point Light

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

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

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

方法 2,导出包

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

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

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

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

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

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

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

64. 动画层(Animation Layers)的作用是什么?

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

65. Material 和 Physic Material 区别?

PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。Material 材质(材质类)为了获得一个对象使用的材质,可以使用 Renderer.materia 属性

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

一种用于实现自动寻路的网格

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

Anchor 包含 UIAnchor 脚本。 UIAnchor 的功能是把对象锚定在屏幕的边缘 (左上, 左中,左下,上,中,下,右上,右中,右下),或缩放物体使其匹配屏幕的尺寸

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

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

perspective透视摄像机和orthographic正交摄像机

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

LayerMask 的使用是按位操作的,LayerMask.NameToLayer(“Players”) 返回该 Layer的编号。

70. NGUIUGUI的优点和缺点

1) NGUI还保留着图集,需要进行图集的维护。而UGUI没有图集的概念,可以充分利用资源,避免重复资源。

2) UGUI出现了锚点的概念,更方便屏幕自适应。 

3) NGUI支持图文混排,UGUI暂未发现支持此功能。 

4) UGUI没有 UIWrap 来循环 scrollview 内容。

5) UGUI暂时没有集成Tween组件。 

71. 是否熟悉UGUI

熟悉,之前在一些项目用UGUI做过界面,和NGUI很相似。

72. 会写插件么?

了解过,但在公司这块用的比较少,没怎么写过,不过我能很快学会。

73. UGUINGUI的区别?为什么不使用NGUI

1uGUICanvas 有世界坐标和屏幕坐标,NGUI2D3D区别。

2uGUIImage可以使用material

3UGUI通过Mask来裁剪,而NGUI通过PanelClip

4NGUI的渲染前后顺序是通过WidgetDepth,而UGUI渲染顺序根据Hierarchy的顺序,越下面渲染在顶层。

  1) UGUI 不需要绑定CollidersUI可以自动拦截事件。

  2) UGUIAnchor是相对父对象,没有提供高级选项,个人感觉uGUIAnchor操作起来比NGUI更方便

7UGUI没有Atlas一说,使用Sprite Packer

8UGUINavgationScene中能可视化。

9UGUI的事件需要实现事件系统的接口,但写起来也算简单。

10NGUI功能更丰富一些

之所以不用NGUI是因为UGUIUnity官方推出的,慢慢会成为制作UI的主要工具,配套的插件也越来越多,但是具体使用NGUI还是UGUI还要看公司这边,因为这两个我都用过一段时间。

74. UI用的是NGUI还是UGUI

两个都用过。之前用的NGUI后来用了UGUI

75. Unity3dstatic batchingdynamic batching 各有什么用?

Dynamic Batching不需要任何操作,只要共享材质(即使是不同的Mesh模型也可以),就会自动被合并。可以自由移动旋转。但有以下使用要求:

(1) 模型文件共计点数不超过900。(重复使用同一个Mesh不计)

(2) 单个物体可以不超过300点,Shader可以有法线UV。 但如果Shader使用了 UV0 UV1两套UV,或者Tangent切线的话,单个物体只能不超过180

(3)游戏对象使用相同模型和材质时,只有相同缩放(xyz等比缩放,浮点尾数可以有细微差)的会被合并。如

111)与(111

222)与(222

0.50.50.5)与 (0.50.50.5

2,2,2)与(2,22.0001

(4)场景烘焙:烘焙后同材质将不会被烘焙。lightmap 有隐藏的材质参数:offset/scale, 所以使用lightmap的物体不会被合并

(5)Shader不能使用多Pass:PassShader会破坏Dynamic Batching

Static Batching

原理:运行游戏后将一组游戏对象的多个模型会被动态合并为1个。这组游戏对象所有使用同一材质的在一个DrawCall来完成。这些游戏对象运行后无法移动缩放旋转。但是Drawcall一定是最大化合并的,并且不受动态合并的诸多限制(见下文详述)。

注意:即使物体都使用了同样的模型,在batch后每一个物体都会创建一份模型对应的geometry,在新的Combined Mesh里。所以过多的batch会增加内存占用。例如场景里的树群就不适合Static Batch,而适合动态合并。

实现方法:

(1)MeshRenderer勾选Batching Static: 勾了即可

(2)代码中使用UnityEngine.StaticBatchingUtility实现(可以在任何平台调用):

      1)将所有要合并的静态物体(不须勾Batching Static)放入统一一个root

      2)StaticBatchingUtility.Combine(root); 之后就合并好了!

区别:勾选Batching Static:完全自动合并,MeshFilter里显示的是 Combined Mesh(root:scene)。合并后不能移动

StaticBatchingUtility:合并到一个游戏对象下。合并后可以移动父节点游戏对象"

76. Unity3dAwakeStart 谁先执行,updatefixedUpdate 有什么区别?

Awake先执行。Update是在每次渲染新的一帧的时候才会调用,FixedUpdate,是在固定的时间间隔执行,不受游戏帧率(fps)的影响 ,FixedUpdate的时间间隔可以在项目设置中更改,Edit->Project Setting->time 找到Fixed timestep。就可以修改了

77. Unity引擎中以下对Mesh Renderer组件描述正确的是哪一项? C

AMesh Renderer组件决定了场景中游戏对象的位置,旋转和缩放

B.为场景中的某一游戏对象增添物理的特性,需要为该游戏对象添加Mesh Renderer组件

CMesh Renderer组件从Mesh Filter组件中获得网格信息,病根据物体的Transform组件所定义的位置进行渲染

DMesh Renderer是从网格资源中获取网格信息的组件

78. 哪种实时光源是 Unity 中没有的?D

A:点光源

B:方向光

C:聚光灯

D:日光灯 

79. 如何在 Unity 中创建地形系统?A

ATerrain->Create Terrain

BComponent->Create Terrain

CAsset->Create Terrain

DWindows->Create Terrain  

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

ATerrain -> Wind Zone

BGameObject -> Create Other -> Wind Zone

CComponent -> Physics -> Wind Zone

DAssets -> Create -> Wind Zone

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

AEdit -> Rendering Setting -> Directional Light

BGameObject -> Create Other -> Directional Light

CComponent -> Rendering -> Directional Light

DAssets -> Directional Light

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

ASkybox

BSolid Color

CDepth Only

DBackground

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

AJavaScript

BC#

CBoo

DPerl

84. 对于 Prefab,以下说法错误的是? D

APrefab 资源可以在项目中多次重复使用

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

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

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

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

AWindows -> Asset Store

BEdit -> Asset Store

CFile -> Asset Store

DAssets -> Asset Store

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

AProject

BInspector

CHierarchy

DToolbar

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

A:在 Project 窗口中选中一个 Asset,右键->Create->Label

B:在 Project 窗口中选中一个 Asset,右键->Add Label

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

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

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

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

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

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

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

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

AFile --> Lightmapping

BAssets --> Lightmapping

CWindows --> Lightmapping

DComponent --> Lightmapping

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

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

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

C:可以增加场景真实感

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

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

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

B:更改物体导入设置,勾选“Generate Lightmap UVs

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

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

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

ACamera

BLight

CRender Settings

DProject Settings->Quality

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

APVS only

BPVS and dynamic objects

CAutomatic Portal Generation

DDynamic Only

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

AVector3.normalize 可以获取一个三维向量的法线向量;

BVector3.magnitude 可以获取一个三维向量的长度;

CVector3.forward 与 Vector30,0,1)是一样的意思;

DVector3.Dot(向量 A,向量 B)是用来计算向量 与向量 的叉积

95. 下列那些选项不是网格层属性的固有选项? A

ADefault

BWalkable

CNot Walkable

DJump

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

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

B:一种被优化过的物体网格

C:一种用于物理碰撞的网格

D:一种用于实现自动寻路的网格

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

A.后缀名为mov的文件

B.后缀名为mpg的文件

C.后缀名为avi的文件

D. 后缀名为swf的文件

98. Unity引擎使用的是左手坐标系还是右手坐标系? A

A.左手坐标系

B.右手坐标系

C.可以通过Project Setting 切换左右手坐标系

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

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

A. x = 640, Y = -360 , W = 360,H = 360

B. x =640, Y = -360 , W = 360,H = 360

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

C. x =0.5, Y = 0.5 , W = 0.5,H = 0.5

100. 以下哪个组件是任何GameObject必备的组件 B

A.Mesh Renderer

B.Trtansform

C.Game Object

D.Main camera

101. 在Unity编辑器中,停止对Game视图进行预览播放的快捷键操作是以下哪一项 A

ACTRL/CMD + P

BCTRL/CMD + Shift +P

CCTRL/CMD + Alt +P

DCTRL/CMD + S

102. 在Unity引擎中,Depth属性值最大的摄像机会比Depth属性值小的摄像机更晚绘制么? A

A.是

B.否

103. 下列选项中有关Animator的说法错误的是 D

A.AnimasstorUnity引擎内置组件

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

C.它主要用于角色行为的设置,包括StateMachines,混合Blend trees以及通过脚本控制的事件

D.AnimatorAnimation组件的用法是相同的

104. 下列哪个视图主要用于显示和编辑所选游戏对象或资源的相关属性 C

AScene

BProject

CInspector

DHierarchy

105. 简述Prefab的使用?Editor下动态创建Prefab的方式 "u3d里动态创建对象,需要使用prefab而创建的时候 MonoBehaviour.Instantiate (GameObject orignal) 需要一个作为原型的对象。三种方式获得prefab对象。

方式一:使用脚本的public字段

直接在Project视图里找到做好的prefab,将其拖拽到指定脚本的指定public GameObject 字段。

方式二:Resource

1、在Assets目录下的任意位置创建一个名为resources的文件夹,将做好的prefab放到这个文件夹下,path形式如下:  Assets\....\resources\prefabName.prefab

2、在代码里使用Resource.Load 或 LoadAll 函数,获得原型对象。指定prefab时不需要指定扩展名(.prefab),形式如下:GameObject prototype = Resource.Load(“prefabName”) as GameObject; 可以有任意数量的resources文件夹,怀疑是Resource类初始化的时候会搜集所有resources文件夹里的文件名。

方式三:加载到场景

一般我们制作Perfab的时候,都是在Hierarchy视图里创建GameObject,然后再搭建Prefab。事后根据需要删除这个原始的GameObject。因此我们可以保留这个GameObject,然后在场景加载后Find这个对象(代码方式),或者使用脚本public字段(编辑器方式)

106. NGUI的自适应性是?如果此时屏幕比例变化,屏幕出现黑边怎么办?(注:改变NGUIUGUIFixed size with Screen不可行)

NGUI根目录的UIRoot组件自带了根据高度自适应分辨率的功能。

Scaling Style属性可选择三种不同的缩放策略。

PixelPerfect 完美像素:直接显示设定好的像素。当屏幕高度低于minimum Height时按比例缩小,当屏幕高度大于maximum Height时按比例扩大。

FixedSize 按比例缩放:在设定好的基础上,直接按比例缩放。

FixedSizeOnMobiles 合体版,androidiosFixedSize方式,其它按照PixelPerfect方式。

三、 Unity脚本基础

107. Unity3D中的协程(coroutine)和C#线程之间的区别是什么?

(1)多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。

(2)除主线程之外的线程无法访问 Unity3D 的对象、组件、方法。

(3)Unity3d 没有多线程的概念,不过 unity 也给我们提供了 StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。

(4)StartCoroutine 为什么叫协同程序呢,所谓协同,就是当你在 StartCoroutine 的函数体里处理一段代码时,利用 yield 语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而 LoadLevelAsync 则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用 loading 条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜

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

Unity 的脚本语言基于 Mono .Net 平台上运行,可以使用.NET 库,这也为 XML、数据库、正则表达式等问题提供了很好的解决方案。

Unity 里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。

JavaScript:和网页中常用的 JavaScript 不一样,它编译后的运行速度很快,语法方面也会有不少区别。

C#

Boo:可以看做是 Python 语言的变种,又糅合了 Ruby 和 C#的特性,它是静态类型语言

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

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

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

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

111. OnEnableAwakeStart 运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?

Awake -OnEnable-Start

OnEnable 在同一周期中可以反复地发生

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

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

113. Unity3D 如何获知场景中需要加载的数据?

Resource.Load

AssetBundle.Load

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

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

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

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

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

transform.Rotate

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

transform.RotateAround

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

PlayerPrefs.SetInt 与 PlayerPrefs.GetInt

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

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

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

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

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

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

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

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

123. 什么是协同程序?

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

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

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

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

public class Player : MonoBehaviour {

    public Transform _cameraTrans;

    private Vector3 _cameraOffset;

    void Awake() {

        _cameraOffset = transform.position - _cameraTrans.position;

    }

    void Update() {

        _cameraTrans.position = transform.position - _cameraOffset;

    }

}

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

吊机吊物体需要节点挂接和坐标系转换

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

获取:GetComponent

增加:AddComponent

删除:Destroy

128. Animation.CrossFade 命令作用是:C

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

129. Application.loadLevel 命令为:A

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

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

Debug.Log();

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

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

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

GUI.DragWindow();

133. localPosition 与 Position 的使用区别?

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

134. 含义Mathf.Round, Mathf.Clamp, Mathf.Lerp

Mathf.Round 四舍五入

Mathf.Clamp 限制

Mathf.Lerp 插值

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

private float timer = 0f;

private int h = 0;

private int m = 0;

private int s = 0;

private string timeStr = string.Empty;

void Update () {

timer += Time.deltaTime;

    if (timer >= 1f) {s++;  timer = 0;}

    if (s >= 60) {m++;s = 0;} 

if (m >= 60) {h++;m = 0;}

    if (h >= 99) {h = 0;}

}

void OnGUI(){

timeStr = string.Format ("{0:D2}:{1:D2}:{2:D2}", h, m, s);

    GUI.Label (new Rect (10, 10, 100, 200), timeStr);

}

136. 写出 Animation 的五个方法

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

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

在场景中添加一个PlanCameraDirectional LightCube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。

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

void Update () {

     //鼠标滚轮的效果

     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)来处理

主要代码如下:

// 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就是物体应该的移动向量赋给transformposition属性

          transform.position = curPosition;

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

     }

}

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

1、主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick() OnPress()等函数,可以说NGUI的按钮是通过发消息这个方式调用的。具体方法名称是OnClick()

2void Awake () {  

       //获取需要监听的按钮对象

       GameObject button = GameObject.Find("UI Root/Button3");

       //设置这个按钮的监听,指向本类的ButtonClick方法中。

       UIEventListener.Get(button).onClick = OnButton3Click;

   } 

   private void OnButton3Click(GameObject button) {

       Debug.Log("我是按钮3被点击了");

}

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

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

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

1、使用预制物体对象 Prefab

2、使用对象池技术,不使用时关闭,使用时打开

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

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

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

142. Vector3.forwardVector3(0,0,1)是一样的意思对吗?

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

MonoBehaviour.OnLevelWasLoaded

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

iTween 是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等“方法:

aMoveTo 物体移动;

bColorTo:随着时间改变对象的颜色组; 

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

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

Transform 父类是 Component

146. NGUI:把子控件放在父控件里面,如何上下边距都是10

给子控件设置上下两个锚点为10

147. 如何使子控件居中,如果使用UGUI怎么实现

设置子控件锚点为中心

148. 去掉敏感字的程序(手写程序)

String s = "你是坏蛋";

s.Replace("坏蛋", "**");

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

Awake ()

OnEnable ()

Start()

FixedUpdate()

OnTriggerXXX(Collider other)

OnCollisionXXX (Collision collisionInfo)

Update()

LateUpdate () 

OnGUI()

OnDisable ()

OnDestroy ()

150. Unity3dresources目录一般用来放些什么,打包的时候会有什么影响?

resource一般用来放置一些需要动态加载的资源,打包程序的时候会将Resource目录下的全部文件都加密压缩打进包内,这样再想使用assetbundle方式打小包的话就不行了

151. 空间内一物体绕球面固定点(012)按照固定速度speed环绕运动。

public float Speed = 1;

void Update () {

    transform.RotateAround (new Vector3(0,1,2),Vector3.up,Speed);

}

152. 以下关于WWW.LoadFromCacheOrDownload描述正确的是: C

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

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

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

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

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

AMonoBehaviour.OnSceneWasLoaded

BMonoBehaviour.OnSceneEnter

CMonoBehaviour.OnLevelWasLoaded

DMonoBehaviour.OnLevelEnter

154. 关于MonoBehavior.LateUpdate函数描述错误的是: B

A.当MonoBehavior类型应用后,每帧调用一次

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

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

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

155. 某个GameObject有一个名为MyScript的脚本,该脚本中有一个名为DoSomething的函数,则如何在该GameObject的另一个脚本中国调用该函数? A

AGetComponent().DoSomething()

BGetComponent

你可能感兴趣的:(Unity3D,基础)