2019Unity3D开发工程师面试题

面试题总分类

---------------------------------------

|--继承,封装,多态,设计模式理解?---------|

|--网络层级,tcp,udp,http,socket区别?---|

|--渲染管线,渲染流程,渲染机制------------|

|--优化,cpu,gpu,内存,drawcall,fps?-----|

---------------------------------------|

常见题

---------------------C#----------------------

值类型与引用类型区别?

存储类型是栈和堆  速度值类型存储快 引用慢

简述对继承的理解?

一个类继承另一个类 可以使用基类的方法和属性 基类必须加virtual 子类加override

List和ArrayList区别?

泛型和非泛型

4种访问修饰符的区别?

public 公共的 protected 自身和子类使用 private 私有的  internal 程序和程序集内部

面向对象三大特征?

封装 继承 多态

引用类型的基类?

System.Object

Ref和out区别?

传递引用 出参

接口和抽象类区别?

多继承 抽象类不能  接口不能实例化 抽象类间接实例化 接口完全抽象 抽象类部分抽象

String和StringBuilder区别?

修改的是再开辟一个内存空间 stringBuilder是在原有的内存空间修改

简述常用设计原则?

单一 里氏代还 依赖倒转 迪米特 接口隔离 合成复用 开闭原则

简述常用设计模式?

单例 简易工厂 对象池 观察者 状态机 外观

List命名空间?

system.collections.Generic

二叉树的前序中序后续

No

数组和链表区别?

有序  长度固定 类型确定 增删改查不方便 需要扩容  ··链表无序...

线程互斥的方法?()

lock  Monitor 是一种语法糖

软件设计四大特性?

安全 复用 扩展 可测试

什么是MVC?

模型视图分离控制器  是一种设计模式

文件流的3种读写方式?

StreamReader

Stream.read

StringReader

BinaryaReader

TextReader

JIT和AOT?

justintime  即时编译 c# Java等托管语言 执行慢 安装快 占用内存小

aot预先编译  c++等  执行快 安装慢 占用内存大

观察者的设计原则?

依赖倒转

常用容器类?

list arriylist hashtable dictionary stack queue array LinkList

数组和list区别?

装箱拆箱 不用指定长度 自动扩容

IO的关键字分别有哪些?分别有什么用?

Stream  流  File 文件  Path 路径 Directory 文件夹

同步和异步的区别?

两方同时在线 阻塞 等待回复  异步 相当于发消息 发完就可以执行其他程序

接口和委托区别?

接口约束方法 必须实现  委托约束参数 参数类型必须相同

-------------------unity---------------------

Unity生命周期函数有哪些?

Awake OnEnable Start Update LateUpdate (FixedUpdate) OnDisable OnDestroy OnApplictionQuit

Unity光源有几种?

1 平行光 2 点光源 3 聚光灯

Unity动画有几种?

关节动画  骨骼动画 关键帧动画

矩阵相乘的意义?

计算欧拉角 向量

自身坐标系和世界坐标系区别?

position localPosition 以自身坐标为坐标轴 世界原点为坐标轴

协程和线程区别?

协程不是线程 unity不支持多线程 在主线程开启一段逻辑来辅助主线程执行 是模拟多线程的一种机制

异步加载场景的函数?

using UnityEngine.SceneManagement;//命名空间

SceneManager.LoadSceneAsync(1);//异步加载场景函数

SceneManager.LoadScene(0);//加载场景

unity增加删除和获取组件的方法?

AddConponent ()

Destroy()

GetComponent()

UGUI和GUI的区别?

可视化 美观 GUI是脚本控制

编辑器的类放到哪个文件夹?

Editor

unity两个场景之间互相传值的方法。

DontDestroyOnLoad()

PlayerPrefs

material和SharedMaterial区别?

修改这个物体的材质  ShredMaterical修改使用这个材质的所有物体

碰撞器和触发器区别?

碰撞有物理效果 触发没有

什么是DrawCall?

GPU把游戏场景内的的模型贴图光照等信息收集起来发送给GPU计算的过程称为一次drawcall

1个模型带一个材质单通道shader渲染一次的过程是1个drawcall

.Net和Mono?

微软开发的一个开发平台 Mono是.net的开元跨平台工具

点乘和叉乘?

点乘 计算角度 叉乘 可以计算法线

Unity支持的语言?

javascipt,C#,boo

Render,MeshRender和SkinnedMeshRender区别?

Reader,父类,负责渲染

MeshReader,网格渲染器,

SkinReader,蒙皮网格渲染器,每个模型的骨骼的骨关节,都有一个顶点,骨骼里有骨骼信息,骨骼可以牵引着蒙皮走

Animator的Layer有什么用?

层级遮罩 可以上半身播放一个动画 下半身播放另一个动画

什么是跨平台?

直接在其他平台上运行 不需要修改原代码

Pingpong和Repeat?

12321 123123

Lerp,Slerp

插值  圆滑(弧线)插值

动态加载资源的3中方式?

Resourse AssedBoundle WWW

矩阵相乘?(必要条件)

格式相同

获取input,横纵轴的方法?

Input.GetAxis("Horizontal")"Vertical"

LOD和MippingMap?

模型 贴图 近大远小(清晰的和模糊的)

序列化和反序列化?

protobuf  json  xml

隐藏Inspector字段的方法?

HideInInspector

AssetBundle和Resources区别?

Resources的方式需要把所有资源全部打入安装包

AssetBundle是打成一个资源压缩包,里面包含了一堆资源,把资源打成几个小的bundle,用哪个就load哪个,

旋转使用矩阵,四元数,欧拉角的优缺点?

矩阵 优点是 可以使任意方向 缺点是运算量大,

四元数,优点是可以避免万向锁,可以平滑插值旋转

欧拉角 优点是容易理解,缺点是有万向锁

什么会导致unity内存泄漏

网络5层协议?

应用层 传输层 网络层 数据链路层 实体层

状态机和行为树的区别?

状态机(FSM):

数学连通图

状态之间需要特定的条件跳转

节点不容易复用,

状态节点增加会增加维护成本

同一时刻只有一个节点在执行

行为树(BT)

树形结构

高度模块化行为,行为之间的跳转由父节点来决定,复用性好

适合做大型的AI

什么是光照贴图?有什么意义?

烘焙 避免使用实时光

光照探针?什么意义?

补强动态物体的动态的效果

--------------------优化------------------------

优化FPS的方法?

锁帧 Application.targetFrameRote=30;

unity优化内存?

压缩自带类库,合并材质,合并图集,使用对象池,

unity中优化CPU?

update中避免使用迭代器,遮挡剔除,视锥体剔除,MipMap,LOD,烘焙光代替实时光,警惕透明物体(透明物体是从后往前渲染的)

unity中优化GPU?动静态处理

GC的产生原因和避免?

Unity减少GC的方式?

unity中怎么手动GC?

-----------------Network---------------------

网络数据的序列化方法有哪些?有什么区别?

。proto转。cs文件,流程?

网络5层协议?

Http的特点?

TCP和UDP区别?

TCP是面向连接,需要三次握手才能连接成功

UDP不是面向连接,发送完消息就断了

http,socket,tcp区别?

粘包产生原因,如何解决?

要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。

待发送数据大于MSS (最大报文长度),TCP在传输前将进行拆包。

要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓存区的数据一次发送出去

接收数据端的应用层没有及时读取接收缓存区中的数据,将发生粘包

-----------------Lua---------------------

lua基本数据类型有哪些?

lua中什么是元表?

lua中.和:有什么区别?

lua中如何实现面向对象?

pairs和ipairs有什么区别?

dofile和require有什么区别?

ulua热更新的原理?

热更新的流程?

cstolua的原理和优点?

pureMVC框架的结构?

pbc的使用流程?

ulua中如何优化?

--------------------shader---------------------

什么是渲染管线?

shader中的数值类型有哪些?

Lambert和BlinnPong的计算公式?

shaderLab的种类?分别什么区别?

顶点函数中常用哪些语义?分别代表什么含义?

AlphaBlend代表什么阶段?有哪些常见混合方式?

ShaderForge中Fresnel节点代表什么含义?

RenderType的Opaque和Transparent有什么区别?

RenderQueue中有哪些参数?

shader中Fallback什么意思?

------------------cocos2dx & C++-------------------

NULL和nullptr的区别?

虚继承的意义?

new,delete,malloc,free的区别?

虚函数和纯虚函数有什么区别?

子类析构是需要手动调用父类的析构吗?

什么是引用?什么是指针?有什么区别?

将引用作为函数返回值的好处?

C++是不是类型安全的

宏定义和const常量有什么区别?

数组和指针的区别?

复杂声明void*(*(*fp1)(int))[10]代表什么含义?

cocos命令有什么用?请写出创建工程的命令

cocos2dx中场景图的结构和遍历方式

cocos2dx使用图片和图集的区别?

cocos2dx中action动作中,to和by的区别?

cocos2dx中获得鼠标点击事件的方法?

cocos2dx中开启update的方法

cocos2dx中如何判断鼠标点击了图片?

-----------------cocoscreator & JS--------------------

js的基本数据类型有哪些?

js的var和let区别?

js的use strict的用法有什么用?

js的变量提升指什么?

js继承使用哪个关键字?

js中require和export的作用?

typeof和instanceof的区别?

cc.Class 声明有什么作用?

cc中如何声明数组?

cc中如何获取自身其他组件?

cc中如何查找自己的孩子?

cc的生命周期有哪些?

cc中如何销毁节点?

cc中常驻节点有什么用?怎么设置?

cc中如何动态加载资源?

cc中如何发射和监听事件?

cc中如何判断两个精灵发生碰撞?

脚本重构 对脚本的优化

菲涅尔 ViewDic和NormalDic点乘后一减  跟颜色相乘

将Lua逻辑脚本写到Lua里面

结构体和类的区别

结构体是值类型 结构体只能声明成员,不能让成员初始化

结构体没有析构函数 声明构造函数时必须加一个本类的变量作为参数

class是引用类型

--------------打包AB包-------------------------

第一种方式

首先把需要打包的物体设为预设物,把AsststBundle标签名字改为XX.unitry3d

在编辑器脚本下现找到StreamingAsstesPath路径,

看是否存在该路径,如果存在,就把该文件夹Delete掉,在重新创建该SteamingAssets文件夹

使用BuildPipeline.BuildAssetBundles(path,0,BuildTarget.StandaloneWindows64);打包资源

第二种方式

引入Luaframework框架,在Packager中添加打包路径,然后点击编辑器脚本生成Wrap文件

--------------什么是粘包--------------------------

只有TCP才有粘包现象

粘包是: TCP发送的时候是以流的形式发送的,所以发送的时候把多个包存储在一个连续的缓存中,而接收方不知道每个包的接收边缘,所以估算大小读取,所以会产生粘包和半包

--------------粘包处理--------------------------

先把收到的数据存储到内存流里

可以先定义一个int类型的lengthCount=4的值,表示每次读取数据的长度

在while循环中进行读取数据,

先把读取数据的长度放在内存流的开头,如果数据的长度不足一个int的长度,

就把剩下的字节全部一次读取,放到内存流的最后

这样处理就可以通过先读取最前面的数据长度进行判断,避免粘包半包的产生

首先声明MS内存流把收到的信息存到里面

int count=4;

while(MS剩余的字节>count)

{

  声明一个ms内存流用于存储每次从MS中读取的字节流

  if并把指向当前位置的指针前移相应的字节

  else字符流长度不够,直接一次全部读完放到ms的最后,跳出循环,等待下次读取

}

MS的剩余字节判断是用MS的字节长度减MS的指针位置得到的

--------------Lua和C#是怎么进行交互的--------------

C#调用Lua是通过LuaInterface进行交互的

Lua调用C#是通过LuaFunction绑定回调

--------------网络连接--------------------------

一般使用Socket基于TcpClient进行连接,服务器开启监听,开启异步读取客户端连接

-----------------------------------------------

四元数、欧拉角、矩阵的区别

四元数就是表示一个3D物体的旋转,避免万向锁 增量旋转

欧拉角

---------------断线重连---------------------------心跳包  轮讯

客户端每隔一定时间间隔发送一次心跳包,如果客户端成功发送,但是长时间未接到服务器的

回应,则认为连接已经中断,如果服务器没有接收到客户端的请求,则可以认为客户端已经离线

如果服务器可以接收到客户端发来的心跳包,则可以重新连接

有三种方式:

1.静默重连:就是断线时用户不知道,可以应付短暂的网络中断

2.显式重连:在静默重连一定次数,仍然无法连接成功,此时需要弹出提示框,中断游戏流程,告知用户当前网络环境较差,引导用户在网络较好时尝试连接

3.服务器故障重连.

---------------常用的数据结构----------------

---------------网络连接底层是怎么实现的

---------------如何加载AB包

---------------什么是外观模式

---------------MVC

---------------Json和XML的区别

生命周期

Update和FixedUpdate

js,let和var  let是块级作用域是局部变量声明,而且无法修改  var定义的变量可以修改

js,数据类型  值类型String Number Symbol null Undefind  引用function Object Array

lua数据类型 string local Number boolen function table threed nil

lua和C#交互 Luainterface

C++删除对象 delete

C++什么是拷贝构造函数 是一种特殊的构造函数,函数名称必须和类名称一致,它必须的一个参数是本类型的一                                                    个引用变量

unity cpu优化  LOD Mipmap 遮挡剔除 视锥体剔除

SQL删除语句 Delete form 表名 where username = ""

添加:insert into 表名 values

改update 表名 set id="" where usrename=""

查select * from 表名

NGUI 是插件panel是容器 点击事件是碰撞检测 有多个锚点 3DRoot调整3D 渲染层级是Depth 自带Dotween

状态模式 数学连通图 符合人的思维,容易理解 同一时刻只有一个状态执行 随着节点的增加增加维护成本

BeahaviaC 选择 序列

边缘发光 菲尼尔近似式

张世杰 2019/4/24 17:31:22

状态机和行为树 状态机的标准格式是枚举Update 增加状态增加维护成本 数学流通图 符合人的思维容易理解

                        行为树是第三方插件 可视化 树形结构 高度模块化 适合做大型AI

优化内存  压缩自带类库 合并图集 合并材质 合并纹理 使用对象池机制

热更新机制 Luaframwork 先生成wrap文件 AB包 检测md5 如果有文件的md5变化 就把该文件删掉 重新加载

MySQL、SQLite MySQL是用来做服务器开发的 SQLite用来做客户端开发的

xml,json,protobuf 序列化后大小比json protobuf小 灵活 proto文件转cs文件 json是把类序列化成json

shader属性

设计模式 单例模式 对象池模式 外观模式 观察者模式 简单工厂模式 开发者模式 状态机模式

NGUI和UGUI NGUI是插件 panel是容器 自带Dotween 需要碰撞进行射线检测 渲染层级是Dephe 有多个锚点

                      UGUI是Unity原生 渲染层级是调层级面板 不需要碰撞盒

内存优化 压缩自带类库 合并图集 合并材质 合并纹理 使用对象池机制 减少模型的骨骼和面片数量

张世杰 2019/4/24 17:31:34

状态机和行为树 状态机:数学连通图 符合人的思维容易理解 增加状态增加维护成本 标配是枚举和状态方法

                        行为树:高度模块化 树形结构 适合做大型AI 可视化

优化内存  压缩自带类库 合并材质纹理图集 对象池 减少骨骼和面片

热更新机制 引入Luaframwork框架 生成wrap文件 打AB包 把StreamingAssets放到网络文件服务器

                运行的时候检查每个文件的md5是否和网络文件服务器一致如果不一致删除该文件 从网络

                文件服务器重新加载 

MySQL、SQLite MySQL是服务器开发用的 SQLite是客户端开发用的

xml,json,protobuf json是把类序列化成json格式的string 可以直接发送 灵活

                                protobuf是第三方插件 用的时候是把类转成proto类

                                xml是把数据转化成xml格式进行读取发送

shader属性

设计模式  单例模式 对象池模式 观察者模式 状态机模式 外观模式 开发者模式

NGUI和UGUI NGUI是插件 panel是容器 渲染层级是通过Dephe深度 按钮需要碰撞盒才能检测点击事件 自带DoTween 有多个锚点

内存优化

高复发 多协作

pbc是云峰大神写的protobuf解析库  protoc.exe -o 目标文件 源文件

JS是怎么继承的  estends继承

. 和 : 的区别  .不是面向对象 调用C#静态时  :是面向对象引入class 调用C#自身方法

严格模式 user strict 指令在JavaScript 不能使用未定义变量 体现代码的安全性

cc的生命周期 onload OnEnable start update lateUpdate OnDisable OnDestroy

面试题总分类

---------------------------------------

|--继承,封装,多态,设计模式理解?---------|

|--网络层级,tcp,udp,http,socket区别?---|

|--渲染管线,渲染流程,渲染机制------------|

|--优化,cpu,gpu,内存,drawcall,fps?-----|

---------------------------------------|

常见题

---------------------C#----------------------

值类型与引用类型区别?

值类型存储在内存栈里,存储速度快,存的是具体数据,内存用完自动释放,引用类型存储在内存堆里,存储速度慢,存的是地址或引用,内存用完由 .Net 的 GC 释放

简述对继承的理解?

多个子类抽象出共有的方法或属性放入父类,继承提高了代码的重用性,增强软件的可维护性,符合开闭原则

List和ArrayList区别?

arraylist 不带泛型,数据类型丢失,需要装箱拆箱, list 带泛型,数据类型保存,不需要装箱拆箱

4种访问修饰符的区别?

private 仅对奔雷公开

public 对任何类公开,没有访问限制

protected 对本类和它的子类公开

internal 同一个程序集可以访问

protected 和 internal 同一个程序集内部以及不同程序集但存在继承关系的可以引用

面向对象三大特征?

继承 提高代码重用性,增强软件可维护性,符合开闭原则

封装 将数据和行为相结合,增强代码安全性

多态 重载和重写

引用类型的基类?

System.Object

Ref和out区别?

都是通过引用传递参数,和 C 中的指针类似,使用 ref 传递参数,参数必须初始化,使用 out 必须在方法中对其完成初始化,out适合用在需要 return 多个返回值的地方,ref 用在需要被调用的方法修改调用者的引用的时候

接口和抽象类区别?

接口是对动作的抽象,抽象类是对根源的抽象。

抽象类不能创建实例,只能作为父类被继承,抽象方法只作声明,不实现,抽象类有构造函数,可以包含普通成员变量,静态方法,只能单继承

接口也不能创建实例,只能包含方法声明,不能包含常量,字段,构造,析构,静态成员,可以多继承

一个类可以实现多个接口,但只能继承一个抽象类,

相同点:派生类必须实现未实现的方法

String和StringBuilder区别?

string 具有不可变性,每次对 string 对象进行修改其实都是创建另一个 string 类的对象,所以当需要频繁 的对 string对象 修改时建议使用 stringBuilder,stringbuilder 的原理是先在内存中开辟一定大小的内存空间,如果内存不够则会对次内存空间进行扩充而不是重新创建一个对象,不会造成过多的内存浪费

string 主要用于公用 API ,通用性好,用途广泛,读取性能高,占用内存小,stringbilder 主要用于拼接 string 修改性高,不过现在的编译器已经把 string 的 + 操作优化成 stringbuilder 了,所以一般用 string 就可以了

string 是不可变的,所以天然线程同步,stringbuilder 可变,非线程同步

简述常用设计原则?

单一职责:一个对象应该只包含单一的职责,只干一件事,高内聚

里氏代换原则:所有引用基类的地方能透明的使用子类

依赖倒转原则:抽象不依赖于细节,细节依赖于抽象

接口隔离原则:接口不应该太大或太小

迪米特法则:最少知识原则,低耦合

合成复用原则:优先使用对象组合,而不是继承来达到复用的目的

开闭原则:对扩展开放,对修改关闭

简述常用设计模式?

单例模式:全局唯一,静态不销毁,可以直接访问不需要实例化

简单工厂模式:由一个工厂对象决定创建哪一个对象

观察者模式:当一个对象发生变化时会自动通知它的依赖对象 实现事件处理系统

状态模式:类的行为基于状态改变,需要状态跳转(有限状态机)

外观模式:隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口

命令模式:请求以命令的形式包裹在对象中并传给调用对象

代理模式:一个类代表另一个类的功能,为其他对象提供一种代理以控制对这个对象的访问

List命名空间?

System.Collections.Generic

二叉树的前序中序后序

前序遍历:先访问根节点,在访问左节点,在访问右节点

中序遍历:先访问左节点,在访问根节点,在访问右节点

后序遍历:先访问左节点,在访问右节点,在访问根节点

数组和链表区别?

链表是链式的存储结构,数组是顺序的存储结构

数组必须事先定义固定的长度(元素个数),不能适应数据动态的增减的情况,可以根据下标直接存取,在栈中分配空间,自由度小

