面试第一次知识总结:

一、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*$";可以理解为^最开始为数字\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是有序的存储。

some word:Vegetable is the original crime.

Unity游戏开发面试基础知识的更多相关文章

  1. 【Unity3D游戏开发】基础知识之Tags和Layers (三二)[转]

    Tags和Layers分别表示是Unity引擎里面的标签和层,他们都是用来对GameObject进行标识的属性,Tags常用于单个GameObject,Layers常用于一组的GameObject.添 ...

  2. 游戏开发3D基础知识

    概念学习: 向量 向量简介 我们将所有彼此平行的向量进行平移,使其起点与坐标原点重合,当某一向量的起始端与坐标原点重合,我们成该向量处于标准位置.这样,我们就可用向量的终点坐标来描述一个处于标准位置的 ...

  3. 关于Unity游戏开发方向找工作方面的一些个人看法

     这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...

  4. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  5. 喵的Unity游戏开发之路 - 玩家控制下的球的滑动

  6. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  7. 喵的Unity游戏开发之路 - 轨道摄像机

    前言        很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...

  8. 喵的Unity游戏开发之路 - 在球体上行走

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  9. 喵的Unity游戏开发之路 - 游泳

    原文: https://mp.weixin.qq.com/s/-ERFNB1GRZ6UAkHOhP9UQw 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀 ...

随机推荐

  1. encypt dataset

    import getoptimport sysimport uuidimport hashlibimport csvdef getIds(totals,encrypt): seed=set() for ...

  2. Python 爬取 热词并进行分类数据分析-[解释修复+热词引用]

    日期:2020.02.02 博客期:141 星期日 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  3. python多线程下载ts文件

    # -*- coding: utf-8 -*- """ Created on Wed Aug 22 15:56:19 2018 @author: Administrato ...

  4. Vue中全局监听键盘事件

    全局监听enter键,是把监听事件绑定到document上 常用的keyCode键盘编码在这里:https://www.cnblogs.com/wbyixx/p/12029508.html creat ...

  5. ALSA 有关文档

    Alsa项目的官方网址:http://www.alsa-project.org/ Alsa LIB API Reference:http://www.alsa-project.org/alsa-doc ...

  6. LDAP-轻量级目录访问协议(统一认证)

    概念 LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP. 参考资料 LDAP概念和原理介绍 我花了一个五一终于搞懂 ...

  7. LeetCode 725. Split Linked List in Parts(分隔链表)

    题意:将原链表分隔成k个链表,要求所有分隔的链表长度差异至多为1,且前面的链表长度必须大于等于后面的链表长度. 分析: (1)首先计算链表总长len (2)根据len得到分隔的链表长度要么为size, ...

  8. ls命令与cd命令

    ls命令用于显示文件目录列表,当使用ls命令时,默认显示的只有非隐藏文件或文件夹(隐藏文件在linux中前面有 ' . ' ),当不加参数时,显示当前目录. 1.ls命令语法 ls [参数][目标文件 ...

  9. ABC154F - Many Many Paths

    梦回高中,定义的f(i,j)为从(0,0)到(i,j)一共有多少条路可以选择,易知我们要做i+j次选择,其中有i次是选择x轴,剩下的是y轴,所以f(i,j)=C(i+j,i)=C(i+j,j),给你一 ...

  10. CSS - 滑动门技术

    1. 概念: 1.1 为了使各种特殊形状的背景能够自适应元素中文本内容的多少,出现了CSS滑动门技术. 1.2 使各种特殊形状的背景能够自由拉伸滑动,以适应元素内部的文本内容,可用性更强. 1.3 最 ...