Unity技能题汇总.docx
- 文档编号:14111559
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:16
- 大小:26.24KB
Unity技能题汇总.docx
《Unity技能题汇总.docx》由会员分享,可在线阅读,更多相关《Unity技能题汇总.docx(16页珍藏版)》请在冰点文库上搜索。
Unity技能题汇总
Unity技能题汇总
1、u3d中碰撞器和触发器的区别?
碰撞器会有碰撞的效果,IsTrigger=false,可以调用OnCollisionEnter/Stay/Exit函数。
触发器没有碰撞效果,isTrigger=true,可以调用OnTriggerEnter/stay/exit函数
2、unity3d从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法。
Awake--->Start--->Update-->FixedUpdate-->LateUpdate--->OnGUI-->Reset-->OnDisable-->OnDestory;
3、Unity3D中的协程(Coroutine)和C#线程之间的区别是什么?
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。
StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜。
4、拿到一个对象上脚本的方法是什么?
GameObject.GetComponent<>();
5、localPosition与Position的使用区别?
localPosition:
自身位置,相对于父级的变换的位置。
Position:
在世界坐标transform的位置
6、获取、增加、删除组件的命令分别是什么?
获取:
GetComponent增加:
AddComponent删除:
Destroy
7、请描述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它?
Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。
移动设备下可以使用对象池来生成和销毁prefab
8、移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?
LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。
官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
9、物理更新一般放在哪个系统函数里?
FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。
FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。
Update就比较适合做控制。
10、Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数。
PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
11、物体发生碰撞的必要条件
两个物体都必须带有碰撞器(Collider),带有碰撞检测方法的物体还必须带有Rigidbody刚体。
12、C#中所有引用类型的基类是什么?
引用类型的基类是System.Object值类型的基类是System.ValueType
同时,值类型也隐式继承自System.Object
13、请描述Interface与抽象类之间的不同
抽象类表示该类中可能已经有一些方法的具体定义,但接口就是只能定义各个方法的界面,不能具体的实现代码在成员方法中。
类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。
实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。
14、简述四元数的作用,四元数对欧拉角的优点?
四元数用于表示旋转
相对欧拉角的优点:
1)能进行增量旋转
2)避免万向锁
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
15、在场景中放置多个Camera并同时处于活动状态会发生什么?
游戏界面可以看到很多摄像机的混合
16、在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数
三个阶段
1.OnCollisionEnter(进入碰撞)2.OnCollisionStay(逗留碰撞)3.OnCollisionExit(当退出碰撞)
17、Unity3d提供了几种光源类型,分别是哪几种?
四种。
平行光:
DirectionalLight点光源:
PointLight
聚光灯:
SpotLight区域光源:
AreaLight
18、请描述为什么Unity3d中会发生在组件上出现数据丢失的情况
一般是组件上绑定的物体对象被删除了
19、Mecanim系统中,BodyMask的作用是?
指定身体的某一部分是否参与渲染
20、什么是矢量图
矢量图:
计算机中显示的图形一般可以分为两大类——矢量图和位图。
矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。
例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。
由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。
矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色彩层次丰富的逼真图像效果。
21、请简述值类型与引用类型的区别
区别:
1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址。
2.值类型存取快,引用类型存取慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。
4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。
5.值类型继承自System.ValueType,引用类型继承自System.Object。
22、C#中所有引用类型的基类是什么
引用类型的基类是System.Object值类型的基类是System.ValueType
同时,值类型也隐式继承自System.Object
23、请简述关键字Sealed用在类声明和函数声明时的作用。
类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
24、U3D中用于记录节点空间几何信息的组件名称,及其父类名称
答:
Transform父类是Component
25、为何大家都在移动设备上寻求U3D原生GUI的替代方案
OnGUI很耗费时间,使用不方便
26、请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
当物体是否可见切换之时。
可以用于只需要在物体可见时才进行的计算。
27、你用过哪些插件?
一界面制作推荐:
NGUI
二2D游戏制作推荐:
2DToolkit
三可视化编程推荐:
PlayMaker
四插值插件推荐:
iTween,HOTween
五路径搜寻推荐:
SimplePath
六美术及动画制作推荐:
RageSpline,SmoothMoves
七画面增强推荐:
Bitmap2Material,StrumpyShaderEditor
八摄像机管理推荐:
SecurityCamera
九资源包推荐:
NaturePack
十、造路插件EasyRoads3D
28、Unity3d的物理引擎中,有几种施加力的方式,分别描述出来
rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。
29、移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?
LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。
官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
30、当游戏中需要频繁创建一个物体时,我们需要怎样做能够节省内存?
使用预制物体对象Prefab,然后复制创建。
31、Lod是什么,优缺点是什么?
LOD(Levelofdetail)多层次细节,是最常用的游戏优化技术。
它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
32、MipMap是什么,作用?
MipMapping:
在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。
33、Application.loadLevel命令为:
(A)
A加载关卡B.异步加载关卡C.加载动作
34、编辑器类存放路径是什么?
工程目录下的Assets/Editor文件夹下。
35、请简述向量的点乘,向量的叉乘以及向量归一化的几何意义?
点乘的几何意义是:
计算两个向量之间的夹角,以及在某一方向上的投影;
叉乘的几何意义是:
创建垂直于平面,三角形,或者多边形的向量;
36、请简述unity游戏引擎的特性。
a、支持多平台发布
b、可视化编辑,所见即所得
37、请简述你在unity中比较擅长的技术,并介绍这些技术是如何使用的。
例如:
动画系统,unity新的动画系统为mecanim动画系统。
新的动画系统可以使用状态机来控制角色动画的切换。
同时,如果是标准的人形骨骼,mecanim动画系统还能实现动画的复用。
38、请简述使用unity引擎进行开发容易遇到的一些问题。
a.上手容易精通难:
对于游戏开发经验较少的团队来说,使用Unity引擎能够快速开发出游戏原型,但是当对游戏内容进一步细化,或者游戏规模开始变大的时候,如果对Unity引擎底层了解不够,项目本身就会失去控制,不是内存占用超标,就是性能严重降低。
b.资源管理的困难:
因为是跨平台的缘故,Unity引擎的代码驱动模式与传统的数据驱动之间的差异,与原操作系统的文件系统脱钩,造成资源管理难题。
c.网络连接:
U3D本身集成的网络模块并不是为大规模C/S结构的游戏所设计,常需要自行开发一套客户端和服务器结构,又易简不易繁。
d.U3D自身功能拓展和深化难题:
Unity本身针对各个平台的特定功能是比较有限的,虽然可以通过开发插件的方式完成,但是这个要求对IOS和安卓有一定程度的了解。
e.高精尖画面的误区:
U3D的渲染架构的确够强大,完成Unreal甚至CryEngine级别的画面渲染质量都是可能的,但对于手机游戏来说美术表现力仍需适度把握,过于追求高精尖画面的结果是较大的客户端,将直接影响玩家的下载速度和游戏体验。
f.客户端更新方式:
Unity引擎无法做到功能以脚本的形式更新,因此网页游戏中快速开发,快速更新的模式无法办到。
g.复杂的机型适配:
手机、平板等不同设备的分辨率不同,在国内的安卓市场机型尤其复杂。
由于Unity开发团队在国外,往往没有国内大量的安卓机型可以做测试,所以Unity引擎本身导致的游戏无法安装或者无法运行或者运行效果不对,解决起来较为困难。
39、请简述使用unity开发,可以为策划或美术开发哪些内置插件?
a.特殊的配置表配置界面
b.预设配置界面
40、请列举几种优化项目的方式?
a、减少Drawcall的使用
b.少用粒子
c.合并mesh
d.优化shader
41、C#里面数组下标可以是负数吗;
不可以,索引号从0开始增加。
42、Awake,start什么时候被系统调用?
有什么区别。
A、 Awake函数
首先,我们来看unity的参考手册中对Awake函数的一些说明情况:
当脚本实例被加载时会调用Awake函数;Awake函数在所有的游戏对象被初始化完毕之后才会被调用;在脚本实例的整个生命周期中,Awake函数仅执行一次。
那么,脚本实例何时被加载,脚本实例的整个生命周期又代表了什么,因为对这些概念存有疑惑,所以在此基础之上,自己又在引擎中进行了一些测试,通过打印输出的方式查看了一下Awake函数的执行情况,总结如下(没有特殊说明,均为在不切换场景的前提下):
(1) 如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数不会执行;反之,如果游戏对象的初始状态为开启状态,那么Awake函数会执行。
并且,值得注意的一点是,Awake函数的执行与否与脚本实例的状态(启用或禁用)并没有关系,而是与脚本实例所绑定的游戏对象的状态有关。
(2) 在不切换场景的前提下,原本处于关闭状态的游戏对象,当它被首次开启时,Awake函数会执行,并且是只在首次开启时才会执行;而已经开启(激活)的游戏对象(Awake函数已经执行过一次),将它关闭后再次开启,Awake函数不会再次执行。
看来这是对应了手册中说明的在脚本实例的整个生命周期中仅执行一次的情况。
(3) 如果重新加载场景,那么场景内Awake函数的执行情况重新遵循上述两点。
B、 Start函数
还是先看参考手册中对Start函数的一些说明情况:
当Update函数第一次被调用前会调用Start函数;Start函数只在脚本实例被启用时才会执行;Start函数总是在Awake函数之后执行。
在此基础之上,自己的测试总结如下(没有特殊说明,均为在不切换场景的前提下):
(1) 如果游戏对象被关闭,那么Start函数不会执行。
想一想这是理所当然的,游戏对象关闭了,脚本实例不会被加载,Awake函数不会执行,Start函数不会执行,Update函数等也不会执行。
(2) 如果游戏对象开启了,对象上绑定的脚本实例被禁用了,那么Start函数不会执行。
这是Start函数的特点,只有在脚本实例被启用时它才会执行,这个说明中有提到。
注意,这与Awake函数是有区别的。
(3) 如果游戏对象开启了,对象上绑定的脚本实例也开启了,那么Start函数会执行。
并且Start函数只
会在脚本实例首次被开启时才会执行。
如果是已经开启过的脚本实例被关闭后再次开启,那么Start函数不会再次执行。
(4) 如果重新加载场景,那么场景内Start函数的执行情况重新遵循上述三点。
除此之外,还有对Awake函数和Start函数都比较重要的一点,那就是当游戏对象之间存在父子关系时(不论层级的多少)。
这时,父游戏对象的状态(开启或关闭)完全决定了子游戏对象上的脚本函数的执行情况。
总的来说就是,只有在父游戏对象被开启的状态下,程序才会考虑是否调用子游戏对象上的脚本函数(Awake与Start等)。
自上而下,以此类推。
最后,自己对于Awake与Start函数的使用,一般都是在Awake函数中获取游戏对象或者脚本实例的信息,然后在Start函数中进行一些获取之后的初始化设置。
43、如何将一个Gameoject隐藏或显示,使用什么方法。
Gameobject.SetActive(true/false);
44、如果在A脚本中有一个公有方法B,在另一个脚本C如果想调用方法B则这两个该如何组织。
两种方式:
A.单例类
B.普通类
(请自己补全代码)
45、知道OnEnable和OnDisable方法吗?
什么情况下会被系统调用。
对象显示和隐藏的时候调用
46、在Updata方法中写代码需要注意什么?
如果Upadta方法没有写代码,需要删除吗为什么。
尽量不要写临时变量,如果不是没帧都需要更新,可以使用如下方法
VoidUpdate(){ if(Time.frameCount%6==0) { DoSomething(); }}
InvokeRepeating方法可以代替掉update方法
启动0.5秒后每隔1秒执行一次DoSomeThing函数
·void Start()
·{
· InvokeRepeating("DoSomeThing", 0.5f, 1.0f);
·}
47、如何让你实现一个300以上大数据的list显示,使用NGUI怎么可以实现。
使用滑动面板通过动态加载来实现。
48、NGUI怎么适应不同手机的分辨率。
使用anchor来设置锚点实现。
49、UI方面如何进行性能优化和内存优化?
举个例子。
在一个panel中,两个不重叠的sprite可以处于同一depth,有助于减少DC。
50、如果开始一个Coroutine,如果一个脚本所在的gamobjct被隐藏了脚本Coroutine还能运行吗。
不能。
51、你知道设计者模式?
说说单例模式,观察者模式。
工厂模式:
FactoryMethod,工厂方法:
定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到了子类。
单例模式:
Static_instance;
观察者模式:
委托、事件
52、除了Unity之外,你用过其他3D引擎吗,如果有请举例说明一下。
寒霜、虚幻(请补全列举的引擎功能以及简单的使用方式)
53、你使用的Unity版本号是多少。
4.3
54、你开发游戏在手机上运行过吗?
在IOS还是Androld系统上?
如果游戏在手机上运行出现Crash,你知道如何试图去找问题吗。
使用profiler进行项目优化
55、游戏中你使用什么格式的音乐。
.AIFF 适用于较短的音乐文件可用作游戏打斗音效
.WAV 适用于较短的音乐文件可用作游戏打斗音效
.MP3 适用于较长的音乐文件可用作游戏背景音乐
.OGG 适用于较长的音乐文件可用作游戏背景音乐
56、向量的点乘、叉乘的区别是什么?
向量的点乘得到的是一个数值,而不是向量,在unity中表示为
Vector3.Dot(Vector3,Vector3):
Float;
两个向量差乘得到的还是一个向量,在unity中表示为
Vector3.Cross(Vector3,Vector3):
Vector3
57、请列出在写c#代码会产生GCalloc的几种情况。
Foreach会产生GCalloc
58、请简述c#中struct和class类型区别
A.结构是值类型;类是引用类型。
B.结构是不可继承的,隐式地使用了sealed;类是可扩展的,可以实现继承。
C.结构没有默认的构造函数;类有默认的构造函数。
D.结构不能使用abstract和sealed;类可以使用。
E.结构不能使用protected修饰符;类可以使用。
F.可以不使用new初始化;类必须使用new初始化。
使用选择:
当逻辑较多时,使用类。
在表示点、矩形等轻量对象时,使用结构更好。
在表现抽象和多级别的对象层次时,使用类。
59、有列表List
usingUnityEngine;
usingSystem.Collections;
usingSystem.Collections.Generic;
publicclassListTest:
MonoBehaviour
{
List
voidStart()
{
List
foreach(intsinls)
if(!
ls2.Contains(s))
ls2.Add(s);
foreach(intsinls2)
{
Debug.Log(s);
}
}
}
60、MeshRender中material和shadermaterial的区别。
着色器包含着定义了属性和资源使用种类的代码。
材质允许你调整属性和分配资源。
61、请描述游戏动画有哪几种,以及其原理?
答:
a.关节动画:
把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
b.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
c.单一网格模型动画(关键帧动画)由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
62、alphablend工作原理是什么?
答:
AlphaBlend实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。
63、Lod是什么,优缺点是什么?
LOD(Levelofdetail)多层次细节,是最常用的游戏优化技术。
它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
64、两种阴影判断的方法、工作原理。
A.阴影由两部分组成:
本影与半影
a.本影:
景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
b.半影:
景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
求阴影区域的方法:
做两次消隐过程
一次对每个光源进行消隐,求出对于光源而言不可见的区域L;
一次对视点的位置进行消隐,求出对于视点而言可见的面S;
shadowarea=L∩S
B.阴影分为两种:
自身阴影和投射阴影
自身阴影:
因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:
利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:
因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影
工作原理:
从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
若是动态光源此方法就无效了。
36、请简述关键字Sealed用在类声明和函数声明时的作用
类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
37、请简述unity游戏引擎的特性。
a、支持多平台发布
b、可视化编辑,所见即所得
38、如何实现每日签到功能?
登陆游戏时,服务器发送是否签到信息和已经签到的日期,进入游戏后,如果接到的信息为今日没有签到,签到按钮会闪烁提示;如果接到的信息为今日没有签到,签到按钮不进行签到提示。
点击签到按钮后弹出签
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Unity 技能 汇总