游戏开发面试题

栏目: 编程语言 · 发布时间: 6年前

内容简介:面试第一次知识总结:一、Unity基本操作1、unity提供哪几种光源?

面试第一次知识总结:

一、Unity基本操作

1、unity提供哪几种光源?

点光源、平行光、聚光灯、区域光。

2、物体发生碰撞的必要条件什么?

两个物体必须有碰撞体Collider组件,一个物体上必须有刚体组件Rigidbody。

3、碰撞体和触发器区别与联系

触发器是碰撞体上的一个属性,如果不勾选触发器,两个物体是不可以别击穿;有了触发器后是可以被击穿的。

  检测碰撞体方法:OnCollisionEnter/Stay/Exit()                检测触发器方法:OnTriggerEnter/Stay/Exit()

4、预设(prefab)的好处

预设更多的像一个模板,比如将一个人物模型设置成预设,我们可以在不同的场景使用,方便使用。

5、如何利用unity开发2D游戏

1)使用本身的GUI

 2)摄像机的投影(projection)方式改为正交投影,不考虑一个坐标轴

3)使用插件2DToolKit

6、事件函数的执行顺序

初始化:函数Awake(激活游戏对象)----OnEnable(实例化游戏对象)-----Start(初始化)

  更新顺序:FixedUpdate(物理计算,处理刚体)----Update()----LateUpdate(相机跟随)

   渲染部分:OnBecameVisible/Invisible(相机中可见或不可见)----OnGUI(执行键盘和鼠标事件)

   对象销毁和退出场景:OnDisable(不激活对象)----OnDestroy(销毁游戏对象)-----OnApplicationQuit(游戏场景退出)

7、协程

协程功能类似与多线程,StartCoroutine()-----yield WaitForSecond/WWW-----StopCoroutine()

  协程背后通过迭代器实现,主要实现了两个接口,IEnumerator和IEnumerable,接口的方法重要有三个方法,MoveNext()---Current--Dispose()

8、对象池

对象池用于存放反复被调用的资源,比如射击类游戏中的子弹。

9、物体旋转和添加力

Transform.Rotate()、Rigidbody.AddForce()

10、Unity、Mono和.Net的关系

Unity是在.Net平台上运行,只能在window下运行,而mono是实现跨平台的工具。

11、uinty支持的脚本语言

c#、javascripts、Boo。

12、Mipmap

Mipmap是一种贴图,目的是为加快渲染速度和减少图形锯齿。

13、链条关节

Hinge Joint用一个链条模拟连接两个物体,在一定距离后会产生拉力。

14、射线检测碰撞体

Ray类,从一个点发射一条无边的线,遇到碰撞体后停止发射。

15、动画类型

关节动画:模型分成多个独立的部分;骨骼动画:各个部分用关节相连;单一网格模型动画:插值运算实现动画效果。

16、Unity资源处理种类

Resources:只读,不能动态修改,不要放动态更新的资源,资源读取Resources.Load();

   StreamingAssets:完全打包,主要存放二进制文件,用WWW类读取;

    AssetBundle:Prefab封装成AssetBundle,加载资源的方式有Resources类和WWW类。

17、Unity Socket网络编程

一般采用可靠传输协议TCP,服务器创建两个Socket,一个用于监听,另一个用于接受和发送消息;客户端连接,接受和发送消息。

18、着色器是什么,有哪几种?

着色器模拟物体表面发生的事情,着色器包括顶点着色器、片元着色器、无光照着色器、表面着色器。

19、着色器和材质的联系

shader是材质当中的一个重要的属性,可以通过自己定义的shader来更好的渲染物体表面。

20、渲染管线

数据收集(纹理,材质)----顶点着色器获取图形的2D坐标---顶点后处理进行坐标变换,图形基元裁剪---图形基元收集

   ---栅格化接受三角形及其数据,形成潜在的像素和片源----片源着色器----输入数据。

21、无光照着色器结构

顶点数据收集结构体---顶点函数(着色器)---顶点数据通过栅格化处理后的数据---片源函数---最终的颜色

22、光照着色器中漫反射和镜面反射的计算过程

漫反射计算过程:1)通过法线向量和光线入射方向求点积,得到光照强度;2)将光线颜色*光线强度*物体的表面颜色,就是我们最后看到的颜色;

   镜面反射计算过程:1)光线的入射方向和法线求出反射方向;2)将反射方向和眼睛的入射方向求点积;3)以点积为底,指数是光照强度求出看到的颜色。

23、后处理堆

Post-process volume游戏对象和profile属性结合,对相机渲染进行后处理,包括颗粒、暗角、景深

24、CPU优化

1)DrawCalls,它是CUP调用底层图形接口,每一次渲染都需要调用一次接口,可以将两个纹理不同的材质打包成图集,进行同时渲染实现批处理;

    2)物理组件,选择合适的Fixed Timestep,尽量不使用网格碰撞器(mesh collider);

    3)尽量减少GC的触发,尽量不要使用foreach(),产生的垃圾多,最好不用LINQ命令和字符串连接,他们都是GC收集的目标;

    4)代码优化,不频繁使用GetComponent,善于使用OnBecameVisible和内建数组,以及ref关键字。

25、GPU优化

1)减少绘制(顶点)的数目,使用较少的材质数目和使用纹理图集,使用共享材质Renderer.sharedMaterial代替Renderer.material,

          使用光照纹理(lightmap)而非实时灯光;

     2)优化显存带宽,OpenGL压缩图片,使用MipMap增加了等比例的小图,即增加了内存空间,但是渲染质量比压缩好很多。

26、四元组的作用

Quaternion对旋转的角度进行计算。

27、Unity制作动画效果

windows---Animation---录制---AddKeys

28、Unity状态机

Animator在动画制作完之后产生的文件,也就是生成的状态机,可以增加其状态和变迁。

29、Unity导航寻路

windows--Navigation,选择navigation static,进行bake烘焙,为目标选择一个导航代理Nav Mesh Agent,对其进行挂载脚本。

30、贴图和精灵的区别

Sprite作为UI精灵使用,Texture作为模型贴图使用。

二、C#面向对象语言

1、多线程

一个进程中经常有多个线程,主线程和Thread构造出线程为前台线程,用IsBackgound()设置为后台线程

  通过委托构造出的线程为后天线程,BeginInvoke(),前台线程关闭后后台线程随着关闭,Lock用于解决线程之间的争夺资源,Console.ReadLine()用于后台线程读取完毕。

2、值类型和引用类型

值类型:结构(Int、Float、Bool)和枚举,一般存储在线程栈上,栈的存取速度优于堆,并且可以共享,随着方法的结束,存储就也被释放了。

  引用类型: 类、接口、委托、字符串,一般存储在托管堆上,对象存储栈上,只要某个对象被引用了,这个对象的内存就不会被释放。

3、装箱和拆箱

装箱:值类型转化为引用类型

  拆箱:引用类型转化为值类型

4、unity中的值类型和引用类型

值类型:Vector、Color、Ray、Touch

  引用类型:Object、Component、MonoBehaviour

5、ArrayList和List的区别

1、ArrayList不安全,将所有的类型都当做Object类型处理,很有可能出现类型不匹配的问题;

  2、ArrayList在数据插入和获取的会有装箱和拆箱操作,而导致额外的开销。

6、public、protected、private、internal区别

public:所有的类都可以访问;protected:该类及其子类可以访问;private:仅仅该类可以访问;internal:该类的程序集中访问。

7、接口和抽象类的区别

1、一个类可以继承多个接口,但只能继承一个抽象类;

  2、接口中的方法都是抽象方法,而且必须全部实现;抽象类可以实现部分方法,不一定全部是抽象方法。

8、ref和out

ref和out都是传递参数的关键字,ref传递的参数必须初始化,out传递的参数必须在函数内赋值;

  ref传递的是引用,一个函数需要有多个返回值时用out比较方便。

9、委托

委托最主要的是传递的不是变量而是一个方法,和c++中的方法指针比较相似

  自定义委托步骤:1)定义委托;2)委托实例化;3)注册委托;4)委托调用

  系统委托有Action(注册的方法无返回值),Func(注册的方法有返回值),Predicate(返回值为bool类型)

10、匿名和lamda表达式

匿名将委托的实例化和委托方法合并;lamda表达式是对委托方法的进一步简化。

11、委托和事件

委托可以作为方法的参数,事件不可以;委托可以声明一个局部变量,事件不可以;事件其实是委托的一个特殊化的实例。

12、StringBuilder类和String的区别

String类字符串是不可变的,StringBuilder是拼接字符串。

13、反射原理

反射可以读取程序集中代码的内容(dll和exe文件),反射中常用Type类和Assembly类获取命名空间、类名以及类的方法、属性、字段。

    GetMethod(),GetProperties(),GetFiled(),据说反射还可以得到private方法。

14、sealed关键字

如果是在类前声明,这个类是不可以被继承;如果是在方法前声明,这个方法是不可以被重写的。

15、序列化和反序列化

序列化:对象转化为字节流的过程,首先一个对象应该被确定为可以被序列化(Serializable)---定义文件流(FileStream)--使用格式化器BinaryFormatter进行序列化和反序列化;

   反序列化:字节流转化为对象的过程。

16、Unity3D中序列化注意事项

最好为public或者使用了[SerializeField]定制特性、自定义引用类型和值类型且必须使用[Serializable]定制特性、基元类型。

17、特性

系统特性:Obsolete特性检查方法是否过时,Conditional特性实现条件编译,比如测试方法但是需要宏定义;

   Unity中的特性:DllImport特性应用于方法,Serializable特性应用于类型,自定义特性和拓展编辑器。

18、拓展方法

对于定义好的类进行拓展,比如String和Int类,但是拓展类和方法都应该是静态的。

19、正则表达式

正则表达式判断字符串更加简洁,但是需要懂一些语法,最主要的类是Regex

string strPattarn = @"^\d* KaTeX parse error: Expected 'EOF', got '\d' at position 15: ";可以理解为^最开始为数字\̲d̲直到*最后 仍然为数字。

string strPattern = @"^\w*$"; \w判断用户输入有字母,数字,下划线,汉字,其他都是非法的

20、构造函数和析构函数

构造函数:创建对象时初始化对象;

    析构函数:用于释放一个对象,有垃圾回收器控制,清理资源。

21、单例模式

单例模式要求某个类只要一个实例,比如一台打印机连接了多个计算机,可以将其设计为单例模式,防止两台计算机同时打印;

    构造函数设置为private,实例化对象instance;通过public的getInstance方法为外部获取实例提供接口。

22、观察者模式

一个事件发生变化,其他相关是事件都发生变化,一般用委托进行注册方法。

   当然还有一些其他设计模式,包括简单工厂模式、代理模式、适配器模式、装饰器模式、迭代器模式等。

23、Hashtable类和HashMap

Hashtable和HashMap都是存储键值对,Hashtable多线程安全,HashMap多线程不安全;HashMap null可以作为键,而Hashtable不可以。

24、HashMap和TreeMap

HashMap和TreeMap同样是存储键值对,HashMap是无序的,而TreeMap是有序的存储。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Test Driven Development

Test Driven Development

Kent Beck / Addison-Wesley Professional / 2002-11-18 / USD 49.99

Quite simply, test-driven development is meant to eliminate fear in application development. While some fear is healthy (often viewed as a conscience that tells programmers to "be careful!"), the auth......一起来看看 《Test Driven Development》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具