diff --git a/Assets/AssetsPackage/InputSystem/StandardInput.inputactions b/Assets/AssetsPackage/InputSystem/StandardInput.inputactions
index 7e00434..857f772 100644
--- a/Assets/AssetsPackage/InputSystem/StandardInput.inputactions
+++ b/Assets/AssetsPackage/InputSystem/StandardInput.inputactions
@@ -35,7 +35,7 @@
"actions": [
{
"name": "MouseLeft",
- "type": "Button",
+ "type": "PassThrough",
"id": "1eaab500-f97a-4e25-8e55-bd9ba394a9fa",
"expectedControlType": "Button",
"processors": "",
diff --git a/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs b/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs
index 6a42ab3..def603b 100644
--- a/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs
+++ b/Assets/ModuleCore/ModuleInput/InputControl/InputMenu.cs
@@ -2,20 +2,28 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
+using MuHua;
///
/// 菜单 - 输入
///
public class InputMenu : InputControl {
+ private UIMenuPanel menu;
+
protected override void ModuleInput_OnInputMode(InputMode mode) {
// throw new System.NotImplementedException();
}
#region 输入系统
+ /// 鼠标左键
+ public void OnMouseLeft(InputValue inputValue) {
+ if (inputValue.isPressed) return;
+ ManagerMenu.I.Close();
+ }
/// 鼠标右键
public void OnMouseRight(InputValue inputValue) {
- UIMenuManager.I.Open();
+ ManagerMenu.I.Open();
}
#endregion
}
diff --git a/Assets/ModuleCore/ModuleSingle/ManagerMenu.cs b/Assets/ModuleCore/ModuleSingle/ManagerMenu.cs
new file mode 100644
index 0000000..851c039
--- /dev/null
+++ b/Assets/ModuleCore/ModuleSingle/ManagerMenu.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using MuHua;
+
+///
+/// 菜单管理器
+///
+public class ManagerMenu : ModuleSingle {
+
+ private List datas = new List();
+
+ protected override void Awake() => NoReplace(false);
+
+ private void Start() {
+ // 初始化菜单项数据
+ Add("建筑/伐木场", () => Debug.Log("伐木场"));
+ Add("建筑/农场", () => Debug.Log("农场"));
+ Add("建筑/矿场", () => Debug.Log("矿场"));
+ Add("建筑/房屋/木屋", () => Debug.Log("木屋"));
+ Add("建筑/房屋/豪宅", () => Debug.Log("豪宅"));
+
+ Add("单位/步兵", () => Debug.Log("步兵"));
+ Add("单位/骑兵", () => Debug.Log("骑兵"));
+
+ Add("拆除", () => Debug.Log("拆除"));
+ }
+
+ public void Open() => UIShortcutMenu.I.Open(datas);
+
+ public void Close() => UIShortcutMenu.I.Close();
+
+ /// 添加菜单项(方法)
+ public void Add(string name, Action callback) {
+ string[] names = name.Split('/');
+
+ List 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);
+ }
+ datas = item.items;
+ }
+ }
+ /// 移除菜单项
+ public void Remove(string name) {
+ string[] names = name.Split('/');
+ List 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;
+ }
+ }
+}
+///
+/// 菜单项目
+///
+public class DataMenuItem {
+ /// 名称
+ public string name;
+ /// 回调
+ public Action callback;
+ /// 子菜单项
+ public List items = new List();
+}
\ No newline at end of file
diff --git a/Assets/ModuleCore/ModuleSingle/ManagerMenu.cs.meta b/Assets/ModuleCore/ModuleSingle/ManagerMenu.cs.meta
new file mode 100644
index 0000000..d662290
--- /dev/null
+++ b/Assets/ModuleCore/ModuleSingle/ManagerMenu.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4fbad1b7bdd1ba34da55091f94b08438
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleUI/ModuleUISingle.meta b/Assets/ModuleCore/ModuleUI/ModuleUISingle.meta
new file mode 100644
index 0000000..64a03a3
--- /dev/null
+++ b/Assets/ModuleCore/ModuleUI/ModuleUISingle.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fcb666edf8774b643830fdbb6a3973bd
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ModuleCore/ModuleUI/UILoadManager.cs b/Assets/ModuleCore/ModuleUI/ModuleUISingle/UILoadManager.cs
similarity index 100%
rename from Assets/ModuleCore/ModuleUI/UILoadManager.cs
rename to Assets/ModuleCore/ModuleUI/ModuleUISingle/UILoadManager.cs
diff --git a/Assets/ModuleCore/ModuleUI/UILoadManager.cs.meta b/Assets/ModuleCore/ModuleUI/ModuleUISingle/UILoadManager.cs.meta
similarity index 100%
rename from Assets/ModuleCore/ModuleUI/UILoadManager.cs.meta
rename to Assets/ModuleCore/ModuleUI/ModuleUISingle/UILoadManager.cs.meta
diff --git a/Assets/ModuleCore/ModuleUI/UIPopupManager.cs b/Assets/ModuleCore/ModuleUI/ModuleUISingle/UIPopupManager.cs
similarity index 100%
rename from Assets/ModuleCore/ModuleUI/UIPopupManager.cs
rename to Assets/ModuleCore/ModuleUI/ModuleUISingle/UIPopupManager.cs
diff --git a/Assets/ModuleCore/ModuleUI/UIPopupManager.cs.meta b/Assets/ModuleCore/ModuleUI/ModuleUISingle/UIPopupManager.cs.meta
similarity index 100%
rename from Assets/ModuleCore/ModuleUI/UIPopupManager.cs.meta
rename to Assets/ModuleCore/ModuleUI/ModuleUISingle/UIPopupManager.cs.meta
diff --git a/Assets/ModuleCore/ModuleUI/ModuleUISingle/UIShortcutMenu.cs b/Assets/ModuleCore/ModuleUI/ModuleUISingle/UIShortcutMenu.cs
new file mode 100644
index 0000000..a08a728
--- /dev/null
+++ b/Assets/ModuleCore/ModuleUI/ModuleUISingle/UIShortcutMenu.cs
@@ -0,0 +1,123 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UIElements;
+using MuHua;
+
+///
+/// UI快捷菜单
+///
+public class UIShortcutMenu : ModuleUISingle {
+ /// 菜单模板
+ public VisualTreeAsset menuTreeAsset;
+ /// 项目模板
+ public VisualTreeAsset itemTreeAsset;
+ /// 控件列表
+ public static List controls = new List();
+
+ public override VisualElement Element => root.Q("ShortcutMenu");
+
+ protected override void Awake() => NoReplace(false);
+
+ private void Update() => controls.ForEach(control => control.Update());
+
+ private void OnDestroy() => controls.ForEach(control => control.Dispose());
+
+ /// 打开菜单
+ public void Open(List datas) {
+ Close();
+ Vector3 position = UITool.GetMousePosition(Element);
+ UIMenuPanel menuPanel = Create();
+ menuPanel.Settings(position, datas);
+ }
+ /// 关闭菜单
+ public void Close() {
+ controls.ForEach(control => control.Dispose());
+ controls.Clear();
+ Element.Clear();
+ }
+ /// 创建子菜单
+ public UIMenuPanel Create() {
+ // 创建菜单元素
+ VisualElement element = menuTreeAsset.Instantiate();
+ element.EnableInClassList("menu", true);
+ Element.Add(element);
+ UIMenuPanel menuPanel = new UIMenuPanel(element, itemTreeAsset);
+ AddControl(menuPanel);
+ return menuPanel;
+ }
+
+ /// 添加控件
+ public static void AddControl(UIControl control) => controls.Add(control);
+ /// 移除控件
+ public static void RemoveControl(UIControl control) => controls.Remove(control);
+}
+///
+/// UI快捷菜单面板
+///
+public class UIMenuPanel : ModuleUIPanel, UIControl {
+
+ public UIMenuPanel menuPanel;
+ public VisualElement submenu;
+ public ModuleUIItems items;
+
+ public VisualElement Container => Q("Container");
+
+ public UIMenuPanel(VisualElement element, VisualTreeAsset templateAsset) : base(element) {
+ items = new ModuleUIItems(Container, templateAsset,
+ (data, element) => new UIItem(data, element, this));
+ }
+ public void Update() {
+ // throw new NotImplementedException();
+ }
+ public void Dispose() {
+ items.Release();
+ }
+
+ public void Settings(Vector3 position, List datas) {
+ items.Create(datas);
+ element.transform.position = position;
+ }
+
+ /// 打开子菜单
+ public void Open(VisualElement submenu, List datas) {
+ if (this.submenu == submenu) { return; }
+ // 更新子菜单
+ this.submenu = submenu;
+ if (menuPanel == null) { menuPanel = UIShortcutMenu.I.Create(); }
+ float x = submenu.worldBound.position.x + submenu.resolvedStyle.width;
+ float y = submenu.worldBound.position.y - 5;
+ Vector3 position = new Vector3(x, y, 0);
+ menuPanel.Settings(position, datas);
+ bool isEnable = datas != null && datas.Count > 0;
+ menuPanel.OpenSubmenu(isEnable);
+ }
+ public void OpenSubmenu(bool open) {
+ element.EnableInClassList("menu-hide", !open);
+ menuPanel?.OpenSubmenu(false);
+ }
+
+ /// UI项目
+ public class UIItem : ModuleUIItem {
+ public readonly UIMenuPanel parent;
+
+ public Label Name => element.Q