unity基础1

1.unity物理系统的理解?

Unity内置了NVIDIA的Physx物理引擎,可以通过物理引擎高效、逼真地模拟刚体碰撞、车辆驾驶、布料、重力等物理效果,使游戏画面更加真实而生动。

2.Unity粒子系统的理解?

粒子系统在Unity通常用作制作烟雾,蒸汽,火焰和其他雾化效果,通过一到两个材质和不断绘画,创造一个混乱特效。典型的粒子系统在一个物体上包括一个Particle Emitter粒子发射器, 一个Particle Animator粒子播放器和一个Particle Renderer粒子渲染器,如果想和别的物体交互,可以添加一个ParticleCollider粒子碰撞器到物体上。

3. Unity3d中的碰撞器和触发器的区别?

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=false时,碰撞器被物理引擎所忽略,没有碰撞效果。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器

1. 碰撞器物体不能互相进入到对方内部,触发器可以。
2. 触发器角色控制器可以使用,碰撞器中不能使用。
3. 触发器没有物理属性了,碰撞器可以有力存在。
4. 碰撞器调用OnCollisionEnter/Stay/Exit函数,触发器调用OnTriggerEnter/Stay/Exit函数。

4. 物体发生碰撞的必要条件?

两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。

5.在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数

三个阶段,1.OnCollisionEnter 2.OnCollisionStay 3.OnCollisionEx

6.当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?

碰撞检测失败,会直接穿透
6.1使用射线检测,检测他们之间的距离
6.2将检测方式改为连续检测, rigifdbody.collisionDetectionMode=CollisionDetectionMode.Continuous;
或者是动态连续检测(CollisionDetectionMode.ContinuousDynamic)
6.3代码限制,加大计算量 提前计算好下一个位置

7.MeshCollider和其他Collider的一个主要不同点?
MeshCollider是网格碰撞器,对于复杂网状模型上的碰撞检测,比其他的碰撞检测精确的多,但是相对其他的碰撞检测计算也增多了,所以一般使用网格碰撞也不会在面数比较高的模型上添加,而会做出两个模型,一个超简模能表示物体的形状用于做碰撞检测,一个用于显示。

8.NavMeshObstacle组件的作用?

寻路网格动态碰撞组件,用于运动的物体阻碍寻路物体效果。

9.你觉得怎么防止UI控件被点穿(如何过滤掉点击事件)。

  使用一个可渲染的物体或者panel,绑定boxcollider组件即可。如果你单用一个不可渲染的物体(这里点一下UIwiget),即使设定了大小和boxcollider,也是无法屏蔽的。(坑在这里)。

10.Unity打射线的方式

//从主这相机到鼠标点发射一条射线

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        //接受射线返回的碰撞信息

        RaycastHit hitInfo;

        //如果射线碰撞到东西

        //EventSystem.current.IsPointerOverGameObject()  如果当前鼠标在 ui 上返回true 否则返回false

11.射线检测碰撞物体的原理是什么?

射线是3D世界中一个点向另一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。

12.通过什么可以区分射线碰到的游戏对象?

通过LayerMask(层的遮罩),RaycastHit返回的碰撞的标签。

13.CharacterController和Rigidbody的区别

Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件

Character Controller 角色控制器 控制器不会对加在它自身上的力做出反应,也不会自动推开其他刚体。如果想让角色控制器推开其他刚体或者对象,你可以在对象附加的脚本中添加OnControllerColliderHit()函数,这样对它们施加力就能够产生碰撞。 Character Controller相当于刚体碰撞器,但是没有刚体那样的物理特性,照样会触发OnCollision和OnTrigger的函数,照样会有刚体休眠!Character Controller运动时要使用Move或者SimpleMove才会进行相应的检测。

14.什么叫做链条关节?

Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。

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

游戏界面可以看到很多摄像机的混合。

16.Unity3d的物理引擎中,有几种施加力的方式,分别描述出来

rigidbody.AddForce/AddForceAtPosition 

17.一个角色要用到unity中寻路系统,应该添加哪个组件?

NavMeshAgent。

18.怎么判断两个平面是否相交?不能用碰撞体,说出计算方法。

在两个平面上分别取一个向量,然后看是否相交。

19.请简述AnimatorController中的Has Exit Time的作用是什么。

   当我们勾选了此项,在 动画转换时会等待当前动画播放完毕后才会才会转换到下一个动画,如果当前动画时循环动画会等待本次播放完毕转换,所以对需要立即转换动画的情况下一定要取消勾选此项; 还有一种情况时,当前动画播放完毕后会自动转换到箭头所指的下一条状态(没有其它条件时),此时必须勾选此项,否则动画播放完毕后会卡在最后一帧,如果是循环动画,则会一直循环播放。

20.动画层(Animation Layers)的作用是什么?

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

21.简述Unity3d动画中avator的用处并举例

在动画中有选择性地启用或禁用特定身体部位。比如一个跑的动画和一个开枪动画。如果要实现跑动中设计就需要使用avator。实现上身播放开枪动画,下身播放跑步动画。

22.请描述游戏动画有哪几种,以及其原理。

主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。

关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。

单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。

骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)

23.写出Animation的五个方法

Animation.Play/CrossFade/Stop/Sample/AddClip 

24.itween插件的作用是什么,itween作用于世界坐标还是局部坐标,请列举出3个其常用方法?

   iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等“   方法:a、MoveTo 物体移动 ;b、ColorTo:随着时间改变对象的颜色组; c、LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置

25.Material和Physic Material区别?

   PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。 Material材质(材质类)为了获得一个对象使用的材质,可以使用 Renderer.materia属性:

26.MeshRender中material和sharedmaterial的区别?

  修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。

27.如何安全的在不同工程间安全地迁移asset数据?三种方法

  27.1.将Assets目录和Library目录一起迁移

  27.2.导出包,export Package

  27.3.用unity自带的assets Server功能

28.Unity提供了几种光源,分别是什么

四种。

平行光:Directional Light

点光源:Point Light

聚光灯:Spot Light

区域光源:Area Light

29.使用Unity3d实现2d游戏,有几种方式?

使用本身的GUI,在Unity4.6以后出现的UGUI
2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;

3.使用2d插件,如:2DToolKit,和NGUI

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

PlayerPrefs.SetInt() PlayerPrefs.GetInt()

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

游戏界面可以看到很多摄像机的混合。

 

32.你觉得为什么UI摄像机和场景摄像机能协同工作,而且工作的这么尽如人意呢?
答案:UI摄像机和场景摄像机分别属于两个渲染层(Layer),所以它们之间的渲染互不干扰。它们工作得尽如人意(没有发生先后错乱,UI永远位于场景之上层)的原因就是因为摄像机深度(depth)控制的好。

 

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

使用Destroy()方法;

34.请描述为什么Unity3d中会发生在组件上出现数据丢失的情况

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

35..Net与Mono的关系?

mono是.net的一个开源跨平台工具,就类似java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,可以运行于linux,Unix,Mac OS等。

36.简述Unity3D支持的作为脚本的语言的名称

Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。JavaScript、 C#、Boo

37.Unity和Android与iOS如何交互?

Unity可以到处Android和iOS的工程,然后通过安卓或者iOS的类去给Unity发消息,调用Unity中的方法

 [DllImport("__Internal")]
 private static extern void unityToIOS (string str);
UnitySendMessage("gameobject", "Method",msg);
private AndroidJavaObject jo;
void Start ()
{
    //获取Android的Java接口  
    AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");  
    jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); 
}

 

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

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

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

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

40. 一张1024*2048的图片内存大小

1024*2048*32/8/1024/1024=8M

41.Unity 摄像机有几种模式,成像原理是什么?

Unity 摄像机有两种模式一种是透视摄像机 ,一种是正交摄像机,透视摄像机成像的原理是利用相似三角形来成像

42.简述prefab的用处

在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。

43.Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同

  Mesh就是指模型的网格(同名组件是用于调整网格属性的),MeshFilter一般是用于获得模型网格的组件,而MeshRender是用于把网格渲染出来的组件,

44.简述SkinnedMesh的实现原理
http://blog.csdn.net/n5/article/details/3105872

1.为什么dynamic font在unicode环境下优于static font

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。

使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。

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

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

3.简述NGUI中Grid和Table的作用?

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

4.请简述NGUI中Panel和Anchor的作用

只要提供一个half-pixel偏移量,它可以让一个控件的位置在Windows系统上精确的显示出来(只有这个Anchor的子控件会受到影响)

如果挂载到一个对象上,那么他可以将这个对象依附到屏幕的角落或者边缘

5.UIPanel用来收集和管理它下面所有widget的组件。通过widget的geometry创建实际的draw call。没有panel所有东西都不能够被渲染出来,你可以把UIPanel当做Renderer

6.Canvas 有几种模式,如何配置?

  https://www.jianshu.com/p/660a513e7d41

7.UGUI如何打包图集?

https://blog.csdn.net/caojianhua1993/article/details/52451922

https://blog.csdn.net/weixin_36961960/article/details/86707085?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