链表动态的进行存储分配,可以方便的插入删除数据项,必须根据 next 指针找到下一个元素,在堆中分配空间,自由度大但是申请管理比较麻烦

如果需要快速访问数据,很少或不插入删除元素就应该用数组,如果需要经常插入和删除元素就需要用链表

线程互斥的方法?()

lock 语法糖

Monitor

Mutex

软件设计四大特性?

可维护性 可复用性 可测试性 安全性

什么是MVC?

模型视图控制器,用一种业务逻辑、数据、界面显示分离的方法组织代码

文件流的3种读写方式?

BinaryReader  BinaryWriter

StringReader  StringWriter

StreamReader  StreamWriter

TextReader    TextWriter

JIT和AOT?

jit 实时编译(c# java) 执行慢,安装快,占空间小

aot 预先编译(c++ c)  执行快,安装慢,占内存外存大

观察者的设计原则?

依赖倒转原则(定义对象间的一种一对多的依赖关系)

常用容器类?

Stack 栈,先进后出

Queue 队列,先进先出

List 列表,访问快,修改慢

ArrayList 类似于List 使用object 会引起装箱拆箱,性能不足

Dictionary/HashTable 字典/散列表,查询效率高,占内存大

数组和list区别?

数组在内存中连续存储,索引速度非常快,赋值和修改元素也很简单,但是在数组的两个数据间插入数据很麻烦,而且声明数组时必须指定数组的长度,过长会造成内存浪费,过短会造成数据溢出

list 在声明时需要指定集合内数据的对象类型,对象的大小是按照其中存储的数据来动态扩充与收缩,声明是不需要指定长度

IO的关键字分别有哪些?分别有什么用?

Directory 、 Path 、 File

同步和异步的区别?

同步时单线程,阻塞式

异步时多线程,同时运行多个线程

接口和委托区别?

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

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

在以下情况中使用接口:无法使用继承的场合,完全抽象的场合,多人协作的场合

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

-------------------unity---------------------

Unity生命周期函数有哪些?

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

Unity光源有几种?

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

Unity动画有几种?

关节动画

单一网格模型动画

骨骼动画

矩阵相乘的意义?

用于表示线性变换:旋转,缩放,投影,平移,仿射

自身坐标系和世界坐标系区别?

localposition 自身坐标系是自身的位置,相对于父级的变换的位置

position 在世界坐标系 transform 的位置

协程和线程区别?

多线程程序同时运行多个线程,除主线程之外的线程无法访问 Unity3D 的对象,组件,方法

协程,就是当你在 StartCoroutine 的函数体里处理一段代码时,利用 yield 语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作(迭代器实现的)

异步加载场景的函数?

LoadLevelAsync

unity增加删除和获取组件的方法?

AddComponent 、 Destroy 、 GetComponent

UGUI 、GUI 和 NGUI 区别?

UGUI 是原生的,NGUI 是第三方插件

UGUI 渲染层级靠 Hierarchy 位置,NGUI 靠 Depth 修改

UGUI 不需要添加碰撞 NGUI是射线检测,需要添加碰撞

UGUI 没有tween NGUI 自带tween 插件

UGUI 的 Panel 是 Image NGUI 的 Panel 是容器与mask(遮罩)

UGUI 可以用散图 NGUI 得自己手动打图集,只能用图集里的图片

UGUI 靠 camera 和 world 做3D NGUI 靠 2DRoot 和 3DRoot 做3D

NGUI 锚点可以有多个

GUI 运行时显示,在unity脚本周期 OnGUI 里调用,UGUI 所见即所得,使用了画布和事件系统

Unity 重要的文件夹

Edior            放编辑器脚本

Resources        动态加载资源的文件夹

Plugins          放插件相关

StreamingAssets  资源文件夹,放 AssetsBundle包

unity两个场景之间互相传值的方法。

PlayerPrefs 存档 、 DotDestroyOnLoad 不销毁

material和SharedMaterial区别?

material 修改渲染器材质,shardmaterial 修改工程中的所有使用这个材质的外观

碰撞器和触发器区别?

collider 碰撞器有碰撞效果,可以调用 OnCollisionStay/Enter/Exit函数

trigger  触发器没有碰撞效果,可以调用OnTriggerStay/Enter/Exit函数

什么是DrawCall?

CPU调用图形编程接口,1个模型带一个材质单通道shader渲染一次的过程是1个drawcall

.Net和Mono?

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

点乘和叉乘?

点乘描述了两个向量的相似程度,结果越大两个向量越相似,还可以表示投影

叉乘得到的向量垂直于原来的两个向量

Unity支持的语言?

C# 、 JS 、 Boo

Render,MeshRender和SkinnedMeshRender区别?

Render 是 MeshRender 和 SkinnedMeshRender 的 父类,负责渲染的基类,MehRender 是网格渲染器,SkinnedMeshRender 是蒙皮网格渲染器,用于带g骨骼动画的模型身上

Animator的Layer有什么用?

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

什么是跨平台?

在一个平台上开发的软件或程序可以在其他平台上正常运行显示

Pingpong和Repeat?

Mathf.Pingpong 让数值 t 在 0 到 length 之间往返 t 值永远不会大于length的值,也永远不会小于0。

Mathf.Repeat  循环数值 t,0到 length之间。t值永远不会大于length的值也永远不会小于0。

Lerp,Slerp

Mathf.Lerp  插值 数值 t 在0 到1之间

Mathf.Slerp  平滑插值 t 在0 到1之间

动态加载资源的3种方式?

Resources

WWW (AssetBundles)

AssetDatabase.loadasset

矩阵相乘?(必要条件)

第一个矩阵的行数和第二个矩阵的列数必须相同

获取input,横纵轴的方法?

Horizontal 、 Vertical

LOD和MippingMap?

Lod: 多层次细节,根据模型所处的环境决定渲染资源分配,提高渲染效率

优点:可以根据距离动态渲染不同细节模型,少渲染定点数和面片数

缺点:需要不同模型,加重美工负担,加大游戏容量

MippingMap:为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 Mippingmap(增加33%内存优化GPU)

序列化和反序列化?

序列化是将对象的状态信息转换成可以存储或传输的形式的过程

反序列化是将二进制的数据转化成对象的类或信息

隐藏Inspector字段的方法?

HideInInspector

SerializeField

AssetBundle和Resources区别?

Resources 需要把所有资源全部打入安装包,对版本升级不利

AssetBundle 把资源打成几个小包,用哪个就load那个

旋转使用矩阵,四元数,欧拉角的优缺点

旋转矩阵:能增量旋转,不能插值,但比四元数慢,可能发生矩阵蠕变

欧拉角:不能增量旋转,插值可能遭遇万向锁或其他问题,对给定方位的表达方式有无数种

四元数:能够增量旋转,能够平滑插值,对给定方位的表达方式有二种互为正负

什么会导致unity内存泄漏

程序未能释放已经不用的内存导致内存泄漏

状态机和行为树的区别?

状态机:状态之间需要特定的条件进行跳转,状态节点不需要复用,同一时刻只能有一个状态在执行,状态节点的增加会增加维护成本,做复杂的ai不好维护

行为树:树形结构,将状态封装成高度模块化的行为,行为之间跳转由父节点决定,节点复用性增加,适合做大型复杂的ai

什么是光照贴图?有什么意义?

把一片区域原有光照信息制作成静态贴图,减少实时光照,增大内存优化GPU

光照探针?什么意义?

光照贴图无法对动态物体产生光照效果,增加光照探针使玩家以为实时光照,增加游戏体验

--------------------优化------------------------

优化FPS的方法?

在Edit/Project Setting/Quality中关闭帧数锁定

Application.targetFrameRate = TargetFrameRate;  设置帧率

unity优化内存?

模型顶点优化

UI优化,小图放大显示,图片复用

unity中优化CPU?

视椎体剔除,遮挡剔除(需要烘焙,相机照不到的地方不烘焙)

合理安排图片和材质,使用 unity 批处理,动态批处理顶点不超过900个

合并模型,文理,打包图集

脚本重构

unity中优化GPU?

使用光照贴图,动态光探针,反射探针

Lod、MippingMap(牺牲内存优化GPU)

减少顶点数量,简化计算复杂度

压缩图片,适应显存带宽

GC的产生原因和避免?

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

避免:尽量少new对象,多使用单例对象池

Unity减少GC的方式?

少用 foreach ,谨慎使用 lambda 表达式

unity中怎么手动GC?

DestroyImmediate

Resources.UnLoadUnusedAssets

System.GC.Collect

-----------------Network---------------------

网络数据的序列化方法有哪些?有什么区别?

json:轻量级数据交换格式,具有良好的可读和便于快速编写的特性,对象表示为键值对

protoBuf:google的一种数据交换的格式,独立于语言,平台,是一种二进制的格式

XML:扩展标记语言,用来标记数据,定义数据类型,允许用户对自己的标记语言进行定义的源语言,格式统一,跨平台和语言

。proto转。cs文件,流程?

protogen.exe -i: 源文件 -o:输出文件名  .cs

网络5层协议?

应用层、传输层、网络层、数据链路层、实体层

http,socket,tcp,udp 区别?

TCP 是面向连接的,tcp 的三次握手最低限度上保证了连接的可靠性

UDP 不是面向连接的,消息传输不进行收发确认,开销小传输速度快,实时性好

http协议对应于应用层,是建立在TCP协议之上的一种应用。短连接,连接完自动断开

Socket相当于调用接口(API),用来调取TCP/IP协议。

Socket连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

粘包产生原因,如何解决?

发送方发送多个包到接收方后混做一个包

原因:发送方收集多个分组一起发送,接收方 tcp 接受和应用层读取速度不一致

解决:给没个包体添加包头,包头是包体的长度的字节数组

-----------------Lua---------------------

lua基本数据类型有哪些?

nil 、number 、string 、boolean 、function 、table 、userdata 、thread

lua中什么是元表?

lua 的重载机制,两个表不能直接进行函数运算,这时候定义其中一个表的元表,在元表里定义一个指定函数就可以了

lua中.和:有什么区别?

lua 中对于非面向对象的类,一般用 .  对于面向对象的类用 :

lua 调用 c# 类调用静态函数或字段时用 .  调用成员函数 :

lua中如何实现面向对象?

利用元表机制  __index  __newindex 

pairs和ipairs有什么区别?

pairs 遍历表中的所有键值对,可以遍历所有元素

ipairs 只会遍历数组,不能返回 nil 否则会跳出遍历

dofile和require有什么区别?

dofile 引入模块后,再引入一次会刷新,相当于重新引入

require 引入模块后,再引入一次也不会有任何意义

ulua热更新的原理?

把控制游戏逻辑的代码写成 lua 脚本,在移动端编写 lua 的解析器,通过解析器运行最新 lua 脚本

热更新的流程?

修改 AppConst 的调试模式和更新模式

生成 wrap 文件

打资源包 Buil Bundle

将 StreamAssets 上传资源服务器

打包时修改 游戏名,公司名,修改屏幕分辨率,横竖屏

cstolua的原理和优点?

减少了跨语言调用,代码都用lua写

优点:更好的控制 c# 函数可见性

更快的回收内存

可以支持数组参数

处理二义性

支持重载函数

u3d类型位null检测,对于已经为空的 unity object 进行提示

严格区分枚举类型和 int 值

支持导出模板类

pureMVC框架的结构?

MVC(模型、视图、控制器)

pbc的使用流程?

protoc.exe -o 目标文件 源文件

ulua中如何优化?

尽量减少 c# 调用 lua 的次数

--------------------shader---------------------

什么是渲染管线?

也叫渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。

应用阶段: cpu收集场景信息,将计算好的数据(顶点坐标,法向量,纹理坐标,纹理)发给gpu

几何阶段:顶点坐标变换,光照,裁剪,投影以及屏幕映射 "变换三维顶点坐标和光照计算"

光栅化阶段:将连续的数据转化成离散的数据,这里光栅阶段是指矢量图形转化成像素点的过程

将数据3D场景转换成2D图像,并在屏幕上显示出来的总过程

shader中的数值类型有哪些?

float 32位浮点数

half 16位浮点数

int 32位整型数

fixed 11比特 [-2,2]  精度1/256

bool  布尔数据

string  字符串

sampler  纹理对象的句柄 

Lambert和BlinnPong的计算公式?

漫反射 Lambert :fixed diffuse = max(0 ,dot(normal,lightDir))

漫反射遮蔽(半Lambert):fixed diffuse = max(0 ,dot(normal,lightDir))*0.5+0.5

高光 phong :                                                              Half3 reflectDir = normalize(reflect(-lightDir,normal));                    Float spec = max(0,dot(reflectDir,viewDir));                                Float specValue = pow(spec,_Power);

BlinnPhong 高光:                                                            Half3 halfDir = normalize(lightDir + viewDir));                            Float spec = max(0,dot(normal,halfDir));                                    Float  specValue = pow(spec,_Power);

shaderLab的种类?分别什么区别?

固定管线(已弃用):

为了兼容老式显卡,都是顶点光照,特征是里面出现了形如下面Material块、没有CGPROGRAM和ENDCG块。

顶点和片元着色器 Vertex & Fragment Shader

:功能最强大,最自由的形态,特征是在Pass里出现CGPROGRAM和ENDCG块,编译指令#pragma

最主要的包括:#pragma vertex name 

#pragma fragment name

#pragma target name

#pragma only_renderers name name ... 

#pragma exclude_renderers name name...

表皮着色器(SurfaceShader):可以认为是一个光照shader的语法糖,手游不建议使用

特征是在SubShader里出现CGPROGRAM和ENDCG块。(而不是出现在Pass里。因为SurfaceShader自己会编译成多个Pass。)

顶点函数中常用哪些语义?分别代表什么含义?

POSITION        顶点坐标

TANGENT        切线

Normal          法线

TEXCOORD0 ~ n  纹理坐标

COLOR          顶点颜色

AlphaBlend代表什么阶段?有哪些常见混合方式?

用于两个透明物体的叠加显示效果,Blending 就是处理透明度的,处理光栅化的最后阶段显示在屏幕上的颜色

常见混合方式:

Blend zero one :仅显示目标的RGB 无透明通道处理(alpha为1)

