[Unity 3d] Unity Dynamic Panels For Runtime- GitHub

一个把 Unity Editor Tab 功能使用 UGUI 实现的库,为运行时的 Tab 交互体验而生,你值得拥有!

GitHub 上的工程多如繁星,有些好的仓库,但凡不经意间错过了就很难找回,故稍作采撷,希望能帮助到有心人。
本文集以一个小的功能点为单位行文,也便于拾取罢!

简介:

笔者今天推荐的仓库叫 UnityDynamicPanels
这个仓库功能非常之酷,他将 Unity 的 Tab 理念使用 UGUI 在运行时完美的展现在了大家的面前。什么Tab布局,保存/恢复布局信息,Tab 停靠吸附功能,Tab叠加,基本上Unity Editor 有的体验他都有。

功能:

  • Supports all canvas modes (Screen Space and World Space)
    支持所有Canvas 模式(屏幕空间和世界空间)
  • Supports multiple canvases (panels can be moved between canvases by dragging)
    支持多个画布,且面板可以在画布之间通过拖拽而来回转移。
  • Has an extensive Scripting API to create/manipulate panels by code
    有一大票 API 供你在脚本中创建这些面板。
  • Each panel costs 3 additional batches (this number can increase with each tab using a custom icon)
    每新增一个panel 仅仅新增 3个批(如果使用自定义 Icon 可能会自增)
  • 高度还原的 UnityEditor 的 Tab 交互体验。

使用:

下载工程找到 Demo 就能肝了,笔者已经上手试过了,非常简单!
示例代码(如下):

using UnityEngine;
using DynamicPanels;

public class PanelCreator : MonoBehaviour
{
    public DynamicPanelsCanvas canvas; //所有Panel 必须依赖 这个组件
    public RectTransform content1, content2, content3, content4; //指定panel包裹的 对象
    public string tabLabel1, tabLabel2, tabLabel3, tabLabel4; //指定名称
    public Sprite tabIcon1, tabIcon2, tabIcon3, tabIcon4; //指定 Tab 上的 Icon

    void Start()
    {
        // Create 3 panels 创建3个 面板
        Panel panel1 = PanelUtils.CreatePanelFor( content1, canvas );
        Panel panel2 = PanelUtils.CreatePanelFor( content2, canvas );
        Panel panel3 = PanelUtils.CreatePanelFor( content3, canvas );

        // Add a second tab to the first panel 将第二个Tab 添加到第一个面板上
        panel1.AddTab( content4 );

        // Set the labels and the (optional) icons of the tabs 为面板指定标题和图标
        panel1[0].Icon = tabIcon1; // first tab 第一个 Tab
        panel1[0].Label = tabLabel1;
        panel1[1].Icon = tabIcon4; // second tab 第二个 Tab
        panel1[1].Label = tabLabel4;

        panel2[0].Icon = tabIcon2;
        panel2[0].Label = tabLabel2;
        panel3[0].Icon = tabIcon3;
        panel3[0].Label = tabLabel3;

        // Set the minimum sizes of the contents associated with the tabs 
                // 使用缩小尺寸分配这些 Tab
        panel1[0].MinSize = new Vector2( 300f, 300f ); // first tab 第一个 Tab
        panel1[1].MinSize = new Vector2( 300f, 300f ); // second tab 第二个Tab

        panel2[0].MinSize = new Vector2( 300f, 300f );
        panel3[0].MinSize = new Vector2( 300f, 300f );

        // Create a vertical panel group 创建一个垂直分组
                // elements are always arranged from bottom to top  元素总是选择自下而上排布
        PanelGroup groupLeftVertical = new PanelGroup( canvas, Direction.Top ); 

        groupLeftVertical.AddElement( panel1 ); // bottom panel 底部面板
        groupLeftVertical.AddElement( panel2 ); // top panel 顶部面板

        // Dock the elements to the Dynamic Panels Canvas (the order is important)
        // 将元素吸附到 DynamicPanelCanvas (顺序相当重要)
        panel3.DockToRoot( Direction.Bottom );
        groupLeftVertical.DockToRoot( Direction.Left );

        // Rebuild the layout before attempting to resize elements or read their correct sizes/minimum sizes
        // 在改变元素打小前需要 重建布局 否则不能读取到正确的 尺寸哈。
        canvas.ForceRebuildLayoutImmediate();

        // It is recommended to manually resize layout elements that are created by code and docked.
        // 如果有代码动态生成和停靠的面板强烈建议你调用这个重建的动作
        // Otherwise, their sizes will not be deterministic. In this case, we are resizing them to their minimum size
        //否则这些panel 的尺寸就不确定啦,在这种情况下我们默认使用最小尺寸初始化它们了
        groupLeftVertical.ResizeTo( new Vector2( groupLeftVertical.MinSize.x, groupLeftVertical.Size.y ) );
        panel3.ResizeTo( new Vector2( panel3.Size.x, panel3.MinSize.y ) );
    }
}

演示:

DynamicPanel

Tips:

  • 演示了Demo的环境搭建,认识场景布局。
  • 演示Unity Editor Tab功能在UGUI的实现:拖拽,合并,布局,停靠,游离。。。
  • 更多功能以及 API 可以去阅读该仓库的ReadMe,当然可以以自己扩展哈。
  • 时间关系示例中未使用以上展示的代码。

链接:

yasirkula/UnityDynamicPanels: Draggable, resizable, dockable and stackable UI panel solution for Unity 3D

结语:

如果你想在运行时搞点特别的UI交互体验,Unity Dynamic Panels 可以考虑一下。

本文集持续更新ing,喜欢记得点赞关注哦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容