6.UGUI 如何实现UI物体淡入淡出?

13.Image与RawImage的区别?

  https://www.jianshu.com/p/61b98007fafd

14.Unity有哪些特定的文件夹名字,有什么作用?

15.Unity如何实现游戏截图?

3. NGUI UGUI渲染顺序

  UGUI的三层渲染 ① Screen Space-Overlay模式(屏幕控件-覆盖模式) Screen Space-Overlay(屏幕控件-覆盖模式)的画布会填满整个屏幕空间,并将画布下面的所有的UI元素置于屏幕的最上层,或者说画布的画面永远“覆盖”其他普通的3D画面,如果屏幕尺寸被改变,画布将自动改变尺寸来匹配屏幕。 Screen Space-Overlay模式的画布有Pixel Perfect和Sort Layer两个参数: u Pixel Perfect:只有RenderMode为Screen类型时才有的选项。使UI元素像素对应,效果就是边缘清晰不模糊。 u Sort Layer: Sort Layer是UGUI专用的设置,用来指示画布的深度。 ② Screen Space-Camera模式(屏幕空间-摄影机模式) Screen Space-Camera(屏幕空间-摄影机模式)和Screen Space-Overlay模式类似,画布也是填满整个屏幕空间,如果屏幕尺寸改变,画布也会自动改变尺寸来匹配屏幕。所不同的是,在该模式下,画布会被放置到摄影机前方。在这种渲染模式下,画布看起来 绘制在一个与摄影机固定距离的平面上。所有的UI元素都由该摄影机渲染,因此摄影机的设置会影响到UI画面。 Screen Space-Overlay模式的画布多了下面几个参数: u Render Camera:渲染摄像机 u Plane Distance:画布距离摄像机的距离 u Sorting Layer: Sorting Layer是UGUI专用的设置,用来指示画布的深度。 u Order in Layer:在相同的Sort Layer下的画布显示先后顺序。数字越高,显示的优先级也就越高。 ③ World Space(世界控件模式) World Space即世界控件模式。在此模式下,画布被视为与场景中其他普通游戏对象性质相同的类似于一张面片(Plane)的游戏物体。画布的尺寸可以通过RectTransform设置,所有的UI元素可能位于普通3D物体的前面或者后面显示。

https://blog.csdn.net/dk_0520/article/details/70712015

7. 客户端怎么判断掉线

1、使用UGUI有哪些可以优化的地方?
2、Unity图片压缩格式的选择?

  https://blog.csdn.net/lizujun123/article/details/104944129

关于合批看这个https://www.cnblogs.com/zhaoqingqing/archive/2018/09/25/9658403.html
3、UGUI中如果控件的Z轴坐标为负数,会进行合批操作吗?

4、UGUI中Image控件的透明度为0会合批吗?scale为0时会合批吗?

5、粒子怎么显示在两个UI控件之间?

  https://blog.csdn.net/u012685888/article/details/69394390
6、UGUI怎么合并drawcall?

  https://blog.csdn.net/akak2010110/article/details/80953370
7、UGUI中mask控件怎么使用?它的实现原理是什么?

  https://blog.csdn.net/qq826364410/article/details/85103488
8、UGUI中的元素是怎么重建的?

  https://blog.csdn.net/linxinfa/article/details/100107227
9、做过换装系统吗?是怎么实现的?
2. 捏脸怎么做(没做过)

68、LayerMask.NameToLayer()这个方法有什么作用?

  LayerMask的使用是按位操作的,LayerMask.NameToLayer("Players") 返回该Layer的编号。

4.如果一个地图很大,怎么办?

5.游戏地图是如何切换的?

3.你对UI功能模块之间相互通信有什么好看法。(或者问成Broadcast和sendMes的看法)
答案:UI模块之间尽量解耦合,使用BroadCast机智或者delegate机智。由于Unity自身的BroadCast和SendMsg效率是很低的,(务必百度一下这俩的区别,都有,我懒得复制粘贴了。)所以推荐使用NGUI自带的那个消息机智。具体的使用方法,下载任何一款NGUI3.5左右的版本,都能清楚的看到。更或者自己实现一个msgerpool也可以,思路是使用泛型写法+字典+delegate,效率也很高。

a.SendMessage 作用:调用一个对象的methodName函数,这个函数可以是公有的也可以是私有的,后面跟一个可选参数(此参数作为传入参数),最后面跟一个可选的设置参数(它有两个选项,后面再讲)。

b.SendMessageUpwards 作用:它的作用和SendMessage类似,只不过它不仅会向当前对象推送一个消息,也会向这个对象的父对象推送这个消息(记住,是会遍历所有父对象)。

