实例介绍
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
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论