This commit is contained in:
MuHua-123
2025-09-18 16:56:00 +08:00
parent 5d8f76b3e6
commit 7324361948
385 changed files with 22988 additions and 198 deletions
+2 -2
View File
@@ -52,6 +52,6 @@ public class ModuleUI : ModuleUISingle<ModuleUI> {
public enum Page {
/// <summary> 无 </summary>
None,
/// <summary> 登录 </summary>
Login,
/// <summary> 背包 </summary>
Backpack,
}
@@ -0,0 +1,30 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// 背包页面
/// </summary>
public class UIBackpackPage : ModuleUIPage {
public VisualTreeAsset inventorySlot;
private UIInventory inventory;
public override VisualElement Element => root.Q<VisualElement>("BackpackPage");
public VisualElement Inventory => Q<VisualElement>("Inventory");
protected void Awake() {
inventory = new UIInventory(Inventory, inventorySlot);
ModuleUI.OnJumpPage += ModuleUI_OnJumpPage;
}
private void ModuleUI_OnJumpPage(Page page) {
Element.EnableInClassList("document-page-hide", page != Page.Backpack);
if (page != Page.Backpack) { return; }
inventory.Settings(SingleManager.I.inventory);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 255d109f8aae559419ae63856abc96c5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,60 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
using System;
/// <summary>
/// UI库存
/// </summary>
public class UIInventory : ModuleUIPanel {
public Inventory inventory;
public ModuleUIItems<UIItem, InventorySlot> items;
public VisualElement Container => Q<VisualElement>("Container");
public UIInventory(VisualElement element, VisualTreeAsset templateAsset) : base(element) {
items = new ModuleUIItems<UIItem, InventorySlot>(Container, templateAsset,
(data, element) => new UIItem(data, element));
}
public void Dispose() {
items.Release();
if (inventory == null) { return; }
inventory.OnChange -= Inventory_OnChange;
}
public void Settings(Inventory inventory) {
if (this.inventory != null) { Dispose(); }
this.inventory = inventory;
if (inventory == null) { return; }
items.Create(inventory.slots);
inventory.OnChange += Inventory_OnChange;
}
private void Inventory_OnChange(Inventory inventory) {
items.Create(inventory.slots);
}
/// <summary> UI项目 </summary>
public class UIItem : ModuleUIItem<InventorySlot> {
public Label Count => Q<Label>("Count");
public VisualElement Image => Q<VisualElement>("Image");
public UIItem(InventorySlot value, VisualElement element) : base(value, element) {
Count.text = value.count.ToString();
Count.EnableInClassList("inventory-count-hide", value.count <= 1);
Image.style.backgroundImage = new StyleBackground(value.Sprite);
element.RegisterCallback<MouseDownEvent>(MouseDownEvent);
element.RegisterCallback<ClickEvent>(ClickEvent);
}
private void MouseDownEvent(MouseDownEvent evt) {
UIPopupManager.I.dragItem.Open(value.item, value.count);
}
private void ClickEvent(ClickEvent evt) {
Debug.Log("sss");
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f7c8f41e9e4833a4bb32d179036ebaf1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,44 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// UI拖拽物品
/// </summary>
public class UIDragItem : ModuleUIPanel, UIControl {
/// <summary> 数量 </summary>
private int count;
/// <summary> 物品 </summary>
private DataItem item;
public Label Count => Q<Label>("Count");
public VisualElement Image => Q<VisualElement>("Image");
public VisualElement Preview => Q<VisualElement>("Preview");
public UIDragItem(VisualElement element, VisualElement canvas) : base(element) {
canvas.RegisterCallback<MouseMoveEvent>(FloatingFunc);
}
private void FloatingFunc(MouseMoveEvent evt) {
Preview.transform.position = evt.mousePosition;
}
public void Update() {
}
public void Dispose() {
// throw new System.NotImplementedException();
}
/// <summary> 打开菜单 </summary>
public void Open(DataItem item, int count) {
this.item = item;
this.count = count;
Count.text = count.ToString();
Count.EnableInClassList("dragitem-count-hide", count <= 1);
Image.style.backgroundImage = new StyleBackground(item.sprite);
element.EnableInClassList("document-page-hide", item == null);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 58ee0d6bee6b6254a8871407bb3a0574
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -8,10 +8,22 @@ using MuHua;
/// UI弹出管理器
/// </summary>
public class UIPopupManager : ModuleUISingle<UIPopupManager> {
/// <summary> 菜单模板 </summary>
public VisualTreeAsset menuTreeAsset;
/// <summary> 项目模板 </summary>
public VisualTreeAsset itemTreeAsset;
public UIDragItem dragItem;
public UIShortcutMenu shortcutMenu;
public override VisualElement Element => root.Q<VisualElement>("Popup");
public VisualElement PopupDialog => Q<VisualElement>("PopupDialog");
public VisualElement DragItem => Q<VisualElement>("DragItem");
public VisualElement ShortcutMenu => Q<VisualElement>("ShortcutMenu");
protected override void Awake() => NoReplace(false);
protected override void Awake() {
NoReplace(false);
dragItem = new UIDragItem(DragItem, root);
shortcutMenu = new UIShortcutMenu(ShortcutMenu, menuTreeAsset, itemTreeAsset);
}
}
@@ -8,7 +8,7 @@ using MuHua;
/// <summary>
/// UI快捷菜单
/// </summary>
public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
public class UIShortcutMenu : ModuleUIPanel, UIControl {
/// <summary> 菜单模板 </summary>
public VisualTreeAsset menuTreeAsset;
/// <summary> 项目模板 </summary>
@@ -19,18 +19,20 @@ public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
/// <summary> 控件列表 </summary>
public static List<UIControl> controls = new List<UIControl>();
public override VisualElement Element => root.Q<VisualElement>("ShortcutMenu");
public UIShortcutMenu(VisualElement element, VisualTreeAsset menuTreeAsset, VisualTreeAsset itemTreeAsset) : base(element) {
this.menuTreeAsset = menuTreeAsset;
this.itemTreeAsset = itemTreeAsset;
ModuleUI.AddControl(this);
}
protected override void Awake() => NoReplace(false);
public void Update() => controls.ForEach(control => control.Update());
private void Update() => controls.ForEach(control => control.Update());
private void OnDestroy() => controls.ForEach(control => control.Dispose());
public void Dispose() => controls.ForEach(control => control.Dispose());
/// <summary> 打开菜单 </summary>
public void Open() {
Close();
Vector3 position = UITool.GetMousePosition(Element);
Vector3 position = UITool.GetMousePosition(element);
UIMenuPanel menuPanel = Create();
menuPanel.Settings(position, datas);
}
@@ -38,15 +40,15 @@ public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
public void Close() {
controls.ForEach(control => control.Dispose());
controls.Clear();
Element.Clear();
element.Clear();
}
/// <summary> 创建子菜单 </summary>
public UIMenuPanel Create() {
// 创建菜单元素
VisualElement element = menuTreeAsset.Instantiate();
element.EnableInClassList("menu", true);
Element.Add(element);
UIMenuPanel menuPanel = new UIMenuPanel(element, itemTreeAsset);
VisualElement menu = menuTreeAsset.Instantiate();
menu.EnableInClassList("menu", true);
element.Add(menu);
UIMenuPanel menuPanel = new UIMenuPanel(menu, itemTreeAsset, this);
controls.Add(menuPanel);
return menuPanel;
}
@@ -57,59 +59,55 @@ public class UIShortcutMenu : ModuleUISingle<UIShortcutMenu> {
List<DataMenuItem> datas = this.datas;
for (int i = 0; i < names.Length; i++) {
string menu = names[i];
DataMenuItem item = datas.Find(obj => obj.name == menu);
if (item == null) {
item = new DataMenuItem { name = menu };
if (i == names.Length - 1) { item.callback = callback; }
datas.Add(item);
}
DataMenuItem item = Find(names[i], datas);
datas = item.items;
if (i == names.Length - 1) { item.callback = callback; }
}
}
/// <summary> 移除菜单项 </summary>
public void Remove(string name) {
string[] names = name.Split('/');
List<DataMenuItem> datas = this.datas;
DataMenuItem parent = null;
DataMenuItem target = null;
for (int i = 0; i < names.Length; i++) {
string menu = names[i];
target = datas.Find(obj => obj.name == menu);
if (target == null) return; // 未找到,直接返回
if (i == names.Length - 1) {
// 找到要移除的项
datas.Remove(target);
return;
}
parent = target;
datas = target.items;
DataMenuItem item = Find(names[i], datas, false);
// 未找到,直接返回
if (item == null) { return; }
// 找到要移除的项
if (i == names.Length - 1) { datas.Remove(item); }
datas = item.items;
}
}
/// <summary> 查询菜单项 </summary>
public DataMenuItem Find(string name, List<DataMenuItem> datas, bool isCreate = true) {
DataMenuItem item = datas.Find(obj => obj.name == name);
if (item != null || !isCreate) { return item; }
item = new DataMenuItem { name = name };
datas.Add(item);
return item;
}
}
/// <summary>
/// UI快捷菜单面板
/// </summary>
public class UIMenuPanel : ModuleUIPanel, UIControl {
public readonly UIShortcutMenu parent;
public UIMenuPanel menuPanel;
public VisualElement submenu;
public ModuleUIItems<UIItem, DataMenuItem> items;
public VisualElement Container => Q<VisualElement>("Container");
public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset) : base(element) {
public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset, UIShortcutMenu parent) : base(element) {
this.parent = parent;
items = new ModuleUIItems<UIItem, DataMenuItem>(Container, templateAsset,
(data, element) => new UIItem(data, element, this));
}
public void Update() {
// throw new NotImplementedException();
}
public void Dispose() {
items.Release();
(data, element) => new UIItem(data, element, this, parent));
}
public void Update() { }
public void Dispose() => items.Release();
public void Settings(Vector3 position, List<DataMenuItem> datas) {
items.Create(datas);
element.transform.position = position;
@@ -120,7 +118,7 @@ public class UIMenuPanel : ModuleUIPanel, UIControl {
if (this.submenu == submenu) { return; }
// 更新子菜单
this.submenu = submenu;
if (menuPanel == null) { menuPanel = UIShortcutMenu.I.Create(); }
if (menuPanel == null) { menuPanel = parent.Create(); }
float x = submenu.worldBound.position.x + submenu.resolvedStyle.width;
float y = submenu.worldBound.position.y - 5;
Vector3 position = new Vector3(x, y, 0);
@@ -136,12 +134,15 @@ public class UIMenuPanel : ModuleUIPanel, UIControl {
/// <summary> UI项目 </summary>
public class UIItem : ModuleUIItem<DataMenuItem> {
public readonly UIMenuPanel parent;
public readonly UIShortcutMenu shortcutMenu;
public Label Name => element.Q<Label>("Name");
public VisualElement Arrow => element.Q<VisualElement>("Arrow");
public UIItem(DataMenuItem value, VisualElement element, UIMenuPanel parent) : base(value, element) {
public UIItem(DataMenuItem value, VisualElement element, UIMenuPanel parent, UIShortcutMenu shortcutMenu) : base(value, element) {
this.parent = parent;
this.shortcutMenu = shortcutMenu;
Name.text = value.name;
Arrow.EnableInClassList("menu-arrow-hide", value.items == null || value.items.Count == 0);
element.RegisterCallback<MouseDownEvent>(MouseDownEvent);
@@ -149,7 +150,7 @@ public class UIMenuPanel : ModuleUIPanel, UIControl {
}
private void MouseDownEvent(MouseDownEvent evt) {
value.callback?.Invoke();
UIShortcutMenu.I.Close();
shortcutMenu.Close();
}
private void MouseMoveEvent(MouseMoveEvent evt) {
parent.Open(element, value.items);