1、简单的自我介绍(出自腾讯、网易):
自我介绍是向对方展示自己的表达能力和沟通能力,关乎着面试官的第一印象,搞不好可能会打上标签。因此这块值得求职者引起足够的重视。答此题时,可提前准备相关文案,面试时大大方方从容陈述,时间控制在1分钟内。回答的方向:学历背景、从业背景、擅长的内容、性格爱好,展现自己阳光自信的一面。
我叫XXX,专业是XXX,毕业于XXX。我可以熟系地使用unity引擎内的相关组件和api,可以熟悉的使用c#语言编写程序逻辑,解决技术问题,可以熟练的使用UGUI进行UI的制作。
在大学结束期间独立的完成了一些游戏demo,在制作的项目中运用了各种技术、unity常用的插件、游戏制作中常用的算法和设计模式。
有较强的学习能力和抗压能力;学习过程中我还会将学习的内容进行归纳总结,方便将来能够更好的复习和纠错;有良好的逻辑思维能力和编程习惯,可以独立的解决技术问题;工作认真,富有责任感,有良好的团队精神和沟通能力;对游戏制作有极大的热忱。
我喜欢旅游(根据面试的公司做出适合的更改)和玩游戏,我认为游戏不仅仅只能用来娱乐,还能锻炼大局观和配合的能力。也喜欢骑自行车去水库公园这些地方去呼吸新鲜空气放松一下,给自己充充电。
2、平时如何学习?最近在学习什么新技术?最近在看什么书?(出自腾讯、网 易)最近在看什么书:
此题,是探测应聘者的学习能力,是否是个主动学习、热爱学习的人,是否有持续提升技术的意识。在回答具体看什么书的时候,一定要看过呀,可能面试官会具体问章节内容,验证下你的可信度。
3、未来的职业规划:
背后的逻辑是,看你是否是一个头脑清晰有明确成长规划的人。其实也在看你的潜力,想看你给他画饼,先有鸡后有蛋的问题,因为有饼了,才有希望,才谈得上你长期对公司的输出价值。建议,求职者,与本职业属性无关的话题不要谈,也不要谈你改变世界的宏愿,因为饼太大,她吃不上,要脚踏实地的,可以讲深耕技术,成长为某一领域专家级别的人。
第一年我的专业技能的熟练度能够到达一定的水准,比如说我完成功能,完成任务的效率要比一般人要高,在这个目标的基础上能够完成一些战斗之类相关的功能的实现,第二年能够承担一些战斗相关的简单的工作,可以做一些简单技能的效果,能够做一些比如说UI这方面的优化的掌握。第三年我希望能够掌握一些渲染方面的技能。
4、遇到的困难怎么解决的:
首先心态上要戒骄戒躁,努力的分析问题,去找解决方案。比如去社区群中寻找解决方法,找不到再去问老人。
5、一个优秀的程序员需要具备哪些素质:
1:团队精神和协作能力。
2:制作技术文档能力。
3:规范书写代码的能力。
4:需求理解能力。
5:学习总结的能力。
6、你认为工作中比较影响工作结果的因素:
1.心态:自我心态对工作的影响是非常大的,只有你能够以较好的姿态去面对在工作过程中可能遇到的各种各样的问题,才有可能让后期的工作执行下去。2.团队之间的协作:若不能好好的合作的话,就会是像一盘散沙一样处处出现纰漏,大小麻烦也会接踵而来。
7、怎么看待加班:
如果出现加班的情况,我首先会反思加班的原因是否出在我个人的身上。是不是因为工作能力不足或者工作效率低,才导致需要后期加班才能够补上?如果是,我会尽量去补上自己在工作上的不足,提高工作的效率,减少加班情况的发生。
行业加班是常态的话可以这样回答:
如果有需要,我非常愿意配合进度,进行加班。但我还是会尽力在周一到周五工作日之内,将预定的内容全部做完,让自己好好休息,然后充好电,下周继续高效工作。同时,我也喜欢有这种高效氛围的团队。
8、 是什么让你选择游戏行业(出自腾讯、网易)
核心命题在于应景的一句话:兴趣是最好的老师。这将潜移默化的影响着你的成长性及潜力。因此回答此题的建议是,因为爱所以爱。
我从小到大都喜欢玩游戏,玩的游戏种类也很多,平时没事时也喜欢看一下游戏视频流程解说。在大学时我们开了一门Unity的课程,这让我对游戏开发产生了浓厚的兴趣。
9、介绍下你的项目(出自腾讯、网易、米哈游)
这个题的潜台词是你对过往项目输出的价值,让面试官感受到自己的存在感,同时看与该岗位的匹配度。并为后续技术问答层面做铺垫。回答项目经历的顺序按照由近及远作答,挑亮点介绍。
10、项目中最有成就感的事(出自腾讯)
最有成就感的事儿,一般是超出当前你的技术级别边界的事情,或者对项目贡献较大的事情,换句话说就是超越上级对你的预期的事情。所以,求职者需要考虑下有没有。当面试官提出这个问题的时候,想get到的点是,你有没有主动发现问题的意识,有没有解决问题的抗压能力,有没有上进心
11、为什么投我们公司(出自腾讯、网易、米哈游)
背后的逻辑是,想探测下应聘者对本公司的好感度,了解下入职意愿,另外可能也想探测下求职者是否是个有准备的人。所以,应聘者,就需要提前了解下该公司的历史、产品,拍马屁的艺术是天生的哈,不做赘述了。
12、你准备实习多久,对实习地点在XX怎么看(出自腾讯)
背后的逻辑是探测应聘者的诚意,并且也观察应聘者是否是一个服从公司安排的人。回答此题时,如果你特想进入该公司,建议表现出服从安排的倾向。
13、有没有写博客的习惯?(出自腾讯、网易)
背后的逻辑是,看求职者是否有阶段总结问题的意识,编程的狂热度。不做赘述。
14、以后你身边的同事都是研究生和博士生,你有什么想说的吗?如何看待这个问题?(出自腾讯、网易)
背后的逻辑是,看你的心态和吃苦耐劳的决心。不做赘述。
15、目前有哪些offer?你会如何选择?为什么?(出自腾讯、网易)
这里经常会有求职者向大厂显示offfer的存在感,以此溢价。在向大厂展示时,一定是同级别或者高于本厂的公司,这才是博弈桌上的筹码,这也是证明自己的价值,但是不要透漏具体offer公司的名字,可以采取隐晦暗示。
至于选择,其实是看你的视野,你的格局,是看当下,还是未来。其实当你暗示出对该公司暧昧意向较大时,如果该公司想要你,多半会开出至少差不多的条件的。
16、期望薪资是多少(出自腾讯、网易)
过高,可能会判定你好高骛远,迷之自信;过低,可能会揣测你是不是不自信。建议,根据面试感受,结合市场价,给出合理报价就可以了。
17、有什么想问我的(出自腾讯、网易)
其实,这里是给求职者权利反转的机会。意在探测你对本公司的兴趣程度,也是你的诚意程度。可以询问些不疼不痒,无害还加分的问题,比如,了解下产品研发阶段、个人学习成长途径等等。
1、AssetBundle读取时主要用的方法是什么?
1. 异步加载,Async Loading。
2.同步加载,Sync Loading。
3.本地加载,LoadFromFile。
2、LightMap是什么?有什么作用?
光照贴图,能够减少CPU的性能消耗。
3、打包有使用过什么自动化工具吗?
AssetBundle Browser.
4、RenderTexture是什么,它有什么作用?
RenderTexture是一种特殊的纹理,,它连接着一个FrameBufferObject的,存在于GPU端的Texture。它可以用来制作汽车后视镜,可以将其拉到材质球上,用来动态显示Camera的内容。也可以制作选择动态的角色。
5、谈一谈你所知道的Unity内存优化方法
Unity引擎中的内存主要分为三部分,
1.Unity3D内部的内存。
2.Mono的托管内存。
3.若干我们自己引入的DLL或者第三方DLL所需要的内存。
Unity3D内部内存
Unity中的资源主要是纹理,网格、音频等等,GameObject和各种组件。引擎内部逻辑需要的内存:渲染器,物理系统,粒子系统等等。这些资源都有各个能够优化的点比如
Texture:
1.texturepacker合并整图。
2.Android平台⽤ ETC2 格式压缩,IOS⽤ PVR/ASTC 压缩纹理
3.⼀般情况下,关闭纹理资源的“Read & Write”,因为开启该选项会使纹理内存增⼤⼀倍
Mesh:
1.如果不需要Color,tangent,Mesh去掉她们再合并,如果不这样做,unity的combinedMesh会为每个mesh加上这些属性,造成内存开销。
2.开启Mesh Compression(压缩)
3.关闭mesh的read & write
Mono托管内存
Mono的内存分配就是很传统的运行时内存的分配了:
值类型:int,struct,bool,float这种在栈中分配的内存。
引用类型:可以狭义的理解为各个类的实例,这些是在堆中分配的内存,这里就涉及到GC垃圾处理器了。
6、什么是DrawCall?如何降低DrawCall?
当CPU准备好场景数据,设置好渲染状态,就会调用DrawCall命令,开启一个渲染过程。
要降低DrawCall,可以把众多小的DrawCall合并成一个DrawCall,减少CPU提交DrawCall次数和时间。
7、Unity中的碰撞器和触发器的区别?
触发器是碰撞器的一个属性。
当未勾选Is Trigger时两个可以产生碰撞的物体可以发生物理碰撞。这时可以调用OnCollisionEnter/Stay/Exit函数。
当勾选Is Trigger时碰撞器就成为了触发器两个可以产生碰撞的物体会穿过对方,可以调用OnTriggerEnter/Stay/Exit函数。
8、如何处理AssetBundle资源依赖问题?
资源依赖就是,模型A使用了一个材质B,而材质B中又包含了一个贴图C。那么他们的实际依赖关系便是:模型A——》材质B——》贴图C。
换言之,如果我们想在游戏中使用模型A,那么我们必须提前加载材质B。但是如果我们想要使用材质B,那么我们又必须提前加载贴图C。这就是一个最简单的依赖模型。
但是当一个贴图或材质被不同的多个模型使用,打包的时候就会将这个贴图或者材质打包多次,内存被过多的消耗,这时可以将这个贴图或者材质考虑将其打包成一个单独的AB包,在加载ab包里的资源时,我们需要先加载该ab包依赖的其余ab包。
9、Unity3d中的灯光有哪些?
平行灯:unity编辑器中的太阳光就是平行灯。
点光源:灯泡的灯。
聚光灯:点光源沿着一个圆柱体发出光线,距离衰减严重。
区域光:拥有一个较大的发光表面,阴影柔和,仅在光照贴图中显示。
10、有接过SDK吗?
SDK:软件开发工具包
11、动态加载资源的方式有哪些?
1. 工程中存在的资源,通过Resource下的Load方法,动态加载Resources文件夹中的预制体。
2. 工程中不存在的资源,需要借助AssetBundle,首先将资源打包上传到服务器,之后下载到本地之后加载到内存中创建。
12、RectTransform和Transform的关系和区别是什么?
RectTransform 是针对于UI上的,凡是在在canvas组件下或者具有canvas组件的2d对象,他都recttransform组件,那些在3d空间下不受canvas控制的对象都是transfrom组件。
RectTransform 的父类为 Transform,我们可以把RectTransform看做Transform的升级版。
RectTransform 是2D的,Transform是3D的。
13、请尝试写一个跟踪弹逻辑(平滑跟踪)
14、如何安全的在不同工程间安全地迁移asset数据?
1.将Assets文件夹和Library文件夹一起迁移
2.导出包package
15、向量的点乘、叉乘以及归一化的意义是什么?
点乘的意义:给出两个向量可以求出夹角。
叉乘的意义:
归一化的意义:将向量a等比例缩放为单位矢量,在计算时我们无需考虑具体的模长所带来的影响,只考虑向量的方向。
16、Unity3d的物理引擎中,有几种施加力的方式,请分别描述出来
两种:rigidbody.AddForce、rigidbody.AddForceAtPosition
17、MeshRender中material和sharedmaterial的区别?
sharedMaterial表示共享材质,修改共享材质会改变所有使用该材质的物体,并且编辑器中的材质设置也会变
material表示材质实例,修改材质仅会改变物体的材质,如果该材质被其他渲染器使用,将克隆该材质用于当前的渲染器
每次引用Renderer.material的时候,会生成一个新的material在内存当中,需要注意内存泄漏。销毁物体的时候需要手动销毁material(Destroy(material)),或者在切换场景的时候调用Resources.UnloadUnusedAssets也可以删除该材质。
18、什么是渲染管线?并写出渲染管线的3个阶段,说出顶点着色器和片元着色器在其中的哪些阶段进行
像工厂流水线一样,把游戏世界里的各种数据(光,模型,场景,效果)通过一个过程 将结果展现。
渲染管线的几种阶段:
在 UnityShader入门精要中,分成了大体的三个阶段:应用阶段,几何阶段,光栅化阶段。
我们可以更详细的把他简单的分成更多阶段:
1.应用阶段
渲染引擎将场景中的所有数据发送给GPU
2.顶点着色器阶段
处理顶点信息,如顶点的空间转换,顶点偏移
3.裁剪阶段
在顶点着色器将顶点转换到投影空间时,并未进行裁剪。
在之后的该阶段才会将在范围外的模型剔除,如果一个模型正好被范围切割,那么会留下在范围内的部分,生成新的顶点。并将范围外的部分剔除。
其中一般整个模型都在范围外的,引擎会在应用阶段的时候就将其剔除。这样就少做一些顶点着色器的处理。
背面剔除
将法线与相机方向的点积小于0的面给剔除掉
5.屏幕映射
将NDC下的顶点映射到屏幕中
6.图元装配和光栅化
将映射到屏幕中的顶点,组成三角形。到目前为止游戏渲染只支持三角形,无论是什么模型图像,最后都会被拆分成很多个三角形。
所以图元也可以认为就是三角形。
光栅化:
将顶点组成的三角型,映射到片元上(可以当成像素),其中每个片元的信息都是用三角形三个顶点的信息进行插值而来。
7.片元着色器阶段
处理片元,如贴图采样,光照计算等等,其主要的目的就是输出颜色
8.输出合并:
混合
如果开启了混合,就会将生成的片元颜色和缓存区的颜色进行需要的混合。
各种测试:
Alpha测试,深度测试,模版测试
9.后处理
在所有渲染之后,可以当成将渲染的画面再进行一次渲染。
举个例子:排了照片(渲染的画面)后,对照片进行调色P图(后处理)
19、简述四元数Quaternion的作用,四元数对欧拉角的优点?
四元数用于表示旋转
相对欧拉角的优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
20、单例模式的作用和缺点是什么?
【优点】
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
【缺点】
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用
21、UI框架是如何实现的?
UI框架是独立于具体项目的,一个项目的框架可以在另一个类似项目中使用。同时新增UI时也能容易进行扩展。
简单的UI框架包含
1.一个UI脚本的统一基类。
2.UI框架的核心管理类。
3.打开UI的功能类。
4.存储在Resources文件夹下的UI预制体。
22、如何用Animtor做融合动画?
23、在项目里都用过哪些设计模式?
1.单例模式,单例模式只能new一个实例对象,避免频繁创建对象,节约内存。
2.工厂模式,工厂模式的目的是创建一个对象的接口,让其子类自己决定具体实例化哪个工厂类,工厂模式使其具体创建过程延迟到子类进行。
3.观察者模式,目的是定义对象之间一对多的依赖关系,当一个对象发生改变,依赖于这个对象的也能接到信息并该变。
24、Lua多继承如何实现?
其实多重继承没什么特别的,除非两个将要被继承的类有相同的函数名和属性,否则,处理起来很简单。无非就是在多个table中查找某个字段而已。Lua里的继承就是在别人的table里查找自己不存在的字段罢了。那么,单继承与多重继承的差别也在这里,一个是只查找一个table,另一个是查找两个或以上的table。
1) 参数是一个可变参数,我们要将多个被继承的类作为参数传递进来
2) parents用于保存这些被继承的类
3) 创建一个新的table——child,它就是我们想要的那个继承了多个类的子类
4) 给child设置元表,并且设置__index元方法,__index元方法可以是一个函数,当它是一个函数时,它的参数就是元表所属的table,以及要查找的字段名。
5) 我们在__index元方法函数里调用search函数,从多个父类中查找所需的字段。于是,当调用child的某个函数时,就会从各个父类中查找,这已经完成了继承的工作了。
6) 接下来就是我们所熟悉的new函数,用来创建child的子类。
7) 最后返回child,一切都完成了。
看似很复杂,其实还是对__index的应用而已。
25、UI多层级叠加是如何处理的
最简单的解决方案,把特效和模型变成RT,就和图片一样处理,直接降维打击。但是这种适合处理模型,特效消耗比较大。
另一个方法是用多个相机,但当层级多的时候,那真的是很多个相机才行,并且相机多了可能有性能问题。
26、写一个算法,将数字67、58、43先转换为二进制,再转换为12位字符串(不够12位的话用0补齐)。如5的二进制为101,对应的12位字符串为000000000101
代码如下:
int[] numbers = {5,67,58,43};
foreach(int number in numbers)
{
string a = Convert.ToString(number, 2);
Console.WriteLine("{0,-5}转换成2进制-->{1}", number, a);
string b = string.Format("{0:d12}", int.Parse(a));
Console.WriteLine("12位字符串-->{0}", b);
}
28、Lua为什么能进行热更新?
LUA解释型语言,并不需要事先编译成块,而是运行时动态解释执行的。
那C#为什么不做成解释型语言呢?因为C#的定位是一个追求效率且功能强大的编译型语言。这样LUA就和普通的游戏资源如图片,文本没有区别,因此可以在运行时直接从WEB服务器上下载到持久化目录并被其它LUA文件调用。
29、请用Shader实现简单的Phong光照模型,至少包含放相关和环境光的计算
30、Lua和C#是如何进行交互的?
C#与Lua进行交互主要通过虚拟栈实现,栈的索引分为正数与负数,如果索引为正数,则1表示栈底,若果索引为负数,则-1表示栈顶。
C# Call Lua:由C#先将数据放入栈中,由lua去栈中获取数据,然后返回数据对应的值到栈顶,再由栈顶返回至C#。
Lua Call C#:先生成C#源文件所对应的Wrap文件或者编写C#源文件所对应的c模块,然后将源文件内容通过Wrap文件或者C模块注册到Lua解释器中,然后由Lua去调用这个模块的函数。
从内存方面解释说白了就是对栈进行操作
C# Call Lua:C#把请求或数据放在栈顶,然后lua从栈顶取出该数据,在lua中做出相应处理(查询,改变),然后把处理结果放回栈顶,最后C#再从栈顶取出lua处理完的数据,完成交互。
31、请使用一个int变量记录多个状态?如记录英雄同时存在跑步、攻击、跳跃等状态,并判断英雄是否有某个状态
使用枚举分别对跑步攻击跳跃等状态进行定义
32、请写一个你熟悉的游戏类型(如贪吃蛇),并说明这个游戏类型可抽象出哪些模块
FPS类型游戏,可抽象出以下模块:
1.登录注册模块。
2.更新模块。
3.射击模块:武器类型,武器技能,弹道,威力,攻击方式,攻击距离。
4.玩家模块:移动,跳跃。
5.敌人模块:攻击,受击,技能。
6.道具模块:可直接使用的道具,不可直接使用的道具,货币类道具,道具期限。
7.UI界面模块。
33、如何优化性能、内存、包体大小?有借助什么工具?
资源压缩
纹理(格式,尺寸)- 减少 内存 包体
模型(点面数量这个之前说 扒出来的资源,不好改,其实 *.obj, *.fbx 都可以放到 3D MAX 修改后重新导出即可,但是也要工作量) - 减少包体
动画精度压缩,动画帧删减(可能会导致部分动作精度不足,会产生小量的抖动) - 减少 内存 包体
烘焙(烘焙纹理精度降低,方向光光贴删除,一般需要近距离的才会用到,也可以减少用到烘焙的地方的纹理大小) - 减少 内存 包体
画质分档(低中高)
- 分档规则:
- 不同项目的分档规则都是不同的(CPU 通用算力、内存大小,Graphics API 的最高支持版本,GPU算力、显存大小,系统版本,如:Android 多少版本)
- 具体要看使用到什么版本的功能(压缩格式,Graphics API 版本特性,对内存的需求量,等)
- 在游戏第一次运行的时候,进去游戏前,就要给玩家设备定档
- 在定档完毕自动帮玩家选择 低中高 对应的画质级别
- 纹理:
- 纹理默认 mipmap 级别 - 低中高:1/4 mipmap;1/2 或 1,看情况;1/1 原始 mipmap 值0; - 提升缓存命中率
- 渲染分辨率:
- 低中高(75%, 85%, 100%)- 减少 片段着色器压力,和 绘制 内存、显存、带宽的占用
- 阴影:
- 低中高:无;低质量,阴影距离小;原始质量,阴影距离原始值 - 减少:内存、显存 占用
- 抗锯齿:
- 低中高:无;无;x2;- 减少:内存、显存 占用
- 后效:
- 低中高:全无;删减部分;全部保留; - 减少:内存、显存 占用
- Shader LOD:(但是这个会增加 shader 变体,看情况而选择是否需要优化,如果本身 shader 效果简陋、消耗能接受,就不需要处理这步)
- 低中高:最大限度的删减 部分光照、或是逐片段挪到逐顶点光照 效果;删减部分 光照效果;保留所有效果
- 分档后有什么优缺点:
- 优点:
- 让部分机型的兼容性、运行流畅性 提高
- 缺点:
- 工作量增加(美术资源、程序代码都要增加,这些都需要时间)
- 包体额外增加,shaderlab LOD, model LOD, texture mipmap 的增加大概会让包体增加 1/3
- 整体来说是利大于弊的(毕竟 硬性指标:兼容性、流畅性 摆在那里)
一般低端机,可以再 15~24 FPS,中端机再 30 FPS,高端机要:30~60 FPS
34、不同的手机设备尺寸分辨率都不一样,该如何进行适配?
我们在项目开发时通常都会在一个标准的分辨率下进行开发,但我们发布的时候则会发布到不同的平台和设备上去,不同的平台和设备他们的分辨率则是不一样的。所以适配需要解决以下两个方面的问题:
多分辨率下UI的大小尺寸保持不变。(方案:Canvas画布)
根据需求不同可以更改Canvas画布中的Canvas和Canvas Scaler组件中的属性
多分辨率下UI的相对位置保持不变。(方案:Anchors锚点)
更改Rect Transform下的锚点。
35、LineRenderer中的关键参数有哪些?
1. 设置点
一定注意 设置点 要 先设置点的个数
lineRenderer.positionCount = 4;
接着设置对应每个点的位置
lineRenderer.SetPositions(new Vector3[] { new Vector3(0,0,0),
new Vector3(0,0,5),
new Vector3(5,0,5)});
或者
lineRenderer.SetPosition(0, new Vector3(5, 0, 0));
lineRenderer.SetPosition(1, new Vector3(0, 0, 0));
lineRenderer.SetPosition(2, new Vector3(0, 5, 0));
lineRenderer.SetPosition(3, new Vector3(0, 0, 5));
2. 是否使用世界坐标系
决定了 是否随对象移动而移动
lineRenderer.useWorldSpace = false;
3. 是否首尾相连
lineRenderer.loop = true;
36、Unity中如何知道一个游戏包体大小,具体的素材占用情况?
在Unity Console界面右上角点开Open Editor Log
37、说一下游戏中的对象池有什么作用,如何实现?
对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提升复用性,以节约资源的消耗,可以有效避免频繁为对象分配内存和释放堆中内存,进而减轻垃圾回收器的负担,避免内存抖动。
实现:
https://blog.csdn.net/lfanyize/article/details/105694631
38、如何处理场景中物体的点击事件?
鼠标点击3D物体触发,Unity从本质上来说有两种:一种是通过事件(event)触发,一种是通过射线(ray)判断穿过的物体触发。
1.通过事件,实现接口IPointerClickHandler
2.通过事件,附加脚本EventTrigger
3.通过射线,RayCastHitControl
https://blog.csdn.net/wealupa/article/details/117604939
39、事件中心有什么作用?如何实现?
40、TCP协议与UDP协议的区别
41、请简述GC产生的原因,并描述如何避免?
如果有堆内存被系统判定为不再使用,那么由垃圾回收器GC进行回收
避免产生堆内存对象,减少new产生对象的次数
string可改为StringBuilder
42、LOD和MipMap分别是什么?并简要描述他们的优缺点
LOD:全称Level Of Detail,中文翻译“细节级别渐变”,顾名思义,不同的级别展示不同的细节。原理:当模型离摄像机(可以是人物摄像机或其他摄像机)很远时,然后根据距离的远近使用不同模型级别,远的时候就选择低级别的模型,近的时候选择高细节模型,这样就可以减少模型上面的顶点和面片数量从而提高性能。
mipmap针对的是纹理贴图,大白话就是,一个模型身上会有贴图,当我们对这个贴图使用了MipMap技术之后,那么在游戏运行中这个模型的贴图会根据摄像机距离模型的远近而调整不同的不同质量的贴图显示。
43、Lua中pairs 和 ipairs区别是什么?
均可以用来遍历集合,但是两者有区别。
异:对于有key的集合:
ipairs从第一个数字key开始,依次输出所有的key+1的键值,遇到字母下标并不会结束遍历,只是不输出而已,如果遇到nil则退出;
pairs无序输出字母类型key或者数字类型key的键值,遇到nil不输出,但不会停止遍历;
44、请为任意类型的数组,拓展一个获取数组中随机索引对应值的方法
45、反射的实现原理是什么?