c.BroadcastMessage 作用:这个函数的作用和SendMessageUpwards的作用正好相反,它不是推送消息给父对象,而是推送消息给所有的子对象,当然,也是会遍历所有的子对象。

6,NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么

OnClick()

主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick() OnPress()等函数,可以说NGUI的按钮是通过发消息这个方式调用的。

5.怎样能迅速找到某一个UI控件。
答案:分情况处理,这是一个优化策略的题目。首先如果这个控件我在awake的时候能知道,那么我会把它存成一个private变量,代码中使用的时候直接使用即可。如果不行,这个子物体是动态生成的(他可能有或者没有),那尽量使用FindChild,得到之后加以判断。如果不得不全局找一个东西(比如找到角色物体),才会用Find。

答案是:直接用WorldToScreenPoint方法

public Camera mycamera;//要转化到的目的摄像机,通常canvas在这个摄像机下(即canvas的render mode设置为这个摄像机)

Image kongjian;//自己要获取屏幕坐标的控件,可以是image,也可以是button等等

float x=mycamera.WorldToScreenPoint(kongjian.transform.position).x;

float y=mycamera.WorldToScreenPoint(kongjian.transform.position).y;

//x,y即为控件在屏幕的坐标camera.WorldToScreenPoint()方法返回的是一个position类型 是vector3类型,camera为要转化到的目标摄像机,传入的参数为控件的世界坐标

6.你对遮挡关系有什么好的策略。
答案:这种问题的诞生是由于Ngui2采用了一种zorder+depth方式处理遮挡关系造成的,已经在ngui3里完全屏蔽掉了。只要维护depth即可。

决定Unity渲染关系的层级顺序是: Camera , sorting layer ,sorting order

7.你对屏幕适配有什么好主意。
答案:屏幕适配根本没有完美的解决方案,如果是全屏模块,那么锁定目标机型,将目标机型做成满屏,其他机型充满宽或高后留白(也叫留黑边)处理即可。如果是屏幕模块(比如战斗界面,主城界面等等,你会看到下边的场景那种),需要采用Anchor来解决。NGUI2 Anchor有独立的控件,NGUI3Anchor已经被搞到Wighet和Pannel中,这个自己下去好好研究研究吧。

20.请简述如何在不同分辨率下保持UI的一致性
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。

6-1:办法1:调整Canvas的Render Mode属性为Screen Space - Camera:将映射游戏内容的Camera拖入Render Camera中,下一个属性Plane Distance表示UI与Camera的在Z轴距离(其实就是变相反映了UI的Z轴位置)。接着在Canvas Scaler属性里将Ui Scale Mode属性设置为Scale With Screen Size,表示Canvas会根据屏幕比例缩放。下面的Reference Resolution,表示UI宽和高一半的大小。例如设计尺寸为640x960,则x应为640 / 2 = 320,宽应为960 / 2 = 480。下面的Screen Match Mode属性选中Match Width Or Height,表示采用宽度(上文有提到过)或高度(Unity自带适配方式)适配。然后Match调整为0或1,0表示完全宽度适配,1表示完全高度适配,其他值表示介于两者之间采用比例适配

6-2:办法2:调整Canvas的Render Mode属性为World Space1、将Event Camera设置为映射游戏内容的Camera。2、然后调整Rect Transform组件中的Width和Height为设计尺寸的宽和高,同时将Scale属性的X和Y都调整为0.01(对应unity2d默认情况下像素Pixels与引擎单位Unit对应比例100)。这时,Canvas的宽高正好与摄像机相同。这两种方法都可以将UI调整为与设计尺寸一致,并且在编辑器中运行与真机中运行效果保持一致。

3.角色换装,技能释放你会怎么做。
角色换装这个,各有各的活法,尸块换装,纸娃娃贴图等,这个莫衷一是,可以自己百度去,找一个自己喜欢的实现一下试试吧。技能释放水是很深的,这个能答就答,答不上来也不丢人。估计被面这些的,肯定都比我强,也就不需要我比比什么的了。。

1.你觉得为什么UI摄像机和场景摄像机能协同工作,而且工作的这么尽如人意呢?
答案:UI摄像机和场景摄像机分别属于两个渲染层(Layer),所以它们之间的渲染互不干扰。它们工作得尽如人意(没有发生先后错乱,UI永远位于场景之上层)的原因就是因为摄像机深度(depth)控制的好。

posted @ 2020-10-12 15:41  Elijah_j  阅读(511)  评论(0编辑  收藏  举报