Unity面试题170420

31 篇文章 0 订阅
16 篇文章 0 订阅

1、与服务器通信的方式有哪些?

基于HTTP协议,客户与服务器通信的三种方式 

1)直接通信: 

是一种最简单的通信方式,通过用户代理和源服务器(资源所驻留的服务器)之间的单个连接来完成 

2)通过中介的HTTP通信 

当客户和源服务器之间有一个或多个中介系统时,在HTTP请求/响应链中会出现多个连接,中介有三种形式:代理Proxy、网关Gateway、隧道Tunnel 

Proxy:是客户和服务器之间的一种中间程序,它既充当一个服务器,也充当一个客户。 Gateway:是两类服务器之间的一种中间程序,它将一类服务器所支持的协议翻译为另一类服务器所支持的协议。与代理不同,网关接受请求就好像它是源服务器,发送请求的客户并没有意识到它正在和网关打交道,例如Web E-mail系统 

Tunnel:是两个连接之间的中继系统,与ProxyGateway不同,它不对HTTP消息作任何修改。当客户与服务器的通信要通过防火墙等中介系统时,就可以使用Tunnel 

3)使用缓存的HTTP通信 

Cache使用于暂存服务器响应消息的本地存储空间,以及对暂存消息进行存储、检索和删除等的子系统。用于存储可缓存的响应消息,以便在将来出现相同的客户请求时减少响应时间并降低网络带宽的占用。HTTP协议引入了缓存机制和响应的控制手段,以保证通信的高效性、正确性 

 

HTTP通信链中的任何一个成员,包括:客户代理、服务器、中介(除隧道外),均可以采用内部的缓存来处理客户请求,如果通信链中的一个成员已经对某个请求的响应进行了缓存,那么它就不应该请求向前传递,而直接将响应返回给用户,从而缩短请求/响应链。这样的处理方式能减少请求-响应链路上的网络负载,提高响应速度


2、数组与链表的区别?

首先从逻辑结构上说,两者都是数据结构的一种。

数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。

链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了

(1) 从逻辑结构角度来看

  a, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。

  b,链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)

(2)从内存存储角度来看

  a,(静态)数组从栈中分配空间,对于程序员方便快速,但自由度小。

  b, 链表从堆中分配空间,自由度大但申请管理比较麻烦.

综合以上,对于快速访问数据,不经常有添加删除操作的时候选择数组实现,而对于经常添加删除数据,对于访问没有很高要求的时候选择链表。


3、Unity脚本运行周期:

function Awake():脚本唤醒,系统执行的第一个方法,用于脚本的初始化,在脚本的生命周期中只执行一次。

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

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

function LateUpdate():推迟更新,Update()执行完后调用,每一帧都调用。

function FixedUpdate():固定更新。常用于移动模型等操作。

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

function OnGUI():绘制界面,每一帧都调用,用来绘制界面的。


4方法重载与方法重写

方法重载:指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与他匹配的方法执行操作的一种技术。

方法重写:通过为声明的方法提供新的实现,派生类可以重写基类的方法。

区别:1.重写必须继承,重载不用。

      2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。

      3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。

      4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常


5、使用光照贴图的好处

Lightmapping光照贴图技术是一种增强静态场景光照效果的技术,其优点是可以通过较少的性能消耗使静态场景看上去更加真实,丰富,更加具有立体感;缺点是不能用来实时地处理动态光照。当游戏场景包含了大量的多边形时,实时光源和阴影对游戏的性能的影响会很大。这时使用Lightmapping技术,将光线效果预渲染成贴图使用到多边形上模拟光影效果。


6

public对任何类和成员都公开,无限制访问

private仅对该类公开

protected对该类和其派生类公开

internal只能在包含该类的程序集中访问该类


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

1)在编程之前首先你要向GameObject 中增加一个Rigidbody 的部件。

2Rigidbody(刚体)的成员函数void MovePosition(Vector3 position)是用来改变刚体对象的 transform.position值的,而且是瞬间改变到新的位置,而不是逐渐移动过去。如果它的新位置上有碰撞器,那么会在下一次进入Update 时立即对刚体应用受力。在新旧两个位置之间的其它刚体不会受到它移动的影响(因为它是瞬间穿过去的)。

3)所以经常把 rigidbody.MovePosition 放到物理帧更新的函数FixedUpdate,让它步进移动,这样就会碰撞一路上的其他碰撞体而不是穿越过去。

 

8、四元数的作用

四元数在Unity3D中的作用就是拿来表示旋转。

 

9、物理碰撞发生的必要条件

两个对象都有Collider组件且至少一个有Rigidbody组件。

其中至少一个物体(必须运动的)必须带有collider+Rigidbody,另一个物体(可以静止也可以运动)也必须至少带有collider

 

10、MeshRendermaterialshaerdmaeterial的区别

1)对于material,我们每一次引用就会生成一个新的material到内存中。但是在引用后并不会改变我们项目工程中材质球的原始属性设置。

2)而对于sharedMaterial,所有使用这个材质球物体都会被改变,并且改变后的设置将会被保存在项目工程中。

3)如果我们先改变了material,表示生成了一个新的material在内存中,此时再使用sharedMaterial对新的material并不起作用。

 

11、如何让已经存在的GameObject在切换场景后不被卸载

Awake()方法中写DontDestroyOnLoad(transform.gameObject);

DontDestroyOnLoad();当加载一个新关卡时,物体不被销毁,然后新关卡中的物体被加载进来。如果物体是一个组件或游戏物体,它的整个transform层次将不会被销毁,全部保留下来。


12、什么是局部坐标?什么是世界坐标?列举名字

局部坐标是相对于父亲来说的,而世界坐标是对于整个游戏来说的。

世界坐标(World Space)

场景中添加的对象,它们是以世界坐标显示在场景中,可以通过代码transform.position获得该对象的世界坐标,那么我们在检视面板(Inspector)中看到的Position的值在对象没有父物体时,这个值和transform.position得到的结果一致的,若该对象有父物体,那么检视面板中(Inspector)看到的即为相对于父物体的相对坐标位置,这样通过transform.position得到的值自然就不一样了。总之,通过transform.position得到的都是对象的世界坐标。在对象存在父物体的情况下,若想要得到该对象在检视面板(Inspector)中的值,可以通过transform.Localposition得到。

屏幕坐标(Screen Space

屏幕坐标是通过像素来定义的,屏幕坐标的坐标系以屏幕左下角为(00)点,右上角为(Screen.width,Screen.height,屏幕坐标为3维坐标,z的大小由相机的世界位置来定义。通过Input.mousePosition得到的是屏幕坐标,屏幕坐标的数值只与屏幕的大小有关,跟分辨率没有关系。

视口坐标(View Space

视口坐标标准化后的屏幕坐标,它的坐标原点同样是左下角为(00)点,只不过右上角为(11)点,若对象处在场景的正中间,则对象的视口坐标为(0.50.5),与屏幕坐标一样,视口坐标也是一个3维的,它的z方向的数值由相机的世界位置来决定。

GUI坐标系

GUI坐标系主要在通过OnGUI方法绘制屏幕UI界面时运用较多,GUI坐标系是一个2维坐标系,与屏幕空间类似,所表示的范围也是整个屏幕空间范围,只不过GUI坐标的坐标原点在左上角,即左上角为(00)点,右下角为(Screen.width,Screen.height)。


13、数学函数Mathf

四舍五入:

限制:

差值:

绝对值:

Mathf.Abs绝对值

Mathf.CeilToInt最小整数

Mathf.Ceil上限值

Mathf.Clamp01限制0~1

Mathf.Clamp限制

Mathf.ClosestPowerOfTwo最近的二次方

Mathf.Exp指数

Mathf.FloorToInt最大整数

Mathf.Floor下限值

sMathf.Infinity正无穷

Mathf.LerpAngle插值角度

Mathf.Lerp插值

Mathf.Max最大值

Mathf.Min最小值

Mathf.RoundToInt四舍五入到整数

Mathf.Round四舍五入


14、Unity3D Shader分哪几种?

Shader按管线分类一般分为固定渲染管线与可编程渲染管线

(1)固定渲染管线 ——这是标准的几何&光照(Transforming&Lighting)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控 制和纹理混合。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。功能比较有限。基本所有的显卡都能正常运行。

(2)可编程渲染管线——对渲染管线中的顶点运算和像素运算分别进行编程处理,而无须象固定渲染管线那样套用一些固定函数,取代设置参数来控制管线。

 

unity3d的三种Shader

(1)Fixed function shader 属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的Fallback(之后有详细介绍)。使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIACgFX类似。

(2)Vertex and Fragment Shader 最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。

(3)Surface Shader Unity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。使用的也是CG/HLSL语法。


15、对象池的原理和作用

可以缓存你计划在游戏中重复利用的对象,并允许你从中调用,同时它也可以判断是否响应你的调用或者只给你提供可用的对象。它也可以在一开始缓存很多对象来为你提供一个池来进行工作。

1、一个池子:用来装你所需的物品,和回收物品;

2、一个取物品的方法;

3、一个放物品的方法;


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值