实例介绍
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论