Blend one zero :仅显示源的RGB 无透明通道处理(alpha为1)

Blend one one :目标和源的RGB值相加,无透明通道处理(alpha为1)

Blend ScrAlpha zero :仅显示源的颜色(处理透明通道)

Blend ScrAlpha OneMinusDstAlpha :源RGB * alpha + 目标RGB * (1 - alpha)

ShaderForge中Fresnel节点代表什么含义?

边缘亮显的效果

RenderType的Opaque和Transparent有什么区别?

渲染标签类型 Opaque 是不透明的 , Transparent 是透明的

RenderQueue中有哪些参数?

Background ,Geometry,AlphaTest ,Transparent,Overlay   

shader中Fallback什么意思?

在运行平台硬件不支持该shader的情况下,选择替代shader。

------------------cocos2dx & C++-------------------

NULL和nullptr的区别?

NULL在c++中是一个宏,是一个空指针常量,如果将NULL扩展为常数,那么这个数是0,类型为int。所以,常数0既是整型常量,也是空指针常量,这就有可能导致二义性问题。因此,c++11新标准引入了nullptr,将其作为空指针常量。

虚继承的意义?

虚继承不管父类派生出多少个子类在内存中总存在一套数据,解决了多父类重复成员只保留一份的问题,普通继承一般会存在于派生类个数对应的N个数据

new,delete,malloc,free的区别?

new、delete是C++中关键字,需要编译器支持,而malloc和free是标准库函数。需要头文件支持,它们都可用于申请动态内存和释放内存。

