一、用Unity开发2D游戏,有三套关系

1.GUI:Unity本身自带的GUI

2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装

3.UGUI:Unity5.X后(其实是Unity4.6以后),Unity找到NGUI的作者,用了一年开发了UGUI,变成内置于Unity中的包,官方主推,

     所有的GUI元素都在Unity的UI工具栏,右键--->UI,后来这个作者因为自己个人的原因离开了Unity

二、3D游戏是以米为单位,2D游戏是以像素为单位。所以用Unity做2D要解决这个问题。有两种解决方案:

3D做2D游戏的方法:

1: 使用正交摄像机:多大就是多大,没有什么变换。

2: 使用透视摄像机,将2D元素移动到合适的距离(Z的位置)。例如设计分辨率为 960x640, 使得在3D世界里面一个图片的大小w*h米,将这个图片移动到一定的距离(Z的位置),在Game视图里面能全屏地显示这个2D精灵。

计算方法:tag(视角*0.5) = (h/2) / zeye摄像机到精灵的距离; zeye摄像机到精灵的距离= h / (2 * tan(30));

     960*640的zeye值大约是554,也就是要把Image的Z轴设置成5.54,这样才能把Image刚好覆盖整个Game视图屏幕

三、3D做2D游戏的步骤:

1.创建一个2D精灵

2.把图片的Texture Type改为Sprite

3.这时候图片属性会出现一个Pixeis Per Unit表示多少像素为一米 ,Pixeis Per Unit 100:100个像素为1米。960*640大小是9.6*6.4米

4.把图片拖进精灵的Sprite属性中

5.旋转图片90度(直接修改Inspector的Z轴参数)

6.设置精灵的Z轴的位置,使得在Game视图里面能全屏地显示这个2D精灵。这个Z轴的数值可以通过计算得出,zeye摄像机到精灵的距离= h / (2 * tan(30));,每个比例像素的Z轴大小都是不同的,其中960*640应该设置为5.54。这一步骤是为了获得这个比例。

7.如果不想改变精灵的Z轴位置,但是又想让它在Game视图里面能全屏地显示,这时候可以修改精灵的X和Y的Scale缩放比例,如果原本Z的大小为10,则X和Y应该缩放5.54,即10/5.54的比例,也就是原来的长度和宽度乘10/5.54得到现在的长宽。这个长宽比原来的大,刚好可以让它在Game视图里面能全屏地显示。这个比第六步更加灵活,更加实用,是3D做2D游戏的解决方案。

四、UGUI

底下有

1.一个Canvas管理所有的子2D的UI节点,等到要缩放的时候,只要缩放Canvas就可以缩放所以2D的UI节点。2D元素适配到3D世界。

 创建的时候会自动创建一个EventSystem节点,用来专门接受管理事件。如果直接创建一个Text,系统也会自动帮我们创建一个父Canvas节点和EventSystem节点。

2.控件(Button,Label)

3.事件响应

五、Canvas节点

有四个组件,这里讲前三个

1.Rect Transform组件:不能改变,一创建就不能修改的组件,而且继承自Transform组件

2.Canvas组件(绘制2D元素的原理):

Render Mode:

  (1)Screen Space (overlay):自适应屏幕空间,覆盖到屏幕上面,像电视机的菜单一样,总是在最上面,可能是使用正交摄像机实现的,因为不开源,所以猜想。

               在Canvas节点下的Image精灵节点直接点击Set Native Size就会让Image节点自适应在屏幕上,在Game视图里面能全屏地显示。    

   Pixel Perfect:勾选的时候,显示的效果更好,subPixel技术。

   Target Dispaly:绘制到哪个屏幕上,可以有多个显示器,选择一个显示器绘制。

  (2)Screen Space (Camera):在没有设置Render Camera属性的时候,和第Screen Space (overlay)一样,会有黄色警告。

    Plane Distance:2D和3D的遮挡关系,可以把3D物体放在2D的Canvas之前,也可以放在2D的Canvas之后,和3D物体的Z轴Position比较大小,但是至始至终Canvas在Game视图里面能全屏地显示。  

        

  (3)World Space:把它当成World空间来做,这时候Rect Transform组件可以改变。我们Canvas下面的的精灵子节点,只需要把它的Z轴的坐标改成0,就可以被换算成对应的能全屏显示在Game视图的坐标。

          等于用手动设置Scale,等于之前3D做2D游戏的手动方法。Canvas Scaler组件在这种模式下没有作用,所以记得要把image的长宽改成9.6和6.4。使得2D和3D节点很好地融合在一起。

                

       

3.Canvas Scaler组件:把3维世界的物体正确地换算到2维世界中,就像上面的缩放X,Y,Z轴10米,则scale的x为10/5.54,y为10/5.54

UI Scale Mode:

    (1)Constant Pixel Size:图片有多大,就把它显示到多大的窗口里面。不会对进行任何的缩放,所以如果是960*640的图片精灵,只能在960*640的分辨率窗口下显示完全,其他的不行。

    (2)Scale With Screen Size:按照屏幕来进行缩放,960*640设计分辨率也可以在800*480屏幕分辨率全屏显示,这个模式比较常用。为了2D元素缩放不走样,宽度和高度都要缩放同样的比例,所以只要一个调节线就可以。

   Match:不同的分辨率转换的时候的X,Y的转换因子大小,比如960*640转800*480,X,Y的比例缩放因子设置,宽度800/960=0.83,高度480/640=0.75,所以那个拉条就是在0.75到0.85之间的数值变化。

         但是我们一般要么固定宽度,要么固定高度,条拉到底。分辨率成倍数的是可以完美转换的,不成的话就会有一些部分长或者宽没显示出来(很少)。

  (3)Constant Physical Size:(1)是按照像素来显示的960*640,这里是按照物理尺寸4:3来显示的

  

注意:Imgae组件是无交互式的组件,里面的Source Sprite属性必须是Spite类型的精灵,Texture类型的不行。Image组件还可以设置颜色,也可以挂材质球(但是不适用于Screen Space (overlay)),设置贴图属性,preserve aspact保持缩放比。

关于Unity中的NGUI和UGUI的更多相关文章

  1. 关于Unity中的NGUI精灵

    NGUI精灵实例 1.创建Unity项目工程和文件目录,保存场景 2.创建一个精灵NGUI---->Create---->Sprite,发现它的UI Sprite组件的贴图属性只支持Atl ...

  2. 关于Unity中的NGUI字体

    NGUI字体类型 1: UIFont字体,UIFont类实现的2: TTF动态字体的使用3: BBCode的特殊字体的使用4: NGUI字体制作5: BMFont字体制作和艺术字体的制作6: UILa ...

  3. Unity中2D和UGUI图集的理解与使用

    图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢? ...

  4. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  5. 关于Unity中的UGUI优化,你可能遇到这些问题

    https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...

  6. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  7. NGUI研究院之在Unity中使用贝塞尔曲线(六)[转]

    鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是 ...

  8. NGUI研究之在Unity中使用贝塞尔曲线

    鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天由于工作的原因须要将贝塞尔曲线加在project中.那么我迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的随意角度的曲线,这两个点一 ...

  9. 关于Unity中NGUI图片精灵响应鼠标的方法

    我在Unity里做NGUI的时候发现一个问题. 在Unity2D场景当中,一个精灵图片只要加上了Box Collider或者Box Collider2D,就可以相应OnMouseEnter和OnMou ...

随机推荐

  1. BIP_BI Pubisher的SQL/XSL/FO扩展函数应用(概念)

    2014-12-01 Created By BaoXinjian

  2. OAF_OAF Framework学习笔记的基本概念(概念)

    2014-11-02 Created By BaoXinjian

  3. Adobe推出HTML5动画设计工具Edge

    HTML5和Flash,是敌对?是共存? 虽然Flash如今依旧牢牢占领着网络动画的大半江山,但这样的状况终将会被改变. 那么,Edge的推出是否意味着Adobe将放弃和屈服于Flash与HTML5之 ...

  4. 以 DirectUI 方式实现的ImageButton

    原文链接: http://www.cnblogs.com/hoodlum1980/archive/2011/02/15/1954779.html 这是一篇比较简单的文章,主要讲解的是用 DirectU ...

  5. c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题

    c++中带返回值函数没写return能通过编译但运行时会出现奇怪问题 例如: string myFunc(){ theLogics(); } 发现调用: myFunc(); 崩溃. 但调用: cout ...

  6. [Jobdu] 题目1516:调整数组顺序使奇数位于偶数前面

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...

  7. vim:过一个字符

    vim由插入模式进入编辑模式,会向前移动一个字符. 利用这个特性,我们可以用他来过一个字符. 什么情况需要过字符?比如:右括号.右引号等等,在括号中间,直接跳出,而不用方向键移动. 向前过一个字符,应 ...

  8. ILRewrite && how to write a profiler

    Rewrite MSIL Code on the Fly with the .NET Framework Profiling API http://clrprofiler.codeplex.com/ ...

  9. MySql 触发器同步备份数据表记录

    添加记录到新记录表 DELIMITER $$ USE `DB_Test`$$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `InsertOPM_Al ...

  10. 找不到编译动态表达式所需的一种或多种类型。是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?

    提示“找不到编译动态表达式所需的一种或多种类型.是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用? ”错误 解决方法:   将引入的COM对象(misc ...