面试第一次知识总结:

一、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. Session服务器之Memcached

    材料:两台Tomcat(接Session复制一起做) 第一台Tomcat:IP为130 [root@localhost ~]# yum install libevent memcached -y    ...

  2. mysql yum源安装极速

    mysql yum源地址:https://dev.mysql.com/downloads/repo/yum/ 随便找个最新的不管你是要装任何个历史版本他都可以,后面我会介绍: 安装第一步预置环境清理: ...

  3. Linux下安装 boost 库

    1. 先去官网下载压缩包: https://www.boost.org/ 2. 解压 tar -zvxf boost_1_70_0.tar.gz 2. cd 进入根目录,然后执行: ./bootstr ...

  4. HA: Infinity Stones-Write-up

    下载地址:点我 哔哩哔哩:点我 主题还是关于复仇者联盟的,这次是无限宝石的. 信息收集 虚拟机的IP为:192.168.116.137 ➜ ~ nmap -sn 192.168.116.1/24 St ...

  5. js学习:函数

    概述 函数的声明 JavaScript 有三种声明函数的方法 function 命令 function命令声明的代码区块,就是一个函数.function命令后面是函数名,函数名后面是一对圆括号,里面是 ...

  6. 关于热部署Devtools出现同一个类型进行类型转换失败的问题

    背景: 最近在和学长们做一个小系统,在进行任务调度的设置的时候会出现类型转换失败的错误,原本是同一个类型的,不应该出现类型转换失败的问题,起初以为是序列化的问题,回来发现并不是这个原因, 报错截图: ...

  7. 并发编程之Event事件

    Event事件 用来同步线程之间的状态. 举个例子: ​ 你把一个任务丢到了子线程中,这个任务将异步执行.如何获取到这个任务的执行状态 解决方法: 如果是拿到执行结果 我们可以采用异步回调, 在这里我 ...

  8. typescript 起步之安装及配置 ts-node 环境变量

    最近vue 3.0 版本发布,让我认识到 typescript 将占有越来越重要的地位,所以我也开启了typescript学习之旅. 要想编写第一个 hello typescript 程序,当然要经过 ...

  9. Kali中文乱码问题

    上面的是用网上介绍的安装组件无法安装,老是提示最后一句:Unable to locate package ...... 后来觉得应该是因为安装Kali时在最后有个选择更新系统的一个配置上,我选择了下面 ...

  10. How to recover if NMC cound not connect

    Some times we suddently find that the NMC can not login,. You would see the sybase database error if ...