在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → Unity异步UI框架教程:轻量级、无第三方依赖、支持热更新

Unity异步UI框架教程:轻量级、无第三方依赖、支持热更新

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:0.36M
  • 下载次数:0
  • 浏览次数:11
  • 发布时间:2024-04-12
  • 实例类别:一般编程问题
  • 发 布 人:chenxiaolan
  • 文件格式:.zip
  • 所需积分:2
 相关标签:

实例介绍

【实例简介】
Unity-Async-UIFrame:简单易用的Unity异步UI框架。足够轻量,无第三方依赖。兼容多种资源管理系统(Addressable、YooAssets等)。支持使用HybridCLR热更新。支持自动引用。支持对UI面板的销毁控制,使内存优化更方便。支持子UI,子子UI,子子子UI......源码下载
特点
(1) 一个简单易用的异步UI框架
(2) 兼容多种资源管理系统(Addressable、YooAssets等)
(3) 支持自动引用,暴露在Inspector面板上的字段会自动从Hierarchy面板引用
(4) 支持子UI......
(5) 支持自定义脚本模板
(6) 支持对UI面板的销毁控制,使内存优化更方便
(7) 强大的扩展性,可以通过自定义事件,来支持自动事件绑定,例如自动绑定按钮的点击事件
(8) 支持多层UI管理


如何使用呢?
创建UIFrame预制体,可参考如下结构
Canvas的渲染模式要设置成屏幕空间-摄像机
--UIFrame         (RectTransform、Canvas、CanvasScaler、GraphicRaycaster、UIFrame)
------UICamera    (Transform、Camera、AudioListener)
------UILayers    (RectTransform)
------EventSystem (Transform、EventSystem、StandaloneInputModule)

初始化
private void Awake()
{
    // 注册资源请求释放事件
    UIFrame.OnAssetRequest  = OnAssetRequest;
    UIFrame.OnAssetRelease  = OnAssetRelease;
    // 注册UI卡住事件
    // 加载时间超过0.5s后触发UI卡住事件
    UIFrame.StuckTime = 0.5f;
    UIFrame.OnStuckStart  = OnStuckStart;
    UIFrame.OnStuckEnd  = OnStuckEnd;
}

// 资源请求事件,type为UI脚本的类型
// 可以使用Addressables,YooAssets等第三方资源管理系统
private async Task<GameObject> OnAssetRequest(Type type)
{
    if (!handles.ContainsKey(type))
    {
        var handle = Addressables.LoadAssetAsync<GameObject>(type.Name);
        await handle.Task;
        handles[type] = handle;
    }
    return handles[type].Result;
}

// 资源释放事件
private void OnAssetRelease(Type type)
{
    if(handles.ContainsKey(type))
    {
        handles[type].Release();
        handles.Remove(type);
    }
}

private void OnStuckStart()
{
    // UI初始化加时间过长,卡住了,打开转圈面板
}

private void OnStuckEnd()
{
    // 不卡了,关闭转圈面板
}
创建一个UI脚本,继承自UIComponent
并挂到与脚本同名的Prefab中
public class UITestData : UIData
{

}

[PanelLayer]
public class UITest : UIComponent<UITestData>
{
    [SerializeField] private Image img;
    [SerializeField] private Text content;
    [SerializeField] private Button close;

    // 创建时调用,生命周期内只执行一次
    protected override async Task OnCreate()
    {
        // 异步请求资源
        var completionSource = new TaskCompletionSource<Sprite>();
        var handle = Resources.LoadAsync<Sprite>("sprite");
        handle.completed  = _ =>
        {

            completionSource.SetResult(handle.asset as Sprite);
        };
        img.sprite = await completionSource.Task;
    }

    // 绑定事件
    protected override void OnBind()
    {
        close.onClick.AddListener(OnClose);
    }

    // 解绑事件
    protected override void OnUnbind()
    {
        close.onClick.RemoveListener(OnClose);
    }

    // 刷新
    protected override async Task OnRefresh()
    {
        // 异步请求网络数据
        var completionSource = a TaskCompletionSource<string>();
        using var request = UnityWebRequest.Get("http://xxxx");
        request.SendWebRequest().completed  = _ =>
        {
            completionSource.SetResult(request.downloadHandler.text);
        };
        var data = await completionSource.Task;
        content.text = data;
    }

    // 显示时调用
    protected override void OnShow()
    {

    }

    // 隐藏时调用
    protected override void OnHide()
    {
    }

    // 销毁时调用,生命周期内只执行一次
    protected override void OnDied()
    {
    }

    private void OnClose()
    {
        // 关闭当前面板
        UIFrame.Hide(this);
    }
}
使用[PanelLayer]或[WindowLayer]或继承自[UILayer]的类来标记UI
使用[PanelLayer]属性标记的UI类一般用作全屏面板,将由栈进行控制,显示下一个Panel时会将当前Panel关闭,隐藏当前Panel时会显示上一个Panel
使用[WindowLayer]属性标记的UI类一般用作弹窗,它显示在Panel之上
一个UI只能标记一个层级属性
可以自定义层级,需要继承自[UILayer],例如BattleLayer用来显示战斗相关UI,NewbieLayer用来显示新手引导相关UI
// 显示UI
UIFrame.Show<TestUI>(new TestUIData());
// 显示子UI
UIFrame.Show(UIBase uibase);
// 隐藏UI
UIFrame.Hide<TestUI>();
// 隐藏子UI
UIFrame.Hide(UIbase uibase);
// 刷新UI
UIFrame.Refresh<TestUI>();
// 刷新子UI
UIFrame.Refresh(UIBase uibase);
// 释放资源
UIFrame.Release();
// 实例化UI资源
UIFrame.Instantiate(gameObject,parent);
// 销毁UI资源
UIFrame.Destroy(gameObject);
// 销毁UI资源
UIFrame.DestroyImmediate(gameObject);

【实例截图】
【核心代码】
文件清单
└── Unity-Async-UIFrame-635770d2aa361259b5c0f81abf69aa5c3d05d449
    ├── CHANGELOG.md
    ├── CHANGELOG.md.meta
    ├── Editor
    │   ├── Resources
    │   │   ├── UIBaseTemplate.txt
    │   │   ├── UIBaseTemplate.txt.meta
    │   │   ├── UIComponentTemplate.txt
    │   │   ├── UIComponentTemplate.txt.meta
    │   │   ├── UIPanelTemplate.txt
    │   │   ├── UIPanelTemplate.txt.meta
    │   │   ├── UIWindowTemplate.txt
    │   │   └── UIWindowTemplate.txt.meta
    │   ├── Resources.meta
    │   ├── Scripts
    │   │   ├── UIAutoReference.cs
    │   │   ├── UIAutoReference.cs.meta
    │   │   ├── UIFrameSetting.cs
    │   │   ├── UIFrameSetting.cs.meta
    │   │   ├── UIScriptCreator.cs
    │   │   └── UIScriptCreator.cs.meta
    │   ├── Scripts.meta
    │   ├── UIFrame.Editor.asmdef
    │   └── UIFrame.Editor.asmdef.meta
    ├── Editor.meta
    ├── LICENSE
    ├── LICENSE.meta
    ├── package.json
    ├── package.json.meta
    ├── README
    │   ├── autoref1.png
    │   ├── autoref1.png.meta
    │   ├── install.png
    │   ├── install.png.meta
    │   ├── lifecycle.png
    │   ├── lifecycle.png.meta
    │   ├── menu.png
    │   ├── menu.png.meta
    │   ├── template.png
    │   ├── template.png.meta
    │   ├── testui2.png
    │   ├── testui2.png.meta
    │   ├── testui.png
    │   └── testui.png.meta
    ├── README.md
    ├── README.md.meta
    ├── README.meta
    ├── Runtime
    │   ├── Core
    │   │   ├── UIBase.cs
    │   │   ├── UIBase.cs.meta
    │   │   ├── UIComponent.cs
    │   │   ├── UIComponent.cs.meta
    │   │   ├── UIData.cs
    │   │   ├── UIData.cs.meta
    │   │   ├── UIFrame.cs
    │   │   ├── UIFrame.cs.meta
    │   │   ├── UILayer.cs
    │   │   └── UILayer.cs.meta
    │   ├── Core.meta
    │   ├── Extensions
    │   │   ├── TransformExtensions.cs
    │   │   ├── TransformExtensions.cs.meta
    │   │   ├── UIBaseExtensions.cs
    │   │   └── UIBaseExtensions.cs.meta
    │   ├── Extensions.meta
    │   ├── Layers
    │   │   ├── PanelLayer.cs
    │   │   ├── PanelLayer.cs.meta
    │   │   ├── WindowLayer.cs
    │   │   └── WindowLayer.cs.meta
    │   ├── Layers.meta
    │   ├── UIFrame.asmdef
    │   └── UIFrame.asmdef.meta
    ├── Runtime.meta
    ├── Samples~
    │   ├── Resources
    │   │   ├── Demo1
    │   │   │   ├── Item
    │   │   │   │   ├── UserItem.prefab
    │   │   │   │   └── UserItem.prefab.meta
    │   │   │   ├── Item.meta
    │   │   │   ├── PanelLayer
    │   │   │   │   ├── UITestA.prefab
    │   │   │   │   ├── UITestA.prefab.meta
    │   │   │   │   ├── UITestB.prefab
    │   │   │   │   └── UITestB.prefab.meta
    │   │   │   ├── PanelLayer.meta
    │   │   │   ├── SubUI
    │   │   │   │   ├── SubUIA.prefab
    │   │   │   │   ├── SubUIA.prefab.meta
    │   │   │   │   ├── SubUIB.prefab
    │   │   │   │   └── SubUIB.prefab.meta
    │   │   │   ├── SubUI.meta
    │   │   │   ├── WindowLayer
    │   │   │   │   ├── UIConfirmBox.prefab
    │   │   │   │   ├── UIConfirmBox.prefab.meta
    │   │   │   │   ├── UIStarred.prefab
    │   │   │   │   └── UIStarred.prefab.meta
    │   │   │   └── WindowLayer.meta
    │   │   ├── Demo1.meta
    │   │   ├── Demo2
    │   │   │   ├── Item
    │   │   │   │   ├── UserItem_Demo2.prefab
    │   │   │   │   └── UserItem_Demo2.prefab.meta
    │   │   │   ├── Item.meta
    │   │   │   ├── PanelLayer
    │   │   │   │   ├── UITestA_Demo2.prefab
    │   │   │   │   ├── UITestA_Demo2.prefab.meta
    │   │   │   │   ├── UITestB_Demo2.prefab
    │   │   │   │   └── UITestB_Demo2.prefab.meta
    │   │   │   ├── PanelLayer.meta
    │   │   │   ├── SubUI
    │   │   │   │   ├── SubUIA_Demo2.prefab
    │   │   │   │   ├── SubUIA_Demo2.prefab.meta
    │   │   │   │   ├── SubUIB_Demo2.prefab
    │   │   │   │   └── SubUIB_Demo2.prefab.meta
    │   │   │   ├── SubUI.meta
    │   │   │   ├── WindowLayer
    │   │   │   │   ├── UIConfirmBox_Demo2.prefab
    │   │   │   │   ├── UIConfirmBox_Demo2.prefab.meta
    │   │   │   │   ├── UIStarred_Demo2.prefab
    │   │   │   │   └── UIStarred_Demo2.prefab.meta
    │   │   │   └── WindowLayer.meta
    │   │   └── Demo2.meta
    │   ├── Resources.meta
    │   ├── Scenes
    │   │   ├── Demo1.unity
    │   │   ├── Demo1.unity.meta
    │   │   ├── Demo2.unity
    │   │   └── Demo2.unity.meta
    │   ├── Scenes.meta
    │   ├── Scripts
    │   │   ├── Demo1
    │   │   │   ├── Demo1Launcher.cs
    │   │   │   ├── Demo1Launcher.cs.meta
    │   │   │   ├── Iteam
    │   │   │   │   ├── UserItem.cs
    │   │   │   │   └── UserItem.cs.meta
    │   │   │   ├── Iteam.meta
    │   │   │   ├── Panel
    │   │   │   │   ├── UITestA.cs
    │   │   │   │   ├── UITestA.cs.meta
    │   │   │   │   ├── UITestB.cs
    │   │   │   │   └── UITestB.cs.meta
    │   │   │   ├── Panel.meta
    │   │   │   ├── SubUI
    │   │   │   │   ├── SubUIA.cs
    │   │   │   │   ├── SubUIA.cs.meta
    │   │   │   │   ├── SubUIB.cs
    │   │   │   │   └── SubUIB.cs.meta
    │   │   │   ├── SubUI.meta
    │   │   │   ├── Window
    │   │   │   │   ├── UIConfirmBox.cs
    │   │   │   │   ├── UIConfirmBox.cs.meta
    │   │   │   │   ├── UIStarred.cs
    │   │   │   │   └── UIStarred.cs.meta
    │   │   │   └── Window.meta
    │   │   ├── Demo1.meta
    │   │   ├── Demo2
    │   │   │   ├── AutoBindUGUIButtonEvent.cs
    │   │   │   ├── AutoBindUGUIButtonEvent.cs.meta
    │   │   │   ├── Demo2Launcher.cs
    │   │   │   ├── Demo2Launcher.cs.meta
    │   │   │   ├── Iteam
    │   │   │   │   ├── UserItem_Demo2.cs
    │   │   │   │   └── UserItem_Demo2.cs.meta
    │   │   │   ├── Iteam.meta
    │   │   │   ├── Panel
    │   │   │   │   ├── UITestA_Demo2.cs
    │   │   │   │   ├── UITestA_Demo2.cs.meta
    │   │   │   │   ├── UITestB_Demo2.cs
    │   │   │   │   └── UITestB_Demo2.cs.meta
    │   │   │   ├── Panel.meta
    │   │   │   ├── SubUI
    │   │   │   │   ├── SubUIA_Demo2.cs
    │   │   │   │   ├── SubUIA_Demo2.cs.meta
    │   │   │   │   ├── SubUIB_Demo2.cs
    │   │   │   │   └── SubUIB_Demo2.cs.meta
    │   │   │   ├── SubUI.meta
    │   │   │   ├── UGUIButtonEventAttribute.cs
    │   │   │   ├── UGUIButtonEventAttribute.cs.meta
    │   │   │   ├── Window
    │   │   │   │   ├── UIConfirmBox_Demo2.cs
    │   │   │   │   ├── UIConfirmBox_Demo2.cs.meta
    │   │   │   │   ├── UIStarred_Demo2.cs
    │   │   │   │   └── UIStarred_Demo2.cs.meta
    │   │   │   └── Window.meta
    │   │   ├── Demo2.meta
    │   │   ├── NetworkResources.cs
    │   │   ├── NetworkResources.cs.meta
    │   │   ├── StuckPanel.cs
    │   │   ├── StuckPanel.cs.meta
    │   │   ├── TaskExtensions.cs
    │   │   ├── TaskExtensions.cs.meta
    │   │   ├── UIWindowEffect.cs
    │   │   └── UIWindowEffect.cs.meta
    │   ├── Scripts.meta
    │   ├── Sprites
    │   │   ├── Circle.png
    │   │   ├── Circle.png.meta
    │   │   ├── loading.png
    │   │   └── loading.png.meta
    │   ├── Sprites.meta
    │   ├── UIFrame.Demo.asmdef
    │   ├── UIFrame.Demo.asmdef.meta
    │   ├── UIFrame.prefab
    │   └── UIFrame.prefab.meta
    └── Samples~.meta

34 directories, 175 files

标签:

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警