new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。

new是强制类型的,malloc不是,需要类型转换

new 可以调用构造函数在声明的时候初始化

malloc只是分配空间,需要在其他地方初始化

而delete不仅会释放空间,在释放前会调用析构函数

虚函数和纯虚函数有什么区别?

虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。

虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。

虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。

虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。

子类析构是需要手动调用父类的析构吗?

不需要。析构时,先析构派生类,再析造基类。

什么是引用?什么是指针?有什么区别?

指针的本意是可以指向一块地址空间,这就意味着指针可以指向未初始化的内存空间。

引用的意思更像是一个对象的别名,是指代这个对象的一个名字。

引用类似于一个常量指针,当指定了一个对象的引用,就不能把这个引用改变成其他对象的引用了。

将引用作为函数返回值的好处?

好处:在内存中不产生被返回值的副本

注意事项:不能返回局部变量的引用

不能返回函数局部new分配的内存的引用

可以返回类成员的引用

流操作符重载返回值申明为引用的引用

在另一些操作符中,不能返回引用:+-*/ 四则运算符

C++是不是类型安全的

类型不安全

宏定义和const常量有什么区别?

define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。

const定义的常量,在程序运行时在常量表中,系统为它分配内存。

define定义的常量,预处理时只是直接进行了替换。所以编译时不能进行数据类型检验。

  const定义的常量,在编译时进行严格的类型检验,可以避免出错。

数组和指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。

当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

复杂声明void*(*(*fp1)(int))[10]代表什么含义?

fp1被声明成为一个函数的指针,该函数返回指向指针数组的指针.

cocos命令有什么用?请写出创建工程的命令

cocos new 项目名 -p com.xx.xx -l 项目语言(cpp) -d 创建位置

cocos2dx中场景图的结构和遍历方式

cocos2dx使用图片和图集的区别?

cocos2dx中action动作中,to和by的区别?

By相对节点对象的当前位置  To 绝对位置

cocos2dx中获得鼠标点击事件的方法?

//创建监听

_mouseListener = EventListenerMouse::create();

_mouseListener->onMouseMove = CC_CALLBACK_1(MouseTest::onMouseMove,this);

_mouseListener->onMouseUp = CC_CALLBACK_1(MouseTest::onMouseUp, this);

_mouseListener->onMouseDown = CC_CALLBACK_1(MouseTest::onMouseDown,this);

_mouseListener->onMouseScroll = CC_CALLBACK_1(MouseTest::onMouseScroll, this);

//绑定监听

_eventDispatcher->addEventListenerWithSceneGraphPriority(_mouseListener, this);

cocos2dx中开启update的方法

this->scheduleUpdate();

cocos2dx中如何判断鼠标点击了图片?

判断点击的图片 tag

判断鼠标点击的像素点是否在图片中

-----------------cocoscreator & JS--------------------

js的基本数据类型有哪些?

String 、Number 、Boolean 、Null 、Undefined 、Symbol

js的var和let区别?

var定义的变量可以修改,如果不初始化会输出undefined,不会报错。

let是块级作用域,函数内部使用let定义后,对函数外部无影响。

js的use strict的用法有什么用?

严格模式下你不能使用未声明的变量。

消除代码运行的一些不安全之处,保证代码运行的安全;

提高编译器效率,增加运行速度;

为未来新版本的Javascript做好铺垫。

js的变量提升指什么?

函数及变量的声明都将被提升到函数的最顶部。 变量可以在使用后声明,也就是变量可以先使用再声明。

只有声明的变量会提升,初始化的不会。

js继承使用哪个关键字?

extends

js中require和export的作用?

遵循 CommonJS/AMD,只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化。

typeof和instanceof的区别?

经常用到来判断一个变量的类型,以及是否为空

typeof的返回值是个字符串,返回的字符串表达了程序员想要输出的变量类型

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。

cc.Class 声明有什么作用?

声明一个类

cc中如何声明数组?

default:[]

cc中如何获取自身其他组件?

this.node.getComponent()

cc中如何查找自己的孩子?

this.node.getChildByName("xxx");

cc.find("xxx", this.node);

cc的生命周期有哪些?

onLoad 、start 、update 、lateUpdate 、onDestroy 、onEnable 、onDisable

cc中如何销毁节点?

node.destroy()

cc中常驻节点有什么用?怎么设置?

通过常驻节点进行场景资源管理和参数传递

使用 cc.game.addPersistRootNode(this.node)添加为常驻节点

在creator的引擎里面只有根节点才能够被成功的设置为常驻节点

cc中如何动态加载资源?

所有需要通过脚本动态加载的资源,都必须放置在 resources 文件夹或它的子文件夹下

resources 需要在 assets 文件夹中手工创建,并且必须位于 assets 的根目录

cc.loader.loadRes

cc中如何发射和监听事件?

    cc.SystemEvent.EventType.KEY_DOWN (键盘按下)

    cc.SystemEvent.EventType.KEY_UP (键盘释放)

    cc.SystemEvent.EventType.DEVICEMOTION (设备重力传感)

    自定义回调函数:callback(event);

cc中如何判断两个精灵发生碰撞?

在 rigidbody 中 开启碰撞监听

开启碰撞监听,定义回调函数

你可能感兴趣的:(2019Unity3D开发工程师面试题)