3

U3D问题总结(三) Unity基础

 2 years ago
source link: http://www.z16388.top/2019/10/29/unity3/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Unity基础

Unity和Android与iOS如何交互

Unity可以导出安卓和IOS的工程。导出的工程有Unity封装的方法,可以通过发消息的方式跟Unity进行交互。其中,C#不能与OC直接进行交互,需要用C++去写。

Unity3D支持的作为脚本的语言

C#、JS、Boo

Unity中用过哪些插件?具体功能

NGUI,制作2D界面

Helpshift,帮助与提示

KTPlay,游戏论坛

UniClipboard,粘贴板

Unity中常用的插件(Δ)

Unity引擎使用的是左手坐标系还是右手坐标系(A)

A.左手坐标系 B.右手坐标系
C.可以通过ProjectSetting切换右手坐标系 D.可以通过Reference切换左手坐标系

什么是导航网格(NavMesh)(B)

A.一种用于描述相机轨迹的网格 B.一种用于实现自动寻址的网格
C.一种被优化过的物体网格 D.一种用于物理碰撞的网格

OnEnable、Awake、Start运行时发生的顺序,哪些可以在同一周期中重复发生

Awake->OnEnable->Start
OnEnable可以在同一周期中重复发生

生命周期顺序

Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy

Awake() 脚本唤醒,系统执行的第一个方法,用于脚本初始化,只执行一次。

Start()在Awake之后、Update之前执行,只执行一次。

Update()用于逻辑正常更新,每帧由系统自动调用一次。

FixedUpdate()固定更新。

LateUpdate()推迟更新,每帧调用,在Update之后调用。

OnGUI() 每帧可能会被绘制多次,每次对应于一个 GUI event

OnDestroy()当前脚本销毁时调用。

12.以下关于 MonoBehaviour.OnGUI()的描述错误的是(D)

A.如果 MonoBehaviour 没有被启用,则OnGUI函数不会被调用
B.用于绘制和处理 GUI events
C.每帧可能会被绘制多次,每次对应于一个 GUI event
D.每帧被调用一次

Addcomponent后哪个生命周期函数会被调用?

对于AddComponent添加的脚本,其Awake,Start,OnEnable是在Add的当前帧被调用的,其中Awake,OnEnable与AddComponent处于同一调用链上,Start会在当前帧稍晚一些的时候被调用。Update则是根据Add调用时机决定何时调用:如果Add是在当前帧的Update前调用,那么新脚本的Update也会在当前帧被调用,否则会被延迟到下一帧调用。
https://blog.csdn.net/qq_32821435/article/details/94760815

物理更新一般放在哪个系统函数里

FixedUpdate。update跟当前平台的帧数有关,而FixedUpdate是真实时间

Update和FixedUpdate的区别?

Update是在每次渲染新的一帧的时候会调用,FixedUpdate,是在固定的时间间隔执行,不受游戏帧率的影响。FixedUpdate的时间间隔可以在项目设置中更改,Edit->ProjectSetting->time 找到Fixedtimestep。

移动相机动作在哪个函数里,为什么在这个函数里

LateUpdate,是在所有的update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是所有的update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

关于 MonoBehaviour.LateUpdate 函数描述错误的是:(B)

A.当 MonoBehaviour 类被启用后,每帧调用一次
B.常被用于处理 Rigidbody 的更新
C.在所有 Update 函数执行后才能被调用
D.常被用于实现跟随相机效果,且目标物体的位置已经在 Update 函数中被更新

应该放在FixedUpdate

如何让已经存在的GameObject在LoadLevel后不被卸载掉

void Awake()
DontDestroyOnLoad(transform.gameObject);

脚本及编辑器

unityEngne

9.在哪个面板中可以修改物体的空间属性,如位置,朝向,大小等(B)

A.Project B.Inspector C.Hierarchy D.Toolbar

如何为一个Asset 资源设定一个Label,从而能够方便准确的搜索到?(D)

A.在Project窗口中选中一个Asset,右键->Create->Label
B.在Project窗口中选中一个Asset,右键->Add Label
C.在Project窗口中选中一个Asset,在Inspector窗口中点击添加Label的图标
D.在Project窗口中选中一个Asset,在Inspector窗口中点击按钮“Add Label”

5.Application.loadLevel命令为(A)

A.加载关卡 B.异步加载关卡 C.加载动作 D.加载动画

将图片的TextureType选项分别选为“Texture”和“Sprite”有什么区别

Sprite作为UI精灵使用,Texture作用模型贴图使用。Sprite需要2的整次幂,打包图片省资源

为什么dynamic font在unicode环境下优于static font(?

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。

OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义

当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。

采用Input.mousePosition 来获取鼠标在屏幕上的位置,以下表达正确的是(C)

A.左上角为原点(0,0),右下角为(Screen.Width, Screen.Height)
B.左下角为原点(0,0),右下角为(Screen.Height, Screen.Width)
C.左下角为原点(0,0),右上角为(Screen.Width, Screen.Height)
D.左上角为原点(0,0),右下角为(Screen.Height, Screen.Width)

物体自身旋转使用的函数?

Transform.Rotate()

物体绕某点旋转使用函数叫什么?

transform.RotateAround()

以下选项中,将游戏对象绕Z轴逆时针旋转90度(C)

A.transform.rotation = Quaternion.Euler(0,0,90)
B.transform.rotation = Quaternion.Angle(0,0,90)
C.transform.Rotate(new Vector3(0,0,90))
D.transform.Rotate(new Vector3(90,0,0))

游戏对象B是游戏对象A的子物体,游戏对象A经过了旋转,请写出游戏B围绕自身的Y轴进行旋转的脚本语句,以及游戏对象B围绕世界坐标的Y轴旋转的脚本语句

绕世界坐标旋转:transform.Rotate (transform.upspeedTime.deltatime);
绕自身Y轴旋转:transform.Rotate (Vector.upspeedTime.deltatime);

U3D中用于记录节点空间几何信息的组件名称,及其父类名称

Transform 父类是 Component

关于Vector3 的API,以下说法正确的是(BC)

A.Vector3.normalize 可以获取一个三维向量的法线向量
B.Vector3.magnitude 可以获取一个三维向量的长度
C.Vector3.forward 与 Vector3(0,0,1)是一样的意思
D.Vector3.Dot(向量A,向量B)是用来计算向量A与向量B的叉乘

以下哪个函数在游戏进入新场景后会被马上调用(B)

A.MonoBehaviour.OnSceneWastLoaded()
B.MonoBehaviour.OnSceneEnter()
C.MonoBehaviour.OnLevelEnter()
D.MonoBehaviour.OnLevelWastLoaded()

14.在Unity引擎中,Collider所指的是什么(D)

A.collider 是Unity引擎中所支持的一种资源,可用作存储网格信息
B.Collider 是Unity引擎中内置的一种组件,可用对网格进行渲染
C.Collider 是Unity引擎中所支持的一种资源,可用作游戏对象的坐标转换
D.Collider 是Unity引擎中内置的一种组件,可用作游戏对象之间的碰撞检测

下列选项中,关于Transform组件的Scale参数描述正确的是(A)

A.Transform组件的Scale参数不会影响ParticleSystem产生粒子的大小
B.Transform组件的Scale参数不会影响GUITexture的大小
C.添加Collider组件后的GameoObject,其 Collider 组件的尺寸不受Transform组件的Scale参数影响
D.添加Rigidbody组件后的物体,大小将不再受Transform组件中 Scale 参数的影响

如何销毁一个UnityEngine.Object及其子类

Destroy()方法

DestroyImmediate和Destroy的区别

DestroyImmeditate 销毁对象的时候,会立即释放资源。Destroy只是从该场景销毁,但是还在内存当中。

在编辑场景时将GameObject设置为Static有何作用

设置游戏对象为Static时,这些部分被静态物体挡住而不可见时,将会剔除(或禁用)网格对象。因此,在你的场景中的所有不会动的物体都应该标记为Static。

如何通过脚本来删除其自身对应的Gameobject(A)

A.Destroy(gameObject) B.this.Destroy()
C.Destroy(this) D.其他三项都可以

某个GameObject有一个名为MyScript的脚本,该脚本中有一个名为DoSomething 的函数,则如何在该Gameobject的另外一个脚本中调用该函数?(A)

A.GetComponent().DoSomething()
B.GetComponent
C.GetComponent().Call(“DoSomething”)
D.GetComponent

CompareTag比直接用gameObject.tag要好

简述一下对象池

对象池就存放需要被反复调用资源的一个空间,当一个对象回大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象包括子弹,敌人,粒子等

对象池使用什么数据结构构建

频繁创建GameObject会降低程序性能为什么?怎么解决?

频繁创建游戏对象,会增加游戏的Drawcall数,降低帧率,GPU会一直在渲染绘制。可以通过对象池来管理对象:当需要创建一个游戏对象时,先去对象池中查找一下对象池中是否存在没有被正在使用的对象,如果有的话直接使用这个对象,并把它标记为正在使用,没有话就创建一个,并把它添加到池中,然后标记为使用中。一个游戏对象使用完毕的时候,不要销毁掉,把它放在池中,标记为未使用。

如何在Unity中创建地形系统?(D)

A.Terrain->Create Terrain B.Component->Create Terrain
C.Asset->Create Terrain D.Windows->Create Terrain

当删除Unity工程Assets目录下地meta文件时会导致什么?为什么?

会导致在场景中游戏对象看不到,或者报错,材质找不到资源。多人协作的时候会导致资源的重复产生。因为每个资源文件都对应一个.meta文件,这个.meta文件中的guid就是唯一标识这个资源的。材质就是通过这个guid来记录自己使用了那些资源,而且同一个资源的guid会因为不同的电脑而不同,所以当你上传了丢失了.meta文件的资源的时候,到了别人的机器上就会重新产生guid,那个这个资源就相当于垃圾了。

meta文件的作用

prefab的作用

  1. 在游戏运行时实例化。Prefab相当于一个模板,对已有的素材、脚本和参数做一个基础的配置,便于以后的修改
  2. Prefab打包的内容简化了导出操作,便于团队协同

下列叙述中有关 Prefab 说法错误的是哪一项(B)

A.Prefab 是一种资源类型 B.Prefab 是一种可以反复使用的游戏对象
C.Prefab 可以多次在场景进行实例 D.当一个 Prefab 添加到场景中时,也就是创建了它的一个实例

资源加载方式

1.Resources
2.AssetBundle
3.AssetDatabase

资源数据库 (AssetDatabase)

资源数据库 (AssetDatabase) 是允许您访问工程中的资源的 API。此外,其提供方法供您查找和加载资源,还可创建、删除和修改资源。Unity 编辑器 (Editor) 在内部使用资源数据库 (AssetDatabase) 追踪资源文件,并维护资源和引用资源的对象之间的关联。Unity 需要追踪工程文件夹发生的所有变化,如需访问或修改资源数据,您应始终使用资源数据库 (AssetDatabase) API,而非文件系统。 资源数据库 (AssetDatabase) 接口仅适用于编辑器,不可用于内置播放器。和所有其他编辑器类一样,其只适用于置于编辑器 (Editor) 文件夹中的脚本(只在主要的资源 (Assets) 文件夹中创建名为“编辑器”的文件夹(不存在该文件夹的情况下))。

什么是AssetBundle?谈谈对AssetBundle内存分配情况的理解

可以把多个游戏对象或资源二进制文件封装到AssetBundle中,提供封装与解包的方法使用很方便。

加载资源三个步骤:

  1. www/LoadFromFile/LoadFromMemory等接口加载AssetBundle本身
  2. AssetBundle.LoadAsset()等接口从AssetBundle中加载资源
  3. 对于GameObject类资源,需要通过GameObject.Instantiate()创建Clone

黑色区域:www类本身占用内存,还保留了一份对WebStream数据的引用。使用www = null或www.dispose()释放。前者等待GC,后者立即释放。释放后WebStream引用计数会减一。

橙色区域:WebStream数据,数据真正的存储区域。AssetBundle被加载进来后,这部分内存就被分配了。包含三个内容:1、压缩后的AssetBundle本身。2、解压后的资源。3、一个解压缓冲区。www或AssetBundle对象都只是有一个结构指向了WebStream数据,从而对外部提供操作真正资源数据的方法。当WebStream数据引用为0时,系统会自动释放。为了不频繁的开辟和销毁解压Buffer,绿色Decompression解压缓冲区Unity会至少保留一份。

粉色区域:AssetBundle对象,引用WebStream数据部分,提供从WebStream数据中加载资源的接口。AssetBundle.Unload(bool unloadAllLoadedObjects)释放资源。AssetBundle.Unload(false)释放AssetBundle对象本身,可能引起WebStream释放,导致无法通过接口或依赖关系从该AssetBundle加载资源,但已加载资源可以正常使用。AssetBundle(true)不仅释放WebStream部分,所有被加载出来的资源将被释放。

红色部分:通过Instantiate()创建的GameObject所包含的资源。这些资源根据类型与AssetBundle原始资源(WebStream资源部分)有不同关系。如Texture、shader资源,通常只是使用,不会做出改动,所以仅仅是引用关系;每个GameObject是特殊的,所以是完全复制一份;Mesh和Material,则是引用+复制的关系。

动态加载资源的方式 区别

1.Resources.Load();
2.AssetBundle

1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。
2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。

以下关于WWW.LoadFromCacheOrDownload描述正确的是(C)

A.可被用于将 Text Assets 自动缓存到本地磁盘
B.可被用于将 Resource 自动缓存到本地磁盘
C.可被用于将 Asset Bundles 自动缓存到本地磁盘
D.可被用于将任意格式的Unity资源文件自动缓存到本地磁盘

如何安全地在不同工程间安全地迁移asset数据(?

  1. 将Assets目录和Library目录一起迁移
  2. 导出包,export Package
  3. 用unity自带的assets Server功能 或者meta功能

AssetBundle包加载流程

图集打包怎么分类

1.按业务功能的预制,寻找依赖,收集所有预制引用的图片,
2.如果有多个预制使用了同一张图片,我们就把它扔到common文件夹
3.让图集尽量紧凑,没有太多空白,尽量让图集处于2的n次方大小

为什么Unity3d中会发生在组件上出现数据丢失的情况(?

组件上绑定的物体对象被删除了

UI与Camera

UGUI的Canvas的作用

Canvas画布是承载所有UI元素的区域。所有的UI元素都必须是Canvas的子对象。如果场景中没有画布,那么我们创建任何一个UI元素,都会自动创建画布,并且将新元素置于其下。

创建Canvas:GameObject->UI->Canvas

如何实现UI界面的层级

Unity3d实现2d游戏,有几种方式

  1. 使用自身的GUI
  2. 把摄像机的Projection(投影)值调整为Orthographic(正交投影),不考虑z轴
  3. 使用2d的ui插件:2DToolKit、NGUI等

为何大家都在移动设备上寻求U3D原生GUI的替代方案

不美观,OnGUI很耗费时间,效率不高,使用不方便

如何在不同分辨率下保持UI的一致性(?

NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。UGUI通过锚点和中心点和分辨率也解决这个问题

ngui和ugui的区别

简述NGUI中Grid和Table的作用

对Grid和Table下的子物体进行排序和定位

请简述NGUI中Panel和Anchor的作用

  1. 只要提供一个half-pixel偏移量,它可以让一个控件的位置在Windows系统上精确的显示出来(只有这个Anchor的子控件会受到影响)
  2. 如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘
    3.UIPanel用来收集和管理它下面所有widget的组件。通过widget的geometry创建实际的draw call。没有panel所有东西都不能够被渲染出来,你可以把UIPanel当做Renderer

UGUI中Image和RawImage的区别

Imgae比RawImage更消耗性能
Image只能使用Sprite属性的图片,但是RawImage什么样的都可以使用
Image适合放一些有操作的图片,裁剪平铺旋转什么的,针对Image Type属性
RawImage就放单独展示的图片就可以,性能会比Image好很多

在场景中放置多个Camera并同时处于活动状态会发生什么(?

游戏界面可以看到很多摄像机的混合。可以用depth(深度),Layer(层)+ Culling Mask,enable = false/true来控制

照相机的Clipping Planes的作用是什么?调整Near、Fare两个值时,应该注意什么

剪裁平面 。从相机到开始渲染和停止渲染之间的距离。

将Camera组件的ClearFlags选项选成Depth only是什么意思?有何用处

如果把摄像机的ClearFlags勾选为Deapth Only,那么摄像机就会只渲染看得见的对象,把背景会完全透明,这种情况一般用在两个摄像机以上的场景中

在 Unity 中的场景中创建 Camera 时,默认情况下除了带有Transform、Camera、GUILayer、Flare Layer 组件之外,还带有以下哪种组件(C)

A.Mouse Look B.FPS Input Controller C.Audio Listener D.Character Motor

以下哪组摄像机中 Normalized View Port Rect 的数值设置可以使摄像机显示的画面位于1280*720分辨率的屏幕画面右上角(D)

A.X=640,Y=360,W=640,H=360 B.X=640,Y=0,W=640,H=360
C.X=0,Y=0,W=0.5,H=0.5 D.X=0.5,Y=0.5,W=0.5,H=0.5

如果将一个声音剪辑文件从Project 视图拖动到 Inspector 视图或者 Scene 视图中的游戏对象上,该游戏对象会自动添加以下哪种组件(C)

A.Audio Listener B.Audio Clip C.Audio Source D.Audio Reverb Zone

以下哪一个选项不属于Unity引擎所支持的视频格式文件(D)

A.后缀为mov的文件 B.后缀为mpg的文件
C.后缀为avi的文件 D.后缀为swf的文件

请描述游戏动画有哪几种

主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。

下列选项中有关Animator的说法错误的是?(D)

A.Animator是Unity引擎中内置的组件
B.任何一个具有动画状态机功能的GameObject都需要一个Anim组件
C.它主要用于角色行为的设置,包括StateMachine、混合树BlendTrees以及同通过脚本控制的事件
D.Animator同Animation组件的用法是相同的

Animator.CrossFade 命令作用是:(B)

A.动画放大 B.动画转换 C.Update() D.OnMouseButton()

Animation和Animator的区别

Animation需要通过代码手动控制动画的播放和迁移。而Animator拥有有动画状态机,可以通过动画状态机来设置动画之间的状态,并且可以为单个动画设置脚本代码来控制事件。

Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数

PlayerPrefs.SetInt(string, int) PlayerPrefs.GetInt(string)

Unity3D是否支持写成多线程程序?如果支持的话需要注意什么

仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

Unity3D的协程和C#线程之间的区别是什么?

多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK