Unity部分面试问题整理(持续更新)

 

面向对象三大特性:

继承:继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类成为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”和组合来实现。继承概念的实现方式有两类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力。在某些OOP语言中,一个子类可以集成多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

封装:封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据进行了不同级别的保护,以防止程序中无关的部分意外地改变或错误地使用了对象的私有部分。

多态:多态,是指一个类实例的相同方法在不同情形下有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

C#的值类型:

值类型有两种:值类型和引用类型。所有值类型都是隐式地从System.ValueType类继承而来,而System.ValueType则是从object类继承而来。其中System.ValueType本身不是一个值类型,它是一个被所有值类型自动继承的类类型。

每个值类型都隐式地声明了一个公共无参的实例构造函数,所有每个值类型都有对应的默认值。

  1. 对于所有简单类型,默认值的每一位都是零:
    1. sbyte,byte,short,ushort,int,uint,long和ulong的默认值都为零。
    2. char的默认值为’\x0000’
    3. Float的默认值为0.0f
    4. double的默认值为0.0d
    5. decimal的默认值为0.0m
    6. bool的默认值为false
  1. 枚举类型E的默认值为转换到类型E的0
  2. 对于结构类型,其默认值是将所有值类型变量设置为默认值,并把所有引用类型变量设置为null
  3. 可空值类型的默认值是一个HasValue属性为false,并且Value属性未定义的实例。通常这也称为可空值类型的null值。

一般C#中的值类型有:结构类型里的简单类型:bool(逻辑),数类型(包含整数和浮点数和decimal),整数包含:sbyte,byte,short,ushort,int,uint,long,ulong,char,浮点数包含:float,double;除了结构类型枚举类型也是值类型。

C#的引用类型:

  1. object
  2. dynamic
  3. string
  4. 接口
  5. 数组
  6. 委托

C#装箱拆箱:

装箱转换让一个值类型可以隐式地转换到引用类型。它们有:

  1. 从任何值类型到object类型。
  2. 从任何值类型到System.ValueType类型。
  3. 从任何非空值值类型到任何值类型实现的接口类型。
  4. 从任何可空值类型到任何可空值类型的基础类型实现的接口类型。
  5. 从任何枚举类型到System.Enum类型。
  6. 从任何基础类型为枚举类型的可空值类型到System.Enum类型。

拆箱转换即把上文装箱转换倒过来。

 

简述对象池,并说明对象池的作用:

对象池是存放需要反复调用资源的游戏对象的空间,当一个对象被大量地生成并很快地销毁时会很费时间并且会造成性能的损耗,于是这时候就可以使用对象池把不用的对象保存起来,当下次要生成的时候在池里查找是否有可用的对象,如果有的话直接取出,如果没有的话则重新创建,是一种典型的空间换时间的一种提高性能的方法。

 

如何在Unity的不同工程之间迁移数据:

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

其中Library文件夹的作用:

 

Unity脚本的生命周期:

Awake->OnEnable->Start->Update->FixedUpdate->LateUpdate->OnGUI->OnDisable->OnDestroy

 

Unity中LOD是什么,它的优缺点是:

LOD(Level Of Detail)多层次细节,

 

在游戏开发里使用脚本语言的目的:

  虽然脚本语言相对C++等语言来说较慢并且需要占据更大的内存的,但其开发起来很快并且对设计师很友好,于是我们在游戏开发的过程中可以通过脚本语言来开发可以让设计师直接修改的内容,让设计师不用经过程序员就可以直接修改内容,而且一些经常需

要迭代的又不需要太强调性能的功能就可以使用脚本语言来进行开发。

 

 

 

String与StringBuilder的区别:

 

String是不可变对象,我们不能修改String的值,在对String进行连接等操作时,修改的是String指向的内存地址,若有多个值相同的String类型值,代表着都指向同一个内存地址。

StringBuidler是可变对象,可以在字符串连接的时候在对原来的字符串进行修改,但StringBuilder对象创建代价较大,所以若字符串的连接次数较少,还是使用String,这样可节省一些性能,只有有大量的或不可预知次数的字符串连接操作时才使用StringBuilder,但在连接操作小于等于100次的时候,两者几乎看不出性能差异。

 

 

AssetBundle加载方式: 

  1.  从本地加载
  2. 从内存加载
  3.  下载后放在缓存中备用
  4. 从服务器下载

 

 

 

 

跑酷类型游戏的实现:

 

一、地铁跑酷类

 此类型为直线型,玩家需要躲避路线上随机出现的障碍物,每个障碍物都是需要可碰撞的,直接撞上那就会死,有些是可以通过跳跃等方式跳上障碍物从而避免死亡或产生更多有乐趣的玩法等。

 所以此类游戏就有几个关键点:首先是路径生成,路径生成可以在玩家到路径中途的时候生成下下段路径等,也可根据时间生成路径等,多种多样,其次是生成障碍物,障碍物可在路径上的特定范围的位置随机生成,这个生成直接在路径生成时就生成好即可,第三就是人物的动画控制,这个使用Unity的Mecanim(3D动画系统)结合有限状态机与单例模式就可以了。

二、神庙逃亡类

  此类型为转弯型,玩家撞到墙壁就是个死,同样是需要路径生成,但这个路径生成是在路的尽头,在左,中,右三个位置进行生成,生成后将生成的路径(prefab)旋转一定角度即可,其次是人物的左右控制,可以在路径的快尽头部分设立一个隐藏的trigger,当触碰到这个trigger以后才可以进行左右滑动。

 

关于这里的路径生成,我这里有两种思路,一种是到了触发点需要生成的时候就instantiate等人物过去以后就Destroy掉,但这样做会造成性能上的浪费。第二种是使用对象池,在一开始就根据名字将游戏对象生成好(使用字典),到了触发点则通知游戏对象令其改变位置(随机地),障碍物的生成同理。

 

 

 

你可能感兴趣的:(Unity)