增加UI框架

This commit is contained in:
MuHua-123
2025-03-04 15:25:40 +08:00
parent c9230b19b4
commit ba6d513830
25 changed files with 455 additions and 4 deletions
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0fec0c5043434164c8a5cb28f3886b1d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,41 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// UI容器
/// </summary>
public class UIContainer<Item, Data> where Item : UIItem<Data> {
public readonly VisualElement container;
public readonly VisualTreeAsset templateAsset;
public readonly Func<Data, VisualElement, Item> generate;
public List<Item> uiItems = new List<Item>();
/// <summary> UI容器 </summary>
public UIContainer(VisualElement container, VisualTreeAsset templateAsset, Func<Data, VisualElement, Item> generate) {
this.container = container;
this.templateAsset = templateAsset;
this.generate = generate;
}
/// <summary> 释放资源 </summary>
public void Release() {
container.Clear();
uiItems.ForEach(obj => obj.Release());
uiItems = new List<Item>();
}
/// <summary> 创建UI项 </summary>
public void Create(List<Data> datas) {
Release();
datas.ForEach(Create);
}
/// <summary> 创建UI项 </summary>
public void Create(Data data) {
VisualElement element = templateAsset.Instantiate();
Item item = generate(data, element);
container.Add(item.element);
uiItems.Add(item);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b5854bcf80117aa49b327f2c19914ba3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+42
View File
@@ -0,0 +1,42 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// UI项
/// </summary>
public abstract class UIItem<Data> {
/// <summary> 选择事件 </summary>
public static event Action<Data> OnSelect;
/// <summary> 触发事件 </summary>
public static void Select(Data data) => OnSelect?.Invoke(data);
/// <summary> 绑定的数据 </summary>
public readonly Data value;
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
/// <summary> UI项 </summary>
public UIItem(Data value, VisualElement element) {
this.value = value;
this.element = element;
OnSelect += UIItem_OnSelect;
}
/// <summary> 侦听选择事件 </summary>
public virtual void UIItem_OnSelect(Data obj) {
if (value.Equals(obj)) { SelectState(); } else { DefaultState(); }
}
/// <summary> 触发选择事件 </summary>
public virtual void Select() => OnSelect?.Invoke(value);
/// <summary> 默认状态 </summary>
public virtual void DefaultState() { }
/// <summary> 选中状态 </summary>
public virtual void SelectState() { }
/// <summary> 释放 </summary>
public virtual void Release() => OnSelect -= UIItem_OnSelect;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: dfa6a8682a5ec384d98b88b54ace505f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: