ui颜色变化 unity3d_unity3d多张ui跌在一起只抓取当前ui - CSDN
  • Unity3d UI设计简述

    2017-05-07 01:27:22
    在我们的实训项目中,本人主要负责UI的设计以及unityUI界面的代码编写部分。 由于之前没有对Unity进行过深入的了解,于是在实训开始的初期,我首先对于unity中的UI界面部分的功能进行了了解。 Canvas Canvas是...

    在我们的实训项目中,本人主要负责UI的设计以及unity中UI界面的代码编写部分。

    由于之前没有对Unity进行过深入的了解,于是在实训开始的初期,我首先对于unity中的UI界面部分的功能进行了了解。


    Canvas


    在进行Unity的界面编写时,Canvas是一个很基本的工具,是用于存放所有UI元素的地方。所有的UI元素都必须是Canvas的自对象。
    Canvas是一个画布,就像我们绘图用的图纸一样,所有的控件都必须在Canvas中才能被绘制出来,在其他地方则不能被绘制出来。如果场景中没有画布,那么我们创建任何一个UI元素,都会自动创建画布,并且将新元素置于其下。
    在Canvas上进行绘制时,首先我们要知道,画布上的图形绘制顺序。
    1、对于处于同一个层次的组件来说,先创建的组件先绘制,后创建的组件后绘制。
    2、当控件处于父子关系时,先绘制子物体,再绘制出父物体。

    其次,在一个场景中,Canvas的数量和层级都没有限制。父子Canvas用的是相同的渲染模式。

    Canvas的三种渲染模式如下:

         Screen Space - Overlay(覆盖模式):画布填满了整个屏幕,并把所有的UI元素放在了屏幕的最上层。如果屏幕的尺寸改变,画布也会自动改变尺寸来匹配屏幕。典型例子:大量窗口、文本和按钮的策略游戏。

     Screen Space-Overlay模式的画布有Pixel Perfect和Sort Layer两个参数:

      (1)Pixel Perfect:只有RenderMode为Screen类型时才有的选项。使UI元素像素对应,效果就是边缘清晰不模糊。

      (2)Sort Layer: Sort Layer是UGUI专用的设置,用来指示画布的深度。


          Screen Space - Camera:与上一种情况类似。但摄像机在画布的前方,看起来绘制在一个与摄像机固定的平面上。这种模式可以用于在UI上显示3D模型。典型例子:射击游戏屏幕上的 3D HUD。

         相关参数:

        (1)Render Camera:渲染摄像机

      (2)Plane Distance:画布距离摄像机的距离

      (3)Sorting Layer: Sorting Layer是UGUI专用的设置,用来指示画布的深度。可以通过点击该栏的选项,在下拉菜单中点击“Add Sorting Layer”按钮进入标签和层的设置界面,或者点击导航菜单->edit->Project Settings->Tags and Layers进入该页面。

        可以点击“+”添加Layer,或者点击“-”删除Layer。画布所使用的Sorting Layer越排在下面,显示的优先级也就越高。

      (4)Order in Layer:在相同的Sort Layer下的画布显示先后顺序。数字越高,显示的优先级也就越高。


          World Space:画布与其他对象相同,类似于一个plane。当UI为场景一部分,可以使用该模式。例子:游戏内的手机屏幕、与场景绑定的游戏指导等。

      

    渲染模式 画布对应屏幕 摄像机 像素对应 适合类型
    Screen Space-Overlay 不需要 可选 2D UI
    Screen Space-Camera 需要 可选 2D UI
    World Space 需要 不可选 3D UI
    以上是三种模式的比较(来源于网络)

    由于本游戏的性质,将在编写中选择第二和第三种渲染模式。

     



    Rich Text


           

      因为该游戏涉及到许多文字类的描述和介绍,所以需要对文本本身进行编辑。这里就需要用到RICH TEXT这样工具。

      这种文本用于GUI元素和文本网格可以结合多种字体类型和大小。 GUIStyle, GUIText 和 TextMesh类都有富文本设置,能指示unity寻找文本内含有的标记标签。Dubug.Log也可以用这些标记标签来增强代码报告错误的能力。这些标签不显示,而是显示应用到文本的风格变化。

      富文本使用方法类似 html 标签,比如 "<b>Hello</b>" 将显示为加粗的 "Hello"。

      这些标签还可以嵌套使用。可用的标签有 b(加粗)、i(倾斜)、size(大小)和 color (颜色)。其中 size 和 color 必须指定属性值,如:" <size=50>Hello</size>" "<color=#FF0080FF>Hello</color>"。size 属性的单位是像素,color 属性使用RGBA格式的16进制表示颜色或直接填写常用颜色名称。

      下面列出了Unity支持的所有风格标签(来源于网络)

    标签

    描述

    例子

    备注

    b

    用粗体渲染文本

    We are <b>not</b> amused

     

    i

    用斜体渲染文本

    We are <i>usually</i> not amused

     

    size

    根据给定的像素值设置文本的大小

    We are <size=50>largely</size> unaffected

    虽然Debug.Log函数也可以用这个标签,但是在窗口栏上你会看到行距并且如果size设太大了控制台窗口看上去会比较怪

    color

    根据制定的颜色值设置文本的颜色。颜色可以用传统的HTML格式指定。#rrggbbaa...这里的字母是用一对16进制的数字表示的红色、绿色、蓝色和alpha值(半透明)分量。例如,完全不透明的青色这样指定:

    <color=#00ffffff>...

    也可以使用颜色的名字来指定。这样比较容易理解,而且很自然,颜色的范围是被限定的而且都是完全不透明的 。

    <color=cyan>..所有可用的颜色名字请参考官方文档。

     


    展开全文
  • Unity3DUI设计

    2017-08-06 15:30:30
    UI, 差不多是玩家打开一个游戏最先看到的东西, 差不多也是玩家最不在意的... 好在 Unity 这样的引擎提供了已经很强大的 UI 解决方案, 以及许多其他开发者提供的插件. 但是这还不够. 这篇文章主要谈一谈 UI 的逻辑设
    
    

    UI程序设计

    首先先说一下UI程序设计, 差不多是玩家打开一个游戏最先看到的东西, 差不多也是玩家最不在意的东西. 对开发者来说, 几乎每个游戏模块都与 UI 有联系, 处理不当 UI 就是恶梦. 宽高比适应, 分辨率适应, 像素对齐…光是这些就足够没有经验的开发者浪费大量的时间了. 好在 Unity 这样的引擎提供了已经很强大的 UI 解决方案, 以及许多其他开发者提供的插件. 但是这还不够. 这篇文章主要谈一谈 UI 的逻辑设计而不是排版设计上的经验, 同时也在说明我的插件可以用来解决什么问题.


    一、使用事件
    屏幕角落里有一个 “血条”, 代表玩家的生命值. 决战的时候到了, 玩家抽出他的刚剑与怪物厮杀. 几乎没有人可以毫发无伤的打败怪物. 那么问题来了, 应该在什么时候修改 “血条” 的填充率?

    一个偷懒的做法是每帧去读取玩家的生命值, 然后应用到 “血条” 的填充率上. 好吧这的确可以, 暂时没什么问题 (其实还有一
    种人神共粪的办法是依据 “谁开发谁保护, 谁污染谁治理” 原则…). 然而策划说, 当玩家被攻击时,  “血条” 应当播放一个粒子动画效果, 因为帅. 如果你还是不打算改进方法, 那就缓存玩家的生命值然后每帧对比吧! 但是接下来策划又说, 因中毒损失生命值时播放的粒子效果是紫色的, 因被攻击损失生命值时播放的粒子效果是黄色的. 啊哦, 你放弃了, 你不想改了, 都写那么多了不是吗? 你严肃的对策划说, 这个做不了, 要大改, 游戏做不完的话, 这锅……

    观察者模式闪亮登场! 如果你与世无争对<四十二章经>这种神功秘笈没有兴趣的话, 那么应当很了解 C# 的 delegate 和 event 了 (不了解的点这里). 如果玩家每次生命值变化都大叫一声 “我因为什么原因而损伤/增加多少生命值”, AI 模块可以听见, UI 模块可以听见, Story 模块可以听见, 整个世界都可以听见……我的意思是, UI 在初始化时将 OnPlayerHpChange 方法注册到玩家的 onHpChange 事件里, 当事件触发时根据具体的参数来修改 “血条” 填充率和播放相应的粒子效果, 多么简洁优雅!
    可是不要忘了在恰当的时候取消注册事件. 这大概是最常发生的错误了. HUD 是作为一个非游戏核心模块存在的, 一般仅用来展示
    一些玩家需要关心的信息. 无论如何游戏不能因为 HUD 模块的错误而停止运行. 然而忘记取消注册事件可能导致这种情况发生. 比如某些 HUD 对象已经销毁后, 玩家生命值发生变化时触发这些 HUD 对象曾经注册的事件就会造成空引用异常. 另外一种不取消注册事件造成的错误是, 当游戏关卡重新开始时, HUD 因重新初始化而重复注册事件, 相同的方法在事件触发后执行多次.

     
    二、使用动画
    制作精美的游戏, 几乎都少不了带动画的 UI. 生硬的直接弹出窗口的方式已经是过去式了. 好吧, 那么加动画就是了, 有什么可以说的呢?比如说活动窗口切换问题. 因为动画的存在, 活动窗口的变化不再是 “瞬间完成” 的而是 “经历一段时间”. 时间就是问题. 现在我们在游戏主菜单界面, 点了一下 Options 按钮. 主菜单界面开始滑出屏幕左边界, Options 界面从屏幕右边界滑入. 在动画过程中, 如果玩家手速惊人, 又点了一下主菜单界面的开始游戏按钮会发生什么事呢? 或者只是快速的连续点击了 Options 按钮呢? 
    我们可以认为没有人想这么做, 除非他是误操作的. 好吧既然是误操作那么就忽略吧, 离开一个界面的动画开始时就立即关闭这个
    界面的 “可交互性”. 那么什么时候打开新界面的 “可交互性” 呢? 其实在动画开始到结束的任何时候都可以, 但是从避免误操作的角度出发还是应当在动画结束后才打开 “可交互性”.
    然后是动画控制问题. 现在我们有两个界面同时发生移动, 可能还有颜色, 不透明度, 缩放等一系列视觉属性的变化, 甚至还有 3D 相机的位置和朝向的变化. 我们希望所有的动画同时开始, 同时结束, 并且大多数动画具备相同的变化过程, 比如先加速后减速. 既然如此, 为何不设计一种动画控制器来负责这一切呢? 可以调整变化曲线, 可以设置持续时间, 可以关联多个动画元素, 可以触发结束事件……当动画开始的时候, 我们只需要打开这一个控制器, 这个控制器负责更新所有关联的动画, 最后在动画结束时打开新界面的 “可交互性”.

    最后是开发成本问题. 为了兼容各种不同的设备, 开发中 UI 本身就十分复杂易变, 再加上 UI 动画的存在让制作和修改成本再上
    一层楼. 在动画这一方面, 如果可以避免技术人员重复劳动, 修改代码, 甚至不需要技术人员的参与就可以实现, 无疑可以省去大
    量的成本. 在使用 Unity 这样的完善的开发工具时, 在编辑器中就可以方便的编辑和预览动画将可以大大减少技术人员的开发时间.

    三、使用栈状态机
    你可能知道栈, 也可能知道状态机, 但栈状态机是什么鬼?
    你的主菜单界面有 5 个按钮, 每个按钮点击后都打开一个新的界面, 同时让主菜单界面消失. Easy! 聪明的你写了 “隐藏主菜单
    ” 和 5 个 “显示xx界面” 方法在每个按钮事件里调用. 这没什么嘛. 然后打开的新界面都有返回主菜单的按钮, 你同样写了 5 个 “隐藏xx界面” 和 “显示主菜单” 的方法, 在返回按钮事件里调用它们. 你开始有点烦了. 更麻烦的是每个打开的界面还可以打开下一级界面, 每个按钮都要绑定一个 “隐藏当前界面” “显示下一个界面” 的方法, 最后你会想, 为什么我总是重复做一件相同的事情?
    因为你没有使用状态机. 主菜单界面的 5 个按钮, 虽然点击后目标界面不同, 但都需要先离开主菜单. 如果每个界面是一个 “状
    态”, 当进入状态时显示这个界面, 离开状态时隐藏这个界面, 那么只要状态发生变化, 离开和进入的状态都会做好自己的事情, 
    这样每个按钮的唯一任务就是切换状态了.
    我们再进一步思考这个问题. 既然同一时间只有一个活动界面, 并且只能从这个界面进入下一层界面或返回上一层界面, 这不正是 “栈” 的概念吗? 如果所有的状态都存储在栈里, 那么 “进入下一层界面” 就是栈的 Push 操作, “返回上一层界面” 就是栈的 Pop 操作. 哇哦, 听起来很不错的样子……但仔细想想, 与使用普通的状态机相比, 栈状态机 Push 操作与普通状态机 
    SetState 一样需要一个新状态参数, 只是 Pop 操作比普通状态机 SetState 省略了一个参数而已. 似乎并没有什么根本的区别嘛! 
    这里我们再扩展 “状态” 为 “栈状态”, 在 OnEnter 和 OnExit 基础上添加 OnPush 和 OnPop, 就可以做更多的事情了! 想一
    想, 一个新界面入栈的时候, 旧界面不必完全消失, 可以只是不可交互了而已. 这样就可以实现更丰富的 UI 效果了!

    现在你已经掌握了开发 UI 的秘诀了, 而且也不必重新造轮子,  White Cat’s Toolbox插件可以省去你半年的休息时间, 更重要的是可以立即为你创造更多价值. 而且这已经是第三个版本了. 当然不仅可以做 UI, 还有许多其他实用的工具, 比如路径. 几乎所有的东西都可以通过脚本访问和扩展. 包含完整源代码哦!

    UI优化

    UGUI的优点

    1、所见即所得的编辑方式,在Scene窗口中即可编辑。 
    2、智能的Sprite packer可以将图片按tag自动生成图集而无需人工维护,生成的图集合并方式比较合理,无冗余资源。 
    3、渲染顺序与GameObject的Hierarchy顺序相关,靠近根节点显示在底层,而靠近叶子节点显示在顶层;这样的渲染方式使得调整UI的层级比较方便和直观。 
    4、RectTranForm及锚点系统更适合于2D平面布局,并且非常方便多分辨率屏幕自适配。

    关于UGUI优化的,或许你会觉得UI的制作规范及指导方法与优化无关,其实很多性能问题往往是资源的不合理使用造成的,比如使用了尺寸过大的图片、引用了过多的图集以及加载了不必要的资源等。如果从设计和制作UI一开始就遵守特定的规范,则可以规避不必要的性能开销。笔者根据参与的多个项目总结了以下几点通用的规范和指导方法(这些规范适用于所有项目,不管你使用UGUI还是NGUI)。 

    优化其一: 合理的分配图集 
    合理的分配图集可以降低drawcall和资源加载速度;具体细节如下: 
    1、 同一个UI界面的图片尽可能放到一个图集中,这样可以尽可能的降低drawcall。 
      
    2、 共用的图片放到一个或几共享的图集中,例如通用的弹框和按钮等;相同功能的图片放到一个图集中, 例如装备图标和英雄头像等;这样可以降低切换界面的加载速度。 
      
    3、 不同格式的图片分别放到不同的图集中,例如透明(带Alpha)和不透明(不带Alpha)的图片,这样可以减少图片的存储空间和占用内存。(UGUI的sprite packer会自动处理这种情况) 
      
    优化其二、 resources目录中应该只保存prefab文件,其它非prefab文件(例如动画,贴图,材质等)应放到resource目录之外 
    因为随着项目的迭代,可能会导致部分资源(动画,贴图)等失效,如果这些文件放在resource目录下,在打包时,unity会将resource目录下文本全部打成一个大的AssetBundle包(非resouce目录下的文件只有在引用到时才会被打到包里),从而出现冗余,增加不必要的存储空间和内存占用。
      
    优化其三、 关卡内的UI资源不要与外围系统UI资源混用 
    在关卡内,需要加载大量的角色及场景资源,内存比较吃紧,一般在进入关卡时,都会手动释放外围系统的资源,以便使关卡内有更多的内存可以使用。如果战斗内的UI与外围系统的UI使用相同图集里的图片,则有可能会使得外围系统的图片资源释放不成功。对于关卡内与外围共用的UI资源需要特殊处理,一般来说复制一份出来专门给关卡内使用是比较好的选择。 
      
    优化其四、适当的降低图片的尺寸 
    有时UI系统的背景可能会使用全屏大小的图片,比如在Iphone上使用1136*640大小的图片;使用这样尺寸的图片代价是很昂贵的,可以和美术同学商量适当的降低图片的精度,使用更低尺寸的图片。 
      
    优化其五、 在android设备上使用etc格式的图片 
    目前,几乎所有android设备都支持etc1格式的图片,etc1的好处是第个像素点只战用0.5个字节而普通rgba32的图片每个像素点占4个字节,也就说一张1024*1024图片如果使用rgba32的格式所占用的内存为4M而etc1格式所占用的内存仅为0.5M。但是使用etc1格式的图片有两个限制——长和宽必须是POT的(2的N次方)并且不支持alpha通道,因此使用etc1时需要额外的一张图来存储alpha通道,并且使用特殊的shader来对alpha采样。
      
    优化其六、 删除不必要的UI节点、动画组件及资源 
    随着项目的迭代,可能有部分ui节点及动画已经失效,对于失效的节点及动画一定要删除,在很多项目中,有部分同学为了方便省事,只是将失效的节点及动画disable了。这样做虽然在运行时不会对cpu造成太多负担,但是在加载时会增加不必要的加载时间以及内存占用。对于废弃的UI图片资源,虽然未放到Resource目录最终不会打到包里,但是在Editor模式下仍然会打到图集中从而影响优化决策。 
      

    展开全文
  • 游戏中除了3d场景以外,UI界面也是很重要的一部分,例如主角的头像、血条、背包、按钮等。 下面是myrpg中的简单UI界面,使用NGUI插件制作:   一、导入NGUI插件 NGUI是一个非官方的GUI插件,但是特别好用,...

    个人博客文章链接:http://www.huqj.top/article?id=161

    游戏中除了3d场景以外,UI界面也是很重要的一部分,例如主角的头像、血条、背包、按钮等。

    下面是myrpg中的简单UI界面,使用NGUI插件制作:

    ui.png

     

    一、导入NGUI插件

    NGUI是一个非官方的GUI插件,但是特别好用,所以一般大家都会选择NGUI来制作界面,导入方式很简单,下载NGUI 的unity包然后拖到项目中即可,因为NGUI包有版本要求,所以这里就不贴资源了,大家可以到网上下载。

    倒入之后菜单栏会多一个NGUI的菜单:

    图片.png

     

    二、使用NGUI制作血条示例

    NGUI有一些预制的组件,例如进度条,这可以方便的实现血条显示功能,首先从 NGUI -> open -> prefeb toolbar 打开预制对象

    图片.png

    然后选择一个进度条样式拖拽到Hierarchy中,这样就创建了一个进度条:

    图片.png

    这里的hp bar就是血条,它由多个子物体组成,包括背景色、前景色等,可以在Inspector中设置调整进度条的颜色,大小、位置

    图片.png

     

    图片.png

    然后注意到进度条中on个有一个UISlider组件,通过这个组件的value值就可以调整进度条的进度显示:

    图片.png

    所以在代码中人物血量变化的地方(例如收到攻击、喝药水),重新设置进度条的进度从而实现血条的功能。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    //血条显示

    private static UISlider _hPSlider;

     

    void Start()

    {

        _hPSlider = GameObject.FindGameObjectWithTag("hp").GetComponent<UISlider>();

    }

     

    /**

    * 给主角造成伤害

    */

    public static void GotAttack(int hurt)

    {

       ......

     

        tmp = Health - hurt;

        Health = tmp > 0 ? tmp : 0;

        //血条显示值变化

        _hPSlider.value = (float) Health / MaxHealth;

    }

     

    三、按钮制作示例

    按钮制作的关键在于绑定点击事件,如果使用u3d自带的ui组件还挺麻烦的,但是NGUI就很简单了。

    首先创建一个sprite组件,这个组件其实就可以理解为一个图片,然后选择图集里的一张图片绑定在sprite上,然后在父sprite目录下还可以创建子sprite,同样可以绑定一张图片,这样就可以实现按钮的背景和前景图片了。

    图片.png

    这里我制作的是加血的按钮,所以还有一个数字label用来显示还剩多少血药,效果如下:

    图片.png

    为了实现按钮的效果还需要给sprite绑定一个按钮点击组件,方法是选中sprite之后,点击NGUI->Attach->Collider,这样添加了一个碰撞检测,然后再点击NGUI->Attach->Button Script这样就绑定了一个点击脚本,会发现这时候多出了一个组件可以绑定一个点击函数:

    图片.png

    然后写一个点击事件的脚本,创建一个public的非静态方法:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    /**

     * 使用血药加血(按钮效果)

     */

    public void UseHP()

    {

        UseHP_s();

    }

     

    //用于快捷键

    public void UseHP_s()

    {

        if (HPNum > 0)

        {

            _hero.DrinkPotion();

            HPNum--;

            Health += HPRecoverNum;

            if (Health > MaxHealth)

            {

                Health = MaxHealth;

            }

     

            _hPSlider.value = (float) Health / MaxHealth;

            _hPNumLabel.text = HPNum.ToString();

        }

    }

    然后将这个脚本绑定到任何一个游戏对象中,这里我绑定的是camera,然后将camera拖拽到上面的button script中即可。

     

    四、背包制作

    背包是RPG游戏中不可或缺的一部分,制作背包的过程其实也是使用Sprite的过程,就我这里的背包来说,包含以下几个部分:

    背景、关闭按钮、物品格子、物品图标

    所以首先创建一个sprite并将背包背景图片绑定在上面,然后创建若干子sprite作为格子,并将格子图片绑定在上面,同理还有关闭按钮。最后如果格子里有物品还需要将物品作为一个sprite并且赋给格子的自物体。结构如下:

    图片.png

    然后通过创建一个背包按钮来控制背包的显示和关闭即可。背包中的物品图标应当事先做做成预制体,当游戏逻辑中剪刀物品放入背包后则在格子相应的sprite下面添加一个该预制体。

    向背包中添加物品的方法如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    private bool AddItemToBag(string name)

    {

        //血药和体力值不往背包放

        if (name.Equals(GoodsManager.HP_POTIONS_NAME))

        {

            HeroStatus.AddHPMedicine();

            return true;

        }

     

        if (name.Equals(GoodsManager.EP_POTIONS_NAME))

        {

            HeroStatus.AddEPMedicine();

            return true;

        }

     

        if (goodsNum >= cells.Length)

        {

            return false//背包已满

        }

     

        if (GoodsManager.Name2Sprite.ContainsKey(name))

        {

            //之前这些是放在场景中置为不可见的,需要复制一份出来

            _tmpGoods = Instantiate(GoodsManager.Name2Sprite[name]);

            _tmpGoods.SetActive(true);

            _tmpGoods.name = name;

            cells[goodsNum].AddChild(_tmpGoods);

            Destroy(_tmpGoods);

            goodsNum++;

            if (goods.ContainsKey(name))

            {

                _tmpNum = goods[name] + 1;

                goods.Remove(name);

            }

            else

            {

                _tmpNum = 1;

            }

     

            goods.Add(name, _tmpNum);

        }

     

     

        return true;

    }

    这里因为一些原因我没有将物品图标sprite作为预制体而是直接放在场景中置为不可见,当需要添加的时候复制一份并置为可见即可。而寻找对应

     

    四、背包物品悬浮显示说明以及拖拽丢弃

    背包中的物品需要在鼠标悬浮的时候显示物品说明,以及当背包满了的时候可以拖拽物品丢到地面。实现起来也比较简单,首先要给物品sprite添加一个UIEventListener组件,添加方法就直接点击Inspector中的Add Compenet即可。

    图片.png

    这个组件可以通过委托的方式实现各种事件。添加组件之后给物品绑定一个c#脚本,脚本中指定悬浮、拖拽等方法。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    111

    112

    public class GoodsUsage : MonoBehaviour

    {

        private UIEventListener _listener;

     

        public Texture2D UsageBackground;

     

        private string _desc;

     

        private Vector2 _size;

     

        private Vector2 _mousePosition;

     

        private bool _shouldDraw;

     

        private Hero _hero;

     

        //拖拽时记录物品原来的位置

        private Vector2 _originPos;

     

        // Use this for initialization

        void Start()

        {

            _listener = UIEventListener.Get(gameObject);

            _listener.onHover += OnHoverGoods;

            _listener.onDrag += OnDrag;

            _listener.onDragEnd += OnDragEnd;

            _listener.onDragStart += OnDragStart;

            _desc = GoodsManager.Name2Desc[gameObject.name];

            _hero = GameObject.FindGameObjectWithTag("hero").GetComponent<Hero>();

        }

     

        // Update is called once per frame

        void Update()

        {

        }

     

        //悬浮显示物品用途

        private void OnHoverGoods(GameObject obj, bool isOver)

        {

            if (isOver) //进入悬浮

            {

                StartCoroutine(ShowUsageWait());

                _shouldDraw = true;

            }

            else //退出悬浮

            {

                _shouldDraw = false;

            }

        }

     

        //拖拽

        private void OnDragStart(GameObject obj)

        {

            if (!obj.transform.parent.gameObject.tag.Equals("cell"))

            {

                return;

            }

     

            _originPos = transform.localPosition;

        }

     

        private void OnDrag(GameObject obj, Vector2 delta)

        {

            if (!obj.transform.parent.gameObject.tag.Equals("cell"))

            {

                return;

            }

     

            _shouldDraw = false;

            transform.localPosition = new Vector3(transform.localPosition.x + delta.x,

                transform.localPosition.y + delta.y, transform.localPosition.z);

        }

     

        private void OnDragEnd(GameObject obj)

        {

            if (!obj.transform.parent.gameObject.tag.Equals("cell"))

            {

                return;

            }

     

            //拖拽到地面

            if (Input.mousePosition.x < Screen.width - 430 || Input.mousePosition.y < Screen.height - 500)

            {

                Destroy(obj);

     

                _hero.ThrowGoods(gameObject.name, obj.transform.parent.gameObject);

            }

            else //回到格子

            {

                transform.localPosition = new Vector3(_originPos.x, _originPos.y, transform.localPosition.z);

            }

        }

     

        IEnumerator ShowUsageWait()

        {

            yield return new WaitForSeconds(1f);

        }

     

        private void OnGUI()

        {

            if (_shouldDraw)

            {

                _size = GUI.skin.label.CalcSize(new GUIContent(_desc));

                _mousePosition = Input.mousePosition;

                GUI.DrawTexture(new Rect(_mousePosition.x - _size.x - 10, Screen.height - _mousePosition.y,

                    _size.x + 10, _size.y + 10), UsageBackground);

                GUI.color = Color.white;

                GUI.Label(new Rect(_mousePosition.x - 5 - _size.x, Screen.height - _mousePosition.y + 5,

                    _size.x, _size.y), _desc);

            }

        }

    }

    这里,对于悬浮显示物品使用说明是通过OnGUI方法绘制的,在悬浮事件中设置一个是否绘制GUI的标识,然后在OnGUI方法中判断是否需要绘制说明,并且还需呀实现说明位置跟随鼠标移动,这里通过Input.mousePosition获得鼠标的位置信息。

    对于拖拽事件,实际上有三个委托:OnDragStart, OnDrag, 和OnDragEnd。分别对应点击开始拖拽事件、拖拽中事件、和鼠标释放结束拖拽事件,分别需要实现:记录图片初始位置(以便为拖拽出去的时候复位)、让图标跟随鼠标移动实现拖拽效果、和判断是否将物品拖拽出去了的功能。

    当然拖拽丢弃物品之后还需要在地图上生成一个3d物品,这个就不属于GUI应该做的逻辑了。

     

    鼠标悬浮显示说明:

    1.gif

     

    拖拽丢弃:

    1.gif

    展开全文
  • unity3d 各大插件评测

    2018-01-30 15:00:43
    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具...

    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院


    引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具。为此我写了插件的经验及理论讲解,涉及插件的 学习/辨别/选择/配合。也写了插件的 评测/教程/下载。关于评测,带有一定的主观性,仅供参考。关于教程,热门插件网上已经有很多教程了,本文提供链接,网上资料少的插件本文提供了使用方法的简单介绍。至于下载,主要是学习交流为主,下载速度还是比较快的。
    (PS:本文主要起一个抛砖引玉的作用。欢迎同学们积极留言交流,大牛不吝指教【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院。本文用武侠功夫这个大家比较感兴趣的内容来描述游戏开发,借此描述Unity插件学习的道理,同时激发同学们的学习兴趣,没兴趣的可以跳过相关内容。我的新浪微博 @风宇冲

    本文一共分为三个部分,第一部分是插件的下载,第二部分是插件的评测,第三部分是插件的学习方法。

                                  第一部分 插件的下载

    下载所有插件 (下载时逐个下载比较快)
    注:所有付费插件下载仅用于学习和交流用途,请在下载后24小时内删除,商业用途请购买正版。(你懂的)


                                  第二部分 插件的评测

    Unity插件本文分以下九个类别介绍,后面跟的是风宇冲的推荐插件:
    一 界面制作 推荐:NGUI
    二 2D游戏制作 推荐:2D Toolkit
    三 可视化编程 推荐:PlayMaker
    四 插值插件 推荐:iTween,HOTween
    五 路径搜寻 推荐:Simple Path
    六 美术及动画制作 推荐:RageSpline,Smooth Moves
    七 画面增强    推荐:Bitmap2Material,Strumpy Shader Editor
    八 摄像机管理  推荐:Security Camera
    九 资源包  推荐:Nature Pack
    十 其他类
    一: 界面设计(UI) -  风宇冲推荐NGUI
    综述:所有UI插件可以实现的功能和效果最后都是差不多的,区别是最终游戏的运行效率和内存占用量不一样,开发的速度也不一样。 NGUI和EZGUI是属于一类,核心是将UI元件图合并到一张大图(atlase)上,再根据uv去找对应的小图,最后使用2D camera绘制。 iGUI是另外一种UI插件,它可以说是Unity自带UI的升级版,也就是OnGUI的延伸。了解OnGUI()的同学都知道,它的运行效率是比较低的,没有Drawcall合并,iGUI也一样。中文等字体制作一般是用Glyph Desginer 或者 Bmfont, 这点NGUI和EZGUI是通用的。总体来说, GUI插件的功能还是略微有限, 无论是什么GUI插件想做复杂点的功能就必须得用脚本。学习维护起来还是稍微有点麻烦的,故依然建议一个团队只一个人或几个人专门负责UI。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    【NGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    内存占用   ★
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  

    优点:UI合成图(atlas)管理方便,字体RGB压缩,持续更新,支持Flash,支持语言本地化即多语言,支持图像高低清配置。
    缺点:卷屏界面(ScrollList)的实现稍微麻烦。
    介绍:目前Unity最好用的UI 插件。重点是 NGUI应该会一直更新,跟着Unity的脚步。 NGUI也更方便于管理atlas,至少每个Sprite在atlas中都有名字来管理可以很方便的添加删除共用,并且Sprite的位置大小信息可见也 可适当调整。
    使用注意:
    (1)一个界面,通常也就是一个panel,一定只能有一个atlase, 否则层级极易出现错乱。

    div STYLE="color: rgb(255, 0, 0);" >【FastGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  与NGUI相同
    内存占用   与NGUI相同
    开发速度   
    掌握时间   
    跨越平台  与NGUI相同
    文档教程  
    综合评价  
    NGUI插件的补充,必须先在工程里导入FastGUI。主要用途为对Photoshop的支持,可以利用Photo的分层快速制作NGUI的UI部件,直接在Unity里使用psd即可。

    【EZGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能 
    运行效率 
    内存占用 
    开发速度  
    掌握时间  
    跨越平台  
    文档教程 
    综合评价 
      比较经典的UI插件,目前已经基本不更新了。 
    优点:Unity的元老级UI插件,方便实现快速开发
    缺点:已基本不更新,UI合成图不能单图调整。
    使用中注意的几点:
    1:如果是Prefab中有EZGUI的东西的话,每次修改完最好Apply一下,然后点击Build Atlases
    2:如果贴图合成图(atlase)都默认在Sprite Atlases文件夹下,如果图错乱的话,直接删除贴图重新点击Build Atlases生成贴图合成图即可。
    3:位于scrolllist 下的一切物体必须为 EZGUI的组件 , 否则下拉的时候会不被切图。
    scroll item 显示不完整  : 调整scrollist视口x尺寸
    4:假如 点pixel perfect后 仍不显示尺寸则 点击运行则尺寸恢复正常
    5:Panel只 build atlas 精度不够:  把atlas的分辨率调高 然后删掉 重新build
    6:如果是移动平台开发切记EZ GUI组件选项不能钩 pixel perfect,因为其有auto resize会使在iphone 尺寸错误。
    7:EZ脚本里很多有用函数,其默认为protected,建议将有用函数改成public,方便调用。

    【iGUI】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    内存占用  
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  
    优点:快速开发,可视化
    缺点: 效率低
    iGUI是所有UI制作插件里最牛的可视化工具了。它的口号是 WSYIWYG(What you see is what you get),翻译成中文就是 所见即所得。其UI的实现核心是和Unity自带UI也就是OnGUI()是一样的。所以导致了做到后期一整套UI可能会有几十甚至上百的Drawcall。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    二:2D游戏制作 -  风宇冲推荐2D Toolkit
    综述:核心都是 2d精灵(Spritte)以及帧动画的管理和使用。个人觉得2D Toolkit 比Ex2d好些,更像是制作商业2D游戏的软件。
    【2D Toolkit 】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    内存占用  
    开发速度  
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  
    优点:专业,靠谱
    缺点:精细的碰撞实现较麻烦
    你想做2D游戏?没错,就是它了!笔者也做过一些2D游戏,棋牌的飞行的RPG的都有,2D Toolkit还是很靠谱的。缺点是碰撞检测要么是简单的多边形(三角形四边形神马的)之间碰撞,或者是简单多边形和复杂多边形之间。复杂多边形和复杂多边形之间的碰撞是不支持的。而且复杂多边形的碰撞体需要自己去画。想做出类似像素碰撞检测的效果也是可以的,沿着图形本身的边缘去画,如果你不嫌麻烦的话。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院








    【Ex2d】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    笔者接触了一点,看了其官方提供的示例,感觉比较娱乐。不多评价了。


    三:可视化编程(Visual Scripting) -  风宇冲推荐PlayMaker
    综述:可视化编程在商业游戏开发里可以辅助编程开发而不是替代编程。PlayMaker可以用来做状态管理。uScript可以用来做简单游戏的开发。
    【PlayMaker】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化程度
    细节功能  
    运行效率  
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  

    优点:状态管理
    缺点:实现其宣扬的无编程做游戏不靠谱,多状态功能难管理
    Asset Store上面很火的插件,官方说可实现无编程制作完整的游戏。这个个人感觉,你要做个类似俄罗斯方块或者弹弹球之类的小游戏是可以的,但是完全不编程制作商业级的游戏真心不靠谱。举个例子,游戏要赚钱你要嵌入广告sdk或者是IAP等付费sdk,那么你就得写脚本去实现。 不过PlayMaker也还是有可取的地方,其核心在于 将例如站立行走死亡等等状态通过状态机简称FSM(finite state machine)来管理。简单来说一个物体就是一个FSM,一个状态对应一个state。游戏过程中能在物体上方实时显示该物体的状态。并且有很方便的图表管理。缺点在于:所有功能必须对应状态。有很多共同状态都需要的功能用Playmaker做会极其麻烦,比方说,你有一个人物,有5个状态,还有行走攻击等控制输入,每个状态都要控制输入的话,同样的代码你就要有5份,很麻烦。而正常代码的话只需要简单的一段代码几个状态的与运算就可以了。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院



    【uScript】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化程度
    细节功能  
    运行效率  
    开发速度   
    掌握时间   
    跨越平台   
    文档教程  
    综合评价  

    优点:流程清晰
    缺点:功能不够细致
    如其宣传的,uScript模仿了UDK和CE3的开发形式,注重逻辑流程,所见即所得,逻辑性直观紧凑。但是模块还不够全面功能不细致,例如你可以给材质赋贴图,但是要改变材质颜色就找不到对应功能了,类似情况挺多的。
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    四:插值插件 (Tween tool)-  风宇冲推荐iTween / HOTween
    综述:iTween和HOTween各有各的优势,核心功能就是对位移,缩放,颜色等数值进行插值。iTween和HOTween并不冲突,可以同时在一个工程里使用。建议做路径的话最好用iTween, 做非位移,缩放,颜色的数值时只能用HOTween。其他情况最好用HOTween,因为管理更具有可操作性。
    【iTween】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性    
    简易度    ★
    综合评价  
    优点:免费,通用,实用
    缺点:不够稳定,不能返回改变目标tweener
    介绍:免费的经典tween插件。Tween,包括位移,缩放,颜色变换等。NGUI,EZGUI,PlayMaker等很多插件都使用它来实现tween部分。缺点是tween的过程中,如果物体被销毁等情况,容易产生不可预制的错误。
    【iTweenPath】
    可视化    ★
    实用性    
    简易度    ★
    综合评价  
    优点:免费,路径清楚,实用
    介绍:iTween的补充插件,主要是可视化的绘制路径,然后在iTween里使用生成的路径。可以用于TD地图怪物的路径移动。
    使用方法:(1)导入插件后 (2)随便任何一个物体,把iTweenPath拖上去 (3)inspector里设置路径点数量 (4)在选中该物体的前提下,在Scene View里拖拽各个点绘制路径 (5)给路径起名例如 'xyz' (6)代码里使用即可,例如iTween.MoveTo(obj, iTween.Hash("path",iTweenPath.GetPath("xyz"),"time",10f));
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院



    【HOTween】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性    
    简易度    ★
    综合评价  
    优点:免费,管理比iTween更方便,使用范围更广
    缺点:可视化补充件HOTween Edtior作用position时不能像
    iTweenPath那样显示路径。
    介绍:类似iTween的 tween插件,功能更为强大。目标类型不再仅仅为position,color等固定类型,任何你在脚本里定义的public, non-static的 numeric 即 color/vector/int/float/double/string 变量都可以作为目标。并且调用函数后会返回tweener,如果储存tweener可以随时 监测/停止本次tween。
    使用方法:(1)导入插件
    (2)使用HOTween的脚本里添加using Holoville.HOTween;
    Start()里添加HOTween.Init();
    (3)   TweenParms tmp = new TweenParms();
            tmp.Prop("position",new Vector3(5,0,0));
            tmp.Ease(EaseType.Linear);
            HOTween.To(obj.transform,1,tmp);
     其中 position如果换成自定义变量,obj.transform就要换成对应的脚本对象即可。

    序列tween使用方法:
    (1)mySequence = new Sequence(new SequenceParms().Loops(3,LoopType.Yoyo));
    (2)
    mySequence.Append(HOTween.To(myGameObject1.transform, 1, new TweenParms().Prop("position", new Vector3(10,20,30)).Prop("rotation", new Vector3(0,720,0)).Prop("localScale", new Vector3(4,4,4)).Ease(EaseType.EaseOutBounce)));
    有Append /
     Prepend / Insert三种方法,Append是加在序列最后,Prepend是最前,Insert是即将到来的目标
    注意:(1)HOTween.To 等方法是低效的,储存返回的结果tweener,然后反复使用例如tweener.Play()更高效
    (2)Tweener及TweenParms相当于一个容器, 下面填的变量才是真正要改变的内容。
    【HOTween Editor】(要求Unity 3.5.6以上)
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化    ★
    实用性    
    简易度    ★
    综合评价  
    优点:高效,快捷
    缺点:插值作用于position时,无路径显示。
    使用方法:
    (1)选中目标物体 (2)Component->HOTween->HOTweenComponent  (3)在Inspector下的界面点击 蓝色的‘+Add Tween’(4)选择tween目标 (5)点击蓝色的‘+’,注意你想要改变的变量点这一步才会出来。(6)选择要插值的变量 (7)填Tween To等值即可
    (8) 关闭'AutoDestroy'和‘Autoplay ’ (9) 脚本加
    using Holoville.HOTween;
    using System.Collections.Generic;
    (10)调用该tween
        HOTweenComponent tweenComponent = myGameObject.GetComponent<HOTweenComponent>();
            if (tweenComponent != null)
            {
                // Do something with the Tweeners
                List<Tweener> tweeners = tweenComponent.generatedTweeners;
               
                if(tweeners[0].id == "tweenerName")
                {
                    tweeners[0].Play();
                }
            }
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院








    五: 路径搜寻(Path Finding)-  风宇冲推荐SimplePath
    综述:路径搜寻主要用于怪物的AI行走,以及人物点击移动。这两个路径算法核心思想都是:先将地图划分成方格区域(像棋盘一样),然后根据方格内是否有障碍物对方格进行赋值,最后生成 单位位置 与 目标位置间的格子路径。想具体学习的童鞋可以百度 A star等算法。
    【SimplePath】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院


    运行效率  
    掌握时间   
    文档教程  
    综合评价  
    官方介绍说支持500+agent,即支持500个单位同时寻路,下方提供的对应插件中带有展示Demo。

    【A* Pathfinding Project】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    运行效率  
    掌握时间   
    文档教程  
    综合评价  
    使用标准的A star算法,下方提供的对应插件中带有展示Demo。



    六:美术及动画制作 -  风宇冲推荐RageSpline,Smooth Moves
    【Smooth Moves】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性    
    简易度    
    掌握时间  
    文档教程  
    综合评价  
    介绍:神马?你们团队没有做动画的人?那么就用它吧!2D骨骼动画制作插件,不支持Flash。骨骼动画文件可以复用。比帧动画省空间占用。
    优点:动画文件复用,省空间
    缺点:
    使用简介:
    一:制作Atlase (1)Project栏下创建Smooth Moves Texture Atlase Data (2)选中atlase 文件,点击open atlase Editor (3)把素材图往里拖。
    二: 制作Animation  (1)Project栏下创建Smooth Moves Texture Atlase Data (2)选中animation文件,点击open animation Editor (3)点击Bone下面的 ‘+’图标,创建骨骼节点(腰,头,腿,足等等,支持中文)(4)点击Animation Clips下的‘+’,创建动画(站立,行走,攻击等)。(5)选中帧序列界面里的 黄色方块 (6)Type选择Image(Transform就是隐藏,所以通常设置为Image)(7)选择图 (8)选择任意同行的黑块,右键选择Duplicate First Key Frame (9)执行 6-7 (10)然后设置pivot,rotation等信息(11)搞定了!点击play看效果吧!
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    【RageSpline】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性   
    简易度   
    综合评价 
    介绍:矢量绘图工具,矢量的好处大家应该都知道,就是不会因为放大而损失质量。 适用于矢量风格的2D游戏以及2D UI的制作。程序会了这个美术就要失业了!
    使用方法: (1)新建一个空的GameObject (2)贴上RageSpline脚本,然后基本形状就出来了 (3)调整形状,具体是 鼠标双击=创建节点 N=圆滑和锋利的边角模式切换 K=削薄边缘 L= 增厚边缘 delete=删除节点 (4)调整边缘颜色outline color 以及填充颜色 Fill Color,大功告成!
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    【Mega-Fiers】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性   
    简易度   
    综合评价 
    介绍:模型变形工具,简单实用,可以用于3D字体的弯曲效果等等。
    使用方法:非常简单, (1)选中要变形的物体,(2)上方菜单Component->Modifiers->Modify Object (3)添加任何预制变形,例如弯曲则是 Component->Modifiers->Bend (4)之后在Inspector里调对应数值即可。

    七:画面增强 -  风宇冲推荐Bitmap2Material,Strumpy Shader Editor
    【Bitmap2Material】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    细节功能  
    运行效率  
    掌握时间   
    文档教程  
    综合评价  
    优点:方便,实用。
    缺点:尚未发现。价格过高【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    使用方法:将包里的Bitmap2Material.sbsar拖进unity工程,然后直接将你的原图拖到下方例图的'Input'上去,它会自动生成法线贴图灰度图等效果图,效果还是不错的。并且支持将随便的一张图制作成Tile图,可以无缝拼接的哦。之后就自己在Insprector里微调吧!
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院


    【UniSky】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    实用性   
    简易度   
    效果 
        
    兼容性
       
    综合评价 
    优点:云与日月层叠效果逼真,有云起云散
    缺点:缺少下雪等特效,有紫色斑点等BUG。
    介绍:24小时实时 天空盒+天气插件。天气主要是下雨和storm,不过效果一般,建议另外。画面效果不错,不过需要自己去配置, 例如大太阳的天气去下雨肯定不真实,下雨的时候至少要把天空调成阴暗的,有一种乌云密布的感觉。并且天气与地形与单位的互动,需要另外添加,比如溅射到地面的水花等等。月亮放大后在某些显卡下会有紫色斑点。
    使用建议:
    风:Unity的Windzone
    雨:Unity官方Demo《AngryBot》 里面的雨
    使用方法:链接

    【Strumpy Shader Editor】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    可视化   
    实用性   
    简易度   
    综合评价 ★★★★★
    优点:实用,免费
    介绍:渲染器Shader的可视化编辑器,可视化的界面和PlayMaker,uScript用起来差不多。顶点渲染,像素渲染和光照模型渲染三种模式都支持。使用前最好对 三种类型Shader的代码写法有所了解,再使用该工具能起到事半功倍的效果。
    使用方法:(1)插件载入到工程里 (2)菜单Shader Editor->Stumpet Shader Editor。 (3)点击New Graph (4)在图表界面Master右方,右键创建 Tex2D 以及 Sampler2D (4)连线如下 (5)点击Update Graph,之后能看见预览图了 (6)点击Export As,生成Shader文件
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院

    注意:(1)每次改动完需要点Update Graph更新预览。 (2)删除连线:鼠标移动至线上,点击右键
    (3)UV x或y的单变化使用UV_Pan (4)图表视口的移动为 alt + 鼠标左键
    StrumpyShader详细教程

    八:摄像机管理 - 风宇冲推荐 Security Camera
    【Security Camera】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    实用性   
    简易度   
    综合评价 
    优点:简单,实用
    介绍:摄像机管理插。Unity里管理多相机很麻烦,Camera Preview不实用,来回启用禁用也繁琐。Security Camera能快速查看各个相机的实际效果。
    使用方法:插件载入到工程里后,直接把SecurityCamera.cs脚本拖到各个相机上,然后在Game View里就可以直接分开看单个相机的效果了。
    注意:(1)相机不能重名 (2)只有一个主相机,标签tag为'MainCamera'


    【Ultimate FPS Camera】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    介绍:FPS摄像机的控制插件,没什么好说的。工程里导入插件后直接按里面的文档做就行了。

    九:资源包类(Models & Particles)
    综述:这个就不用多说了,好多有用的资源啊,太省事了!
    【Nature Pack】
    介绍:大自然的树,花,草等模型
    【Ruin city】
    介绍:一个被破坏的城市的模型

    【CartoonSnow】
    介绍:卡通雪效果


    十:其他类
    【uniSWF】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    优点:支持元件经典动画(Classic Tween),无需转换成序列帧
    缺点:不支持图元(Shape)形变,转换成序列帧
    介绍:在unity里使用flash的元件(主要是MovieClip)来制作UI什么的,对有Flash开发经验或者Flash资源的可能比较有用。

    【ORK】(Okashi RPG Kit)
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    介绍:看了看youtube上的教程视频,ORK没什么意思,它整套的UI包括商店,用的是Unity自带的UI,这整套东西你拿来改还不如自己做好,又快又准又能精确调整。就不评分了。这里仅供下载,没事可以看看,如果有兴趣做RPG的新手可以去下个RPG Maker XP看看它的框架是怎样的。做商业级RPG的还是根据需要自己搭框架吧。

    【Tower Defense ToolKit】
    【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 - 风宇冲 - 风宇冲Unity3D教程学院
    介绍:不评价了,理由前文有提到过, 仅提供下载。


    还有下面一些主流插件没有找到,欢迎补充。
    【Mixamo】无下载
    介绍: 模型动画插件,500美刀,伤不起啊。不过Unity4的动画系统已经改进很多。所以这个插件不用也罢。
    【Audio Toolkit】无下载
    介绍:音频管理插件,可以提高音效质量。32.5美刀
    【FX Maker】
    介绍:粒子系统库。100美刀
    【Easy Water】
    介绍:水面模型。7.5美刀
    【Easy Touch】
    介绍:触屏控制插件。20美刀
    【MakeYourLevel】
    介绍: 环境模型库。 22.5美刀

                                    第三部分 插件的学习方法

    插件的学习: 学插件有如大侠学武功。先练内功根基,再练上乘武功。内功根基是指 线性代数,计算机图形学,编程基础,Unity基本API等等。基础不要求同学们要有多精通,至少基本的原理和使用要懂。上乘武功是指各种插件。如果内功 根基不扎实而强修秘籍的话,也许会像天龙八部里的鸠摩智一样走火入魔。在游戏开发里,通常表现为卡在一个地方,模模糊糊的怎么都过不去,各种纠结。假如你 遇到了类似情况,建议回过头静下心来温习下相关的基础知识,等过后头脑缓过来了再理理思绪,分析分析条理,一般问题在这个时候就解决了。

    插件的辨别:游戏开发如大侠比武,比的是游戏,武功(插件)不同,实力当然也不同。 好的武功能把你的特性发挥的淋漓尽致,PK有如行云流水。差的武功会让你瞬间被秒杀,无缘Grossing榜。好的插件能很好的和你的项目本身配合,达到 提高开发效率的目的。不好的插件你研究它得花费大量时间又还得花时间,又还得花时间修改调试,很有可能反而会降低效率。所以分辨插件的优劣很重要。我总结 了以下几点,能快速分辨插件的好坏:
    好的插件(1)首先,Asset Store上排名高的一般都好用,什么榜都行,当然还是Top Grossing 最有分量,不好的东西谁愿意付钱呢?如果没有排名就看评价数量和内容吧(2)国内相关介绍讨论比较多的一般都好 (3)教程详细的,特别是有语音高清教程的。
    不好的插件 (1)搜索到的相关信息极少的 (2)无排名,评价少 (3)教程粗糙

    插件的选择: 上乘武功需要专精,令狐冲专精剑法,独孤九剑笑傲江湖,郭靖专精掌法,降龙十八掌威震武林。你不可能把天下所有武功集于一身。Unity开发也是,不可能 所有插件你都精通,只能是选取一些对你用处比较大的插件重点学习使用。所以插件的选择就比较重要了、一般来说比较实用的是单个功能块的插件,比如做UI选 NGUI, 插值控制用iTween, 2D游戏用2D Toolkit等等。而综合类插件就不建议实用了。例如做塔防类游戏的 Tower Defense ToolKit, 做RPG游戏的Okashi RPG Kit,这类插件是专门为做一类游戏而生,集成了很多很多功能,但是每个功能又做不到很专业,所以假如你要用,还得自己改,而这类插件一般定制的调整空间 比较小,目前来说还达不到专业的级别。所以如果你做很专业领域的游戏,比如赛车,有个start kit能节省很多时间,毕竟一辆车有几十上百个参数,通常没有必要自己做物理模型。其他一般的游戏比如塔防,闯关什么的就没必要找个类似start kit的东西了。

    插件的配合:上乘武功则需要配合, 例如张无忌的太极拳+九阳真经+梯云纵+乾坤大挪移。招式太极,内功九阳,轻功梯云纵,能量转移则乾坤。配置组合插件道理也一样,使用什么样的组合就要看游戏本身的定位如何了。假如使用了与游戏定位不符合的插件,效果通常只能事与愿违。例如,做个2D游戏,自然用不到 Bitmap2Material,2D游戏也不需要法线贴图灰度图什么的吧。又如做一款商业级别的移动平台游戏用了iGUI制作UI的话,在 Android和iOS各自的低端机上的表现到最后会让你头疼不已。武侠的世界里,武功会有冲突,例如九阳神功九阴真经不能调和,插件同样也是有冲突的,不尽早发现的话后期面对一堆Bug会让你欲哭无泪的。后文中陆续提到了一些兼容或冲突,有些插件在Asset Store上的介绍也会有相关信息,例如某插件会在介绍里写明与NGUI兼容,与PlayMaker兼容。更多的需要同学们事先了解或者实验出来。本段下方举了插件组合的例子供大家参考。

    2D 横屏动作游戏 :2D Toolkit + NGUI
    3D 第一人称射击 :NGUI + Simple Path + Bitmap2Material + PlayMaker + Security Camera + Stumpy Shader Editor
    独立开发2D游戏:(1)Photoshop/Illustrator等外部绘图软件 + Smooth Moves + NGUI
    (2)RageSpline + 2D Toolkit + NGUI
    简易非商业开发:iGUI + iTween
    塔防游戏: iTween/ Simple Path + NGUI  +其他
                
    展开全文
  • Unity3D_2D游戏实例从零讲起(3)——基本菜单UI的实现   游戏除了基本的画面渲染,操作对象等等,还需要各种UI菜单来辅助玩家,或是引导,或是做游戏设置。比如,登录菜单,图片的显示,人物血条等等。  游戏...

    Unity3D_2D游戏实例从零讲起(3)——基本菜单UI的实现

     

    游戏除了基本的画面渲染,操作对象等等,还需要各种UI菜单来辅助玩家,或是引导,或是做游戏设置。比如,登录菜单,图片的显示,人物血条等等。

                                              游戏——辐射4的UI界面

     

    为什么要有单独的UI制作系统呢?

    UI是任何一款游戏都不能或缺的部分,而且占了非常大的一个比重,他相比游戏对象(尤其是3D游戏),更多的是文字与图片,就是为了让玩家更方便的进行游戏。这些文字与图片的显示多半不像3D模型那样需要复杂的渲染过程,而且经常需要显示在视窗的最上层(也就是里摄像机最近的地方),所以引擎有必要来提供一套好的UI解决方案。

     

    在Unity5.0版本发布之前,由于原生GUI的各种问题(虽然4.6版本新的UI系统就已经发布但是bug比较多,不完善),大家基本推崇的UI工具是NGUI,是一款很好用的UI制作插件。但是在5.0版本之后,新的UGUI系统已经在多个方面由于NGUI,所以完全可以考虑使用UGUI,当然NGUI还是值得一用的UI插件,目前的话大家自行取舍。

    下面是从蛮牛社区找到的一个关于二者的对比。


    (可滑轮+ctrl放大观看,或者右键在新窗口中打开图片)

    然而下面我首先要说的UI制作方式却不同于以上二者,可以说是最笨的办法,也是我当时做游戏最开始的办法,为什么说这个笨的办法?因为这里我想做一个对比,而且想从基本的UI实现原理给大家一个思路。

     

    一种笨却又简单的UI实现方式:Ray

    这个例子大家可以试试,但是不建议之后也使用,要知道我们其实也可以使用原生的按钮,然而我和各位都应该知道,这个太丑了,没有游戏会用这样的按钮。

    在游戏的开始菜单操作里面,我们无非是点击鼠标,然后被点击的按钮响应,然后执行某个操作。在平时我们浏览网页,使用软件的时候,你的鼠标或手指触碰的地方会触发一个消息事件。在这之前,程序的定时器不断刷新来捕获回调事件,程序需要判断你鼠标所在的位置,进而判断你是否点击到了按钮。

    那么用Ray实现其实是类似的道理,你在摄像机的这个位置发射一个Ray(射线),这个射线就像激光一样向前照射,一旦它碰到任何刚体(在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体,就是一个理想的物理碰撞模型),就会反射回来。然后,你判断他是否碰撞到了你想让其碰撞的物体,并处理。

    听到这里,你肯定就理解了,那UI无非就是把所有的按钮做成一张张图片放在摄像机最前面,然后在鼠标点击的位置向前发射一个Ray,判断碰撞的是不是你要的按钮,是的话就做处理。尽管这种办法,很蠢,对于复杂的UI界面也很难实现,但是原理与方式却是非常简单的,你只需要把图片做的好看一点,写几句代码就可以的。

    下图是我实现的一个例子的效果:


     

    1.首先制作好所有的图片素材


    2.将图片都导入到新建的MainGUI文件夹中


    3.将图片一个个拖到场景编辑窗口上,按照设计的位置摆放好.这里要注意几点:

    如果图片显示不正常就需要在文件浏览器里面点击图片——Inspector属性界面——点击Texture Type——先点击Editor GUI and Legacy GUI——然后点击下面的Apply——之后再点击sprite(2Dand UI)——再点击Apply就可以的


    如果觉得看起来显示不清就可以设置图片的最大尺寸,点击该窗口的Max  SIze选择1024或更高(一般1024就足够了)

    由于Ray的方式是发射射线,所以位于前面的物体会将后面的物体挡住,所以要设置好优先级OrderInLayer,比如退出确认界面就应该优先级高。在右边实体的属性列表设置,

    注意:设置z值并没有用


    当然也可以通过设置坐标来改变显示的顺序,摄像机方向(一般是垂直与X0Y面),改变Z值即可。

    4.由于Ray只有在碰到带碰撞盒组件的物体才会产生碰撞消息,所以这里要对图片添加碰撞盒组件。

    在场景中点击图片——在Inspector栏点击Add Component——Physics 2D——Box Colider 2D。这是2D碰撞盒的一种,还有圆形的,多边形的,可以在碰撞盒所在的范围进行碰撞检测并模仿真实的碰撞效果。

    (这里顺便解释一下什么是刚体RIgidBody:刚体本身是一个理想化的受力模型,受力不改变形状与大小。在游戏中,一个刚体组件就表示这个物体会受到力的作用,比如重力,阻力等,这些可以有玩家去自由调控)


    5.编码,有以下几点注意:

    GameObject exitGame=null;//代表退出游戏按钮 由于要获取到Ray碰到的实体,所以这里先定义一个实体成员变量用以存储场景中的按钮实体。

    我们可以给场景中的实体命名,并用exitGame=GameObject.Find ("退出界面");的方式来获取该实体。

    这是判断是否点击按钮并做处理的代码,写在update里面

    if (Input.GetMouseButtonDown(0)) {  //如果点击了鼠标左键
                              Rayray=Camera.main.ScreenPointToRay(Input.mousePosition);//定义射线对象
                              RaycastHithit; //实例化击中类对象
                             
                              if(Physics.Raycast(ray,outhit))
                              {
                                       name=hit.collider.gameObject.name;//通过hit到的物体来获取该物体的名字
                                       Debug.Log(name);
                                       switch(name){
                                       //关于,退出等按钮
                                       case"返回":  //如果击中返回这个实体,就执行下面的操作
                                                about.transform.position=newVector3(0,11,-2);
                                                break;
                       }
                  }
    }


    因为这个点击的功能是一直存在的,所以把他拖到一个常驻在场景里的实体(最好是一个主按钮,或者新建一个空的名为 clickscript的空实体。)

    关于Ray方式想说的:大家看到Ray方式第一反应应该是第一人称射击游戏,没错~fps等三维游戏的瞄准与射击基本上就是这个思路,向准星的方向发射一条射线,然后沿着射线发射子弹。这里使用这种方式却是不是很恰当,但是却很直观。在最开始接触Unity的时候,特别是什么也不懂的时候,可以用这个方式做一些简单UI。

    然而,一旦UI变得复杂,我们想实现更多的效果,这就显得有点力不从心了。比如,一般按钮都有点击,按下,离开多个状态,不同状态不同效果,你说怎么实现?如果实现比较酷炫的界面移动(比如PPT里的各种动画),难道你要写个算法来让其做空间位移么?如果想让UI能够按一定比例跟随角色呢?不同分辨率的设备怎么自适应呢?而且,这里使用还有诸多限制与问题,比如必须是刚体,Ray的使用效率怎么样,需要设置坐标优先级等等,所以,这确实不是一个好的方式。

     

    下面,就介绍新5.0以后比较流行的UI制作方式——UGUI

     

    同样也是制作这个界面,但是我们换一种方式,而且效果更好,更方便。(之后如果出现图片显示不正常的情况可以参考上面的第三部的相关注意事项①)

    1.制作好素材,将图片都导入到新建的MainGUI文件夹中,点击菜单栏的File ——New Scence新建一个scence场景。


    2.点击菜单栏的GameObject标签——UI——Image

    建立之后我们就能看到在左边的场景实体列表(Hierarchy)新生成了三个实体

    Canvas:画布,相当于一个呈现界面UI素材的容器。

    Canvas下的子实体Image:每个UI控件都是由美工设计的图片构成,这个就Image是放自己设计的图片的实体

    EventSystem:监听UI相关的事件实体,用来支持点击触碰等。

    这时我们可以看到一个白框,这个白框就是我们游戏看到的范围。


    3.先制作背景

    将实现制作好的背景素材拖到Image实体的Image(Script)的Source Image属性上,这时我们看到图片已经放到了屏幕上(新建的Canvas可能比较大,看不到全局的情况滑轮缩小视窗)

    但是会发现显示不正常,这时候点击下面的按钮SetNative Size,并修改一下位移值PosXPosY都为0。


    我们希望我们的背景一直是充满屏幕的而不是随着分辨率的变化而变化,所以我们要做一些工作,这在原来的GUI系统是一个比较麻烦的事情,需要自己写脚本来满足自适应。但是UGUI系统已经很好的解决了这个问题,现在新的版本新建的Canvas都有一个属性栏叫做CanvasScaler,点击UI Scale Mode选择Scale With Screen Size。然后填上你需要机型的分辨率,一般都是1920*1080,注意,如果你的图片素材尺寸较小,可以选择小一点的分辨率,只要满足16:9就可以的。

    另外,部分Unity系统的版本可能不支持CanvasScaler(Unity 5.0的b9),可以在Canvas实体Inspector窗口点击Add Component——Layout——Reference Resolution,然后进行同样的操作。


    点击一下开始游戏,在Game窗口设置分辨率(上一篇Unity博客有介绍)改变窗口大小,发现图片始终充满屏幕。


    我们发现,在Image的Inspector窗口做上有一个锚点的设置,这样可以比较方便的让我们的图片中心定位在某些位置。同时调节X,Y坐标就可以放在任意位置。


    4.制作按钮

    我们在Canvas的实体窗口位置右键创建UI——Button,然后我们可以在Inspector窗口看到同样的界面,我们仍然可以像刚才一样把按钮素材拖到Image的SourceImage上面——点击SetNative Size,如果觉得图片的尺寸不合适可以在上面的Scale设置图片的缩放比例。


    我们可以运行一下程序看一下效果,按钮有点击的效果,鼠标放在上面的效果。这个功能归功于下面的Transition功能,当前我们看到默认的是ColorTink,也就是按钮的点击效果都是靠颜色与Alpha透明度来调节的(差点写AlphaGo了~~)可以在游戏运行的时候修改颜色看看效果。

    Transition还有两个选项,

    SpriteSwap:根据制作人自己设计的素材来设置点击,释放的图片效果。

    Animation:这个是利用Unity的动画系统来制作按钮的动画效果。


    今天写的有点多,关于监听事件的内容之后再慢慢更新吧。

    展开全文
  • Unity3D 4.6 新的UI系统

    2014-09-11 22:45:35
    Unity3D 4.6版本中,终于增加了新的UI系统。虽然从功能,效果等方面来讲,跟NGUI还有一定的差距,但NGUI毕竟是收费插件,对于游戏商用来说有一定的制约。 下面我们来看看,Unity3D 4.6中新的UI系统吧。
  • 就比如可以在鼠标移动到UI上面的时候显示文字。 那么如何在UGUI上,鼠标移动上去显示文字说明呢。 大家都知道,当鼠标移动到button按钮上面的时候会出现变化,主要是button这个组件在控制 既然可以控制颜色,就一定...
  • //首先我们创建三个Slider 和一个Cube,为了方便查看,我把Slider下面的Handle分别改变颜色并和名字一一对应; 然后我们把脚本放在Cube上,并且把三个Slider分别 拖进去 具体脚本如下:using UnityEngine; using ...
  • 写在前面 本次项目较为简单,代码上传到GitHub上:Github传送门 课程实验资料在老师的课程网站上:传送门 实验的视频链接(本次实验演示较简短):传送门 实验内容 实现简单血条预制: 分别使用 IMGUI 和 UGUI ...
  • 在上一篇文章中,我们以经典的打砖块游戏为例,讲解了一个Unity3D游戏的完整实现过程。今天呢,我们来做一个在游戏中十分重要的组成元素:血条。血条是什么呢?血条是生命值的一种体现,就像《仙剑奇侠传三》电视剧...
  • Unity3D技巧】一个简单的Unity-UI框架的实现 https://www.cnblogs.com/neverdie/p/unity_ui_framework.html 如何使用 请直接导入UnityUIFramework这个UnityPackage,然后进入名为Test的Scene即可开始体验各种...
  • Unity中常见的背景设置为固定颜色或者天空盒, 天空盒可以设置背景材质,但是背景跟跟随摄像机镜头的变化而运动,不能做到固定下来 思路 使用两个摄像机,一个固定观察指定的图片,另一个观察三维场景,通过分...
  • 一、目录 【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷
  • 全面理解 Unity UI 系统

    2016-03-23 17:39:03
    随着 Unity 4.6 发布,新 UI 系统终于与大家见面了。这篇文章将不会介绍如何使用按钮、滚动条之类的UI控件,这些内容可以参考 Unity Manual;这篇文章的重点是,如何理解 UI 系统的设计,以便更好的在实际中使用它。...
  • UnityEngine没有提供类似自带颜色拾取器的组件,但是在工业三维可视化领域可能会用到类似的组件,博主这里结合Unity UGUI源码创建一个高仿unity颜色拾取器的组件,可一键创建,监听接口使用或者直接获取组件颜色。...
  • Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。  在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4...
  • Unity--UI控件

    2017-11-20 19:22:31
    注:具体属性查看https://docs.unity3d.com/Manual/script-Text.html官方文档 RectTransform组件: Width/Height:矩形框的宽高(用于显示) Left、Top、Right、Bottom:Anchors形成一个锚框时,代表矩形与锚框的内...
  • 导入到unity3d内的图像被默认长宽变换为满足2^n关系。 例如以下图,我有张图片名称为984plus598表示我尺寸为984*598。拷贝到unity3d中后的大小为1024*512 方法一: 在该图片的Inspector窗体下改动TextureType...
  • 最近项目需要做一个图片叠加在一个模型上,而且还需要通过调整颜色改变两个图片的颜色和透明程度。 另外,还需要一个调控值,管理两张图片是否完全显示,Shader如下: Shader "Unlit/BlockTextrue" { ...
  • 版本:unity 5.6 语言:C#   总起: 可互动组件包括按钮、复选框、滑块、滚动条等,本身它们是不可见的,但它们内部有可视化组件。   做UI的时候,如果不需要什么特效本身使用onClick.AddListener添加事件可能就...
1 2 3 4 5 ... 20
收藏数 1,137
精华内容 454
关键字:

ui颜色变化 unity3d