Unity3D面试题整合

目录

 

第一部分

第二部分

第三部分

第四部分


第一部分:

1、C#有几种数据类型?

答:C#通常分为三种数据类型:值类型(ValueType)、引用类型(Reference types)和指针类型(Pointer types)。

值类型可以直接分配给一个值。它们是从类 System.ValueType 中派生的。值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。

引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:objectdynamic 和 string

指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。

值类型与引用类型:

值类型:简单类型+枚举类型+结构体类型

引用类型:类类型+数组类型+接口类型+委托类型

 

2、请简述值类型与引用类型的区别?

答:1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址。
2.值类型存取快,引用类型存取慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用。
4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放。
5.值类型继承自System.ValueType,引用类型继承自System.Object。

 

3、C#中所有引用类型的基类是什么?

答:引用类型的基类是System.Object,而值类型的基类是System.ValueType。同时,值类型也隐式继承自System.Object。

 

4、请简述ArrayList和List<Int>的主要区别?

答:ArrayList存在不安全类型‘(ArrayList会把所有插入其中的数据都当做Object来处理)装箱拆箱的操作(费时)。List是接口,ArrayList是一个实现了该接口的类,可以被实例化。

 

5、请简述GC(垃圾回收)产生的原因,并描述如何避免?
答:GC回收堆上的内存
避免:1)减少new产生对象的次数
2)使用公用的对象(静态成员)
3)将String换为StringBuilder

 

6、请描述Interface与抽象类之间的不同?
答:抽象类表示该类中可能已经有一些方法的具体定义,但接口就是公共只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。
抽象类是子类用来继承的,当父类已经有实际功能的方法时该方法在子类中可以不必实现,直接引用父类的方法,子类也可以重写该父类的方法。
实现接口的时候必须要实现接口中所有的方法,不能遗漏任何一个。首先,abstract class 在 c# 语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为c#不支持多继承 -- 转注)。但是,一个类却可以实现多个interface。

 

7、下列代码在运行中会发生什么问题?如何避免?

List<int> ls = new List<int>(new int[]{1,2,3,4,5});
foreach(int item in ls)
{
	Console.WriteLine(item*item);
	ls.Remove(item);
}

答:会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。

 

8、请简述关键字Sealed用在类声明和函数声明时的作用?
答:类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。

 

9、请简述private,public,protected,internal的区别。
答:public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其派生类公开
internal:只能在包含该类的程序集中访问该类
protected internal:protected + internal

 

10、反射的实现原理?

答:审查元数据并收集关于它的类型信息的能力。反射个人认为,就是得到程序集中的属性和方法。
实现步骤:
1.导入using System.Reflection;
2.Assembly.Load("程序集")加载程序集,返回类型是一个Assembly
3.foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
得到程序集中所有类的名称
4.Type type = assembly.GetType("程序集.类名");获取当前类的类型
5.Activator.CreateInstance(type); 创建此类型实例
6.MethodInfo mInfo = type.GetMethod("方法名");获取当前方法
7.mInfo.Invoke(null,方法参数);

 

11、.Net与Mono的关系?

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

 

12、简述Unity3D支持的作为脚本的语言的名称?
答:Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。JavaScript:和网页中常用的JavaScript不一样,它编译后的运行速度很快,语法方面也会有不少区别;C#:类似于Java编程语言的变异型语言;Boo:可以看做是Python语言的变种,又糅合了Ruby和C#的特性,它是静态类型语言。

 

13、Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
答:参考https://blog.csdn.net/husheng0/article/details/46954473
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象。

 

14、Unity3D的协程和C#线程之间的区别是什么?
答:http://blog.csdn.net/kongbu0622/article/details/8775037
多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。

 

15、U3D中用于记录节点空间几何信息的组件名称,及其父类名称?
答:Transform 父类是 Component

 

16、简述四元数的作用,四元数对欧拉角的优点?
答:四元数用于表示旋转,相对欧拉角的优点:
1)能进行增量旋转
2)避免万向锁,存储空间小,计算效率高
3)给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

 

17、向量的点乘、叉乘以及归一化的意义?
1)点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
2)叉乘得到的向量垂直于原来的两个向量
3)标准化向量:用在只关系方向,不关心大小的时候

 

18、矩阵相乘的意义及注意点?
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累

 

19、为何大家都在移动设备上寻求U3D原生GUI的替代方案?
不美观,OnGUI很耗费时间,使用不方便 ,DrawCall

 

20、请简述如何在不同分辨率下保持UI的一致性?
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。首先通过UGUI进行自适应,然后通过下列代码实现:

        float globalRate = 1.0F * Constants.ScreenStandardHeight / Screen.height;
        float screenWidth = Screen.width * globalRate;

 

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

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

 

22、Render的作用?描述MeshRender和SkinnedMeshRender的关系与不同?
A renderer is what makes an object appear on the screen,渲染器使对象出现在屏幕上。
Mesh就是指模型的网格(同名组件是用于调整网格属性的),MeshFilter一般是用于获得模型网格的组件,而MeshRender是用于把网格渲染出来的组件

 

23、简述SkinnedMesh的实现原理?
答:http://blog.csdn.net/n5/article/details/3105872

Skinned Mesh中文一般称作骨骼蒙皮动画,正如其名,这种动画中包含骨骼(Bone)和蒙皮(Skinned Mesh)两个部分,Bone的层次结构和关节动画类似,Mesh则和关节动画不同:关节动画中是使用多个分散的Mesh,而Skinned Mesh中Mesh是一个整体,也就是说只有一个Mesh,实际上如果没有骨骼让Mesh运动变形,Mesh就和静态模型一样了。Skinned Mesh技术的精华在于蒙皮,所谓的皮并不是模型的贴图(也许会有人这么想过吧),而是Mesh本身,蒙皮是指将Mesh中的顶点附着(绑定)在骨骼之上,而且每个顶点可以被多个骨骼所控制,这样在关节处的顶点由于同时受到父子骨骼的拉扯而改变位置就消除了裂缝。Skinned Mesh这个词从字面上理解似乎是有皮的模型,哦,如果贴图是皮,那么普通静态模型不也都有吗?所以我觉得应该理解为具有蒙皮信息的Mesh或可当做皮肤用的Mesh,这个皮肤就是Mesh。而为了有皮肤功能,Mesh还需要蒙皮信息,即Skin数据,没有Skin数据就是一个普通的静态Mesh了。Skin数据决定顶点如何绑定到骨骼上。顶点的Skin数据包括顶点受哪些骨骼影响以及这些骨骼影响该顶点时的权重(weight),另外对于每块骨骼还需要骨骼偏移矩阵(BoneOffsetMatrix)用来将顶点从Mesh空间变换到骨骼空间。在本文中,提到骨骼动画中的Mesh特指这个皮肤Mesh,提到模型是指骨骼动画模型整体。

 

24、在场景中放置多个Camera并同时处于活动状态会发生什么?
答:游戏界面可以看到很多摄像机的混合

 

25、Prefab的作用?如何在移动环境的设备下恰当地使用它?
答:Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改

 

26、如何销毁一个UnityEngine.Object及其子类?
答:Destory

 

27、为什么Unity3D中会发生在组件上出现数据丢失的情况?
答:组件上绑定的对象被删除了

 

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

答:将Assets目录和Library目录一起迁移;
导出包;
用unity自带的assets Server功能。

 

29、MeshCollider和其他Collider的一个主要不同点?
答:Meshcollider再快也是基于顶点的~~ 建议还是用boxcollider,boxcollider本身是基于算法,没有面的概念。

 

30、当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
穿透(碰撞检测失败)
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
(碰撞体变大,FixedUpdate, 代码限制)

 

31、OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
答:Awake -》OnEnable-》Start,OnEnable在同一周期中可以反复地发生。

 

32、请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。


33、Unity3D如何获知场景中需要加载的数据?
答:题目是获取的意思?Resource.Load、AssetBundle

 

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

 

第二部分:

1、请描述游戏动画有哪几种,以及其原理?
主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。
关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画。
单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)


2、alpha blend 工作原理?
实际显示颜色 = 前景颜色*Alpha/255 + 背景颜色*(255-Alpha)/255


3、写光照计算中的diffuse的计算公式?
实际光照强度 I= 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);
环境光:Iambient= Aintensity* Acolor; (Aintensity表示环境光强度,Acolor表示环境光颜色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;
(Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)
镜面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;
(Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量,n称为镜面光指数)

 

4、lod是什么,优缺点是什么?
LOD技术即Levels of Detail的简称,意为多细节层次。LOD技术指根据物体模型的节点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
优点:可根据距离动态地选择渲染不同细节的模型
缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。


5、两种阴影判断的方法工作原理?
阴影由两部分组成:本影与半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
求阴影区域的方法:做两次消隐过程
一次对每个光源进行消隐,求出对于光源而言不可见的区域L;
一次对视点的位置进行消隐,求出对于视点而言可见的面S;
shadow area= L ∩ S
阴影分为两种:自身阴影和投射阴影
自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面
工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。
投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
若是动态光源此方法就无效了。

 

5、Vertex Shader是什么?怎么计算?
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。


6、MipMap是什么?作用?
在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。

 

7、用u3d实现2d游戏,有几种方式?
1.利用引擎自带的GUI
2.把摄像机设为Orthographic,用面片作为2d元素
3.利用第三方插件:NGUI、2dToolkit

 

摄像机的投射类型

正交Orthographic(无消失点投影)

无法判断距离

正交视图无法看到一个物体是远离自己还是正在我们面前。为什么?

因为它不会根据距离收缩。所以如果你如果你画一个固定大小的物体在视点前面,同时画一个同样大小的物体在第一个物体的远后方,你无法说那个物体是第一个。

因为两个都是一样的大小,根距离无关。他们不会随着距离而收缩。

UI或2D游戏使用正交相机

通常我们在unity中制作2D UI,或是2D游戏的时候,就会把Camera的投射选择此项,例如NGUI的UICamera组件,默认的视图就是正交,还有2DTookit,也会把Main Camera的视图选择成正交。

透视Perspective(有消失点投影)

透视视图和我们从眼睛看到的视图是一样的。

例子:远小近大

一个高个子的人站在你面前,他看上去是很高的。

但是如果这个高个子站在100米以外,他甚至还没有你的拇指大。他看上去会随着距离而缩小,但是我们实际上都知道,它依然是个高个子。这种效果叫做透视。

例子中提到的两个物体,第二个物体将会显示地更小,所以我们可以区分哪个是离我们近的物体,那个是离我们远的物体。


8、u3d中碰撞器和触发器的区别?
collider碰撞器会有碰撞的效果,IsTrigger = false,可以调用OnCollisionEnter/Stay/Exit函数
trigger触发器没有碰撞效果,isTrigger = true,可以调用OnTriggerEnter/stay/exit函数


9、物体发生碰撞的必要条件?
物体A必须带有(collider+rigidbody)或者CharacterController,另一个物体也必须至少带有collider


10、CharacterController和Rigidbody的区别?
Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的。


11、物体发生碰撞时,有几个阶段,分别对应的函数?
三个阶段,OnCollisionEnter/Stay/Exit函数


12、u3d中,几种施加力的方式,描述出来?
rigidbody.AddForce/AddForceAtPosition,都是rigidbody的成员函数

 

13、什么叫做链条关节?
Hinge Joint ,他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。(简单说就是弹簧)


14、物体自旋转使用的函数叫什么?
transform.Rotate


15、物体绕某点旋转使用函数叫什么?
transform.RotateAround

 

16、u3d提供了一个用于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数?
PlayerPrefs.SetInt 与 PlayerPrefs.GetInt


17、unity3d提供了几种光源,分别是什么?
平行光:Directional Light
聚光灯:Spot Light
点光源:Point Light
区域光源:Area Light(只用于烘培)

 

18、unity3d从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法?
Awake –>OnEnable –> Start –> FixedUpdate –>Update –> LateUpdate –> OnGUI –> Reset –> OnDisable –> OnDestroy


19、物理更新一般在哪个系统函数里?
FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候,FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。


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

 

21、当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
做一个pool,游戏开始时预先实例化足够的数量,然后用的时候取不用的时候收回


22、一个场景放置多个camera并同时处于活动状态,会发生什么?
实际看到的画面由多个camera的画面组成,由depth、Clear Flag、Culling Mask都会影响最终合成效果。


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


24、如何销毁一个UnityEngine.Object以及其子类?
Destroy


25、为什么u3d会出现组件上数据丢失的情况?
一般是组件上绑定的物体对象被删除了


26、u3d下如何安全的在不同工程迁移asset数据?
方法1,可以把assets目录和Library目录一起迁移,
方法2,导出包
方法3,用unity带的assets server功能 

 

第三部分:

1、什么是渲染管道?
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有:
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。

 

2、如何优化内存?
有很多种方式,例如
1.压缩自带类库;
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

 

3、动态加载资源的方式?(有时候也问区别,具体请百度)
1.Resources.Load();
2.AssetBundle

AssetBundle的定义和作用

1,AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;

  2,AssetBundle自身保存着互相的依赖关系;

  3,压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;

  4,把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;

什么是AssetBundle

可以归为两点:

1,它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)

serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)

resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载

2,它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用
 


4、什么是协同程序?
在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。

 

5、你用过哪些插件?
(最好多熟悉几个插件,问的时候好回答)

NGUI:NGUI是Unity最重要的插件之一。使用NGUI可以高效地为游戏添加界面。NGUI是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件,提供强大的UI系统和事件通知框架。其代码简洁,多数类少于200行代码。这意味着程序员可以很容易地扩展NGUI的功能或调节已有功能。对所有其他用户而言,这意味着更高的性能、更低的学习难度和更加有趣。完全集成到Inspector面板中。(以上来自于百度百科)获取NGUI的方式也很简单,直接进入AssetStore中下载就好啦!

NGUI与UGUI的区别:

   1) uGUI的Canvas 有世界坐标和屏幕坐标
   2) uGUI的Image可以使用material  
   3) UGUI通过Mask来裁剪,而NGUI通过Panel的Clip 
   4) NGUI的渲染前后顺序是通过Widget的Depth,而UGUI渲染顺序根据Hierarchy的顺序,越下面渲染在顶层. 
   5) UGUI 不需要绑定Colliders,UI可以自动拦截事件
   6) UGUI的Anchor是相对父对象,没有提供高级选项,个人感觉uGUI的Anchor操作起来比NGUI更方便
   7) UGUI没有Atlas一说,使用Sprite Packer 
   8) UGUI的Navigation在Scene中能可视化
   9) UGUI的事件需要实现事件系统的接口,但写起来也算简单
各自的优缺点:

   1) NGUI还保留着图集,需要进行图集的维护。而UGUI没有图集的概念,可以充分利用资源,避免重复资源。
   2) UGUI出现了锚点的概念,更方便屏幕自适应。 
   3) NGUI支持图文混排,UGUI暂未发现支持此功能。 
   4) UGUI没有 UIWrap 来循环 scrollview 内容。 
   5) UGUI暂时没有Tween组件。

Dotween插件:https://blog.csdn.net/ldy597321444/article/details/51853184

在NGUI中提供了UITween 
来支持UI的动画编写,极度降低了代码的复杂度

然而,我们的UGUI中并没有类似UITween的功能进行支撑 
所以我们用到了第三方插件 DoTween

在我们Unity官方的UGUI的Demo中UI的动画是使用Animator来制作的,试想一下,如果我们的UI如果需要动画效果,那么就需要使用 AnimationController,除此之外,还需要去编辑动画,如果数量不多 的UI可以这样,如果UI过多的需要动画,那么工作量就有些庞大了。所以现在市面上绝大多数使用UGUI开发的公司都使用了DoTween来 辅助完成UI动画的设计,当然,DoTween也可以应用到3D物体上。

 

第四部分:

1、在类的构造函数前加上static会报什么错?为什么?
构造函数格式为 public+类名如果加上static会报错(静态构造函数不能有访问修饰符)
原因:静态构造函数不允许访问修饰符,也不接受任何参数; 
无论创建多少类型的对象,静态构造函数只执行一次; 
运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数; 
静态构造函数执行先于任何实例级别的构造函数; 
显然也就无法使用this和base来调用构造函数。


2、C# String类型比stringBuilder类型的优势是什么?
如果是处理字符串的话,用string中的方法每次都需要创建一个新的字符串对象并且分配新的内存地址,而stringBuilder是在原来的内存里对字符串进行修改,所以在字符串处理方面还是建议用stringBuilder这样比较节约内存。但是string 类的方法和功能仍然还是比stringBuilder类要强。
string类由于具有不可变性(即对一个string对象进行任何更改时,其实都是创建另外一个string类的对象),所以当需要频繁的对一个string类对象进行更改的时候,建议使用StringBuilder类,StringBuilder类的原理是首先在内存中开辟一定大小的内存空间,当对此StringBuilder类对象进行更改时,如果内存空间大小不够,会对此内存空间进行扩充,而不是重新创建一个对象,这样如果对一个字符串对象进行频繁操作的时候,不会造成过多的内存浪费,其实本质上并没有很大区别,都是用来存储和操作字符串的,唯一的区别就在于性能上。
String主要用于公共API,通用性好、用途广泛、读取性能高、占用内存小。
StringBuilder主要用于拼接String,修改性能好。
不过现在的编译器已经把 String 的 + 操作优化成 StringBuilder 了,所以一般用String就可以了
String是不可变的,所以天然线程同步。
StringBuilder可变,非线程同步

6、NGUI Button怎样接受用户点击并调用函数,具体方法名称是什么?
OnClick()
主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick() OnPress()等函数,可以说NGUI的按钮是通过发消息这个方式调用的。

8、<愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.

Vector3 v代表初速度v'代表现在的速度,假设小鸟是沿的z轴也就是transform.forward方向运动的质量为1,那么v‘=v-new Vector3(0,g*t,f*t),transform.Translate(v')做的就是抛物线运动(g为重力加速度不要用现实中的需要自己调试,f为阻力也要自己调试设置,t为时间)

9、设计模式
工厂模式:简单工厂模式解决的问题如如何去实例化一个合适的对象。
简单工厂模式的核心思想:有一个专门的类来负责创建实例的过程。凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂模式进行创建。
代理模式:一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正的类的对象。
代理模式就是多一个代理出来,替原对象进行一些操作。使用代理模式可以将功能划分更清晰,有助于后期维护
策略模式:定义一系列算法,并将每一个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。策略模式的决定权在用户,系统本省提供不同的算法实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用于算法决策系统中,外部用户只需要决定用哪个算法即可。
观察者模式:当一个对象变化是,其它依赖该对象的对象都会收到通知,并且随着变化。对象之间是一对多关系。
单例模式:在C#应用中,单例对象能保证在一个CLR中该对象只有一个实例存在。
(1)某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销
(2)省去new操作字符,降低了系统内存的使用频率,减轻GC压力
(3)可作为唯一核心流程控制逻辑
 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值