This commit is contained in:
MuHua-123
2025-03-07 19:20:55 +08:00
parent c8f1873939
commit 5e819d5257
98 changed files with 389 additions and 180 deletions
@@ -1,10 +1,14 @@
@import url("unity-theme://default");
@import url("/Assets/MuHua/UITool/FontLibrary/Fonts.uss");
@import url("/Assets/MuHua/UITool/UIFloatingWindow/FloatingWindow.uss");
@import url("/Assets/MuHua/UITool/UIScroller/Scroller.uss");
@import url("/Assets/MuHua/UITool/UIScrollView/ScrollView.uss");
@import url("/Assets/MuHua/UITool/UISlider/Slider.uss");
@import url("/Assets/MuHua/UITool/USS/InputField.uss");
@import url("/Assets/MuHua/UITool/USS/Scroller.uss");
@import url("/Assets/MuHua/UITool/USS/ScrollView.uss");
@import url("/Assets/MuHua/UITool/USS/Slider.uss");
@import url("/Assets/MuHua/UITool/USS/Window.uss");
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e7cdf28a5161c094ea27a8b5ad54d741
guid: 79a59b79f3428b449916c4b458f73e78
folderAsset: yes
DefaultImporter:
externalObjects: {}
+49
View File
@@ -0,0 +1,49 @@
.input-field {
flex-direction: row;
background-color: rgba(255, 255, 255, 0.5);
width: 100%;
height: 30px;
flex-grow: 0;
flex-shrink: 1;
}
.input-field-label {
flex-grow: 0;
flex-basis: auto;
flex-shrink: 0;
min-width: 150px;
-unity-text-align: middle-left;
padding-top: 0;
padding-right: 0;
padding-bottom: 0;
padding-left: 5px;
width: auto;
background-color: rgba(0, 0, 0, 0);
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
}
.input-field-box {
background-color: rgb(255, 255, 255);
width: auto;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
.input-field-text {
-unity-text-align: middle-left;
height: 100%;
width: 100%;
padding-right: 0;
padding-left: 7px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: visible;
}
.input-field-text-d {
-unity-font-style: italic;
color: rgba(27, 27, 27, 0.6);
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e586d71f691bf1a4bab490af1c2cfe7f
guid: fc0932c888e56eb429d27f412df5a822
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
@@ -38,6 +38,8 @@
top: 0;
right: 0;
bottom: 0;
width: 30px;
background-color: rgb(255, 255, 255);
}
.scrollview-vertical-scroller-dragger {
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: bd2ae276ee0cc884cbe88f423b8f35fd
guid: 238a02b461e75d141acabaee7cc80c87
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 3bf3dbd8db1a17e4c8e7c99b5fadee02
guid: 819f5ae75816a96458f0a8d347fbb1a2
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -0,0 +1,3 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<MuHua.UIFloatField />
</ui:UXML>
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 43fe5b5fa3469a245854d8ca70e39edf
guid: be4dcb8701971d14c8fc03653aba6348
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
@@ -0,0 +1,3 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<MuHua.UILongField />
</ui:UXML>
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a1f3f61784a9b574bb5b683d542e7d39
guid: 6d1adb0fd3a339c4eac7384e14326bcc
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
@@ -7,5 +7,4 @@ ScriptedImporter:
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 12388, guid: 0000000000000000e000000000000000, type: 0}
disableValidation: 0
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
@@ -0,0 +1,4 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<Style src="project://database/Assets/MuHua/UITool/USS/InputField.uss?fileID=7433441132597879392&amp;guid=fc0932c888e56eb429d27f412df5a822&amp;type=3#InputField" />
<MuHua.UITextField />
</ui:UXML>
@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: f70e5bac0c1484f4798573018fc0bb83
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
@@ -21,11 +21,11 @@
<ui:Button text="Button" parse-escape-sequences="true" display-tooltip-when-elided="true" />
</ui:VisualElement>
</ui:VisualElement>
<ui:VisualElement name="ScrollerHorizontal" class="scroller-horizontal scrollview-horizontal-scroller">
<ui:VisualElement name="Dragger" class="scroller-horizontal-dragger scrollview-horizontal-scroller-dragger" />
<ui:VisualElement name="ScrollerHorizontal" class="scrollview-horizontal-scroller">
<ui:VisualElement name="Dragger" class="scrollview-horizontal-scroller-dragger" />
</ui:VisualElement>
<ui:VisualElement name="ScrollerVertical" class="scroller-vertical scrollview-vertical-scroller">
<ui:VisualElement name="Dragger" class="scroller-vertical-dragger scrollview-vertical-scroller-dragger" />
<ui:VisualElement name="ScrollerVertical" class="scrollview-vertical-scroller">
<ui:VisualElement name="Dragger" class="scrollview-vertical-scroller-dragger" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 6d6bffb6d06d8af47a714ca6aca9a0a6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 4e1b362a28ce4c04babda53ffbecf64e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1 +0,0 @@
VisualElement {}
@@ -1,3 +0,0 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<Style src="project://database/Assets/UI%20Toolkit/GlobalPage/GlobalPage.uss?fileID=7433441132597879392&amp;guid=e586d71f691bf1a4bab490af1c2cfe7f&amp;type=3#GlobalPage" />
</ui:UXML>
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 0659231a661d8314794c049dab0cdb39
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,4 +0,0 @@
@import url("/Packages/com.muhua.uicontrol/Assets/Themes/DefaultRuntimeTheme.tss");
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c2293d2090267954bb2e45486f1a6fc9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -6,7 +6,7 @@ namespace MuHua {
/// <summary>
/// 单例基类
/// </summary>
public class Single<T> where T : Single<T>, new() {
public class Module<T> where T : Module<T>, new() {
/// <summary> 模块单例 </summary>
public static T I => Instantiate();
@@ -7,11 +7,11 @@ namespace MuHua {
/// <summary>
/// 资源模块
/// </summary>
public class Assets<Data> : Single<Assets<Data>> {
public class ModuleAssets<Data> : Module<ModuleAssets<Data>> {
protected List<Data> datas = new List<Data>();
/// <summary> 更改事件 </summary>
public virtual event Action<Assets<Data>> OnChange;
public virtual event Action<ModuleAssets<Data>> OnChange;
/// <summary> 数据列表 </summary>
public virtual List<Data> Datas => datas;
/// <summary> 数据计数 </summary>
@@ -41,7 +41,7 @@ namespace MuHua {
/// </summary>
public static class AssetsTool {
/// <summary> 头尾循环标准化索引 </summary>
public static Data LoopIndex<Data>(this Assets<Data> assets, int index) {
public static Data LoopIndex<Data>(this ModuleAssets<Data> assets, int index) {
return assets[LoopIndex(index, assets.Count)];
}
/// <summary> 头尾循环标准化索引 </summary>
@@ -6,8 +6,8 @@ namespace MuHua {
/// <summary>
/// 数据
/// </summary>
public abstract class Data<T> where T : Data<T> {
public abstract class ModuleData<T> where T : ModuleData<T> {
/// <summary> 可视化对象 </summary>
public DataPrefab<T> visual;
public ModulePrefab<T> visual;
}
}
@@ -7,7 +7,7 @@ namespace MuHua {
/// <summary>
/// 事件处理器
/// </summary>
public class Handle<Data> : Single<Assets<Data>> {
public class ModuleHandle<Data> : Module<ModuleAssets<Data>> {
/// <summary> 数据 </summary>
protected Data value;
@@ -6,7 +6,7 @@ namespace MuHua {
/// <summary>
/// 数据预制件
/// </summary>
public abstract class DataPrefab<T> : MonoBehaviour where T : Data<T> {
public abstract class ModulePrefab<T> : MonoBehaviour where T : ModuleData<T> {
/// <summary> 关联的数据 </summary>
protected T value;
@@ -6,7 +6,7 @@ namespace MuHua {
/// <summary>
/// 单例行为
/// </summary>
public abstract class SingleBehaviour<T> : MonoBehaviour where T : SingleBehaviour<T> {
public abstract class ModuleSingle<T> : MonoBehaviour where T : ModuleSingle<T> {
/// <summary> 模块单例 </summary>
public static T I => instance;
/// <summary> 模块单例 </summary>
@@ -6,7 +6,7 @@ namespace MuHua {
/// <summary>
/// 数据可视化
/// </summary>
public class DataVisual<T> : SingleBehaviour<DataVisual<T>> where T : Data<T> {
public class ModuleVisual<T> : ModuleSingle<ModuleVisual<T>> where T : ModuleData<T> {
/// <summary> 生成空间 </summary>
public Transform space;
/// <summary> 数据预制件 </summary>
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: cf2bc427dc33d6249adc8ab937d37331
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -8,7 +8,7 @@ namespace MuHua {
/// <summary>
/// UI项
/// </summary>
public abstract class UIItem<Data> {
public abstract class ModuleUIItem<Data> : ModuleUIPanel {
/// <summary> 选择事件 </summary>
public static event Action<Data> OnSelect;
/// <summary> 触发事件 </summary>
@@ -16,12 +16,9 @@ namespace MuHua {
/// <summary> 绑定的数据 </summary>
public readonly Data value;
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
/// <summary> UI项 </summary>
public UIItem(Data value, VisualElement element) {
public ModuleUIItem(Data value, VisualElement element) : base(element) {
this.value = value;
this.element = element;
OnSelect += UIItem_OnSelect;
}
@@ -6,22 +6,20 @@ using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// UI容器
/// UI容器
/// </summary>
public class UIContainer<Item, Data> where Item : UIItem<Data> {
public readonly VisualElement container;
public class ModuleUIItems<Item, Data> : ModuleUIPanel where Item : ModuleUIItem<Data> {
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;
public ModuleUIItems(VisualElement element, VisualTreeAsset templateAsset, Func<Data, VisualElement, Item> generate) : base(element) {
this.templateAsset = templateAsset;
this.generate = generate;
}
/// <summary> 释放资源 </summary>
public void Release() {
container.Clear();
element.Clear();
uiItems.ForEach(obj => obj.Release());
uiItems = new List<Item>();
}
@@ -34,7 +32,7 @@ namespace MuHua {
public void Create(Data data) {
VisualElement element = templateAsset.Instantiate();
Item item = generate(data, element);
container.Add(item.element);
this.element.Add(item.element);
uiItems.Add(item);
}
}
@@ -0,0 +1,20 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// 页面模块
/// </summary>
public class ModuleUIPage : MonoBehaviour {
/// <summary> 绑定文档 </summary>
public UIDocument document;
/// <summary> 根目录文档 </summary>
public VisualElement root => document.rootVisualElement;
/// <summary> 添加UI元素 </summary>
public void Add(VisualElement child) => root.Add(child);
/// <summary> 查询UI元素 </summary>
public T Q<T>(string name = null, string className = null) where T : VisualElement => root.Q<T>(name, className);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a20e816476c4c5d4b83e112be2e08697
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// UI控件
/// </summary>
public class ModuleUIPanel {
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
/// <summary> UI控件 </summary>
public ModuleUIPanel(VisualElement element) => this.element = element;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 97e1bf60274de61419b2d9588340cafa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 93ea492ab6f026841bfee78f2f1c99fa
guid: 90a36026f648a6f45add234bc15d5548
folderAsset: yes
DefaultImporter:
externalObjects: {}
@@ -0,0 +1,30 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
public class UIFloatField : FloatField {
public new class UxmlFactory : UxmlFactory<UIFloatField, UxmlTraits> { }
public new class UxmlTraits : FloatField.UxmlTraits { }
public VisualElement inputElement;
public VisualElement textElement;
public UIFloatField() {
ClearClassList();
AddToClassList("input-field");
labelElement.ClearClassList();
labelElement.AddToClassList("unity-text-element");
labelElement.AddToClassList("input-field-label");
inputElement = this.Q<VisualElement>("unity-text-input");
inputElement.ClearClassList();
inputElement.AddToClassList("input-field-box");
textElement = inputElement.Q<VisualElement>("");
textElement.ClearClassList();
textElement.AddToClassList("unity-text-element");
textElement.AddToClassList("input-field-text");
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7046acdb2e5ef0c458969a4022ee9ab4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,28 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
public class UILongField : LongField {
public new class UxmlFactory : UxmlFactory<UILongField, UxmlTraits> { }
public new class UxmlTraits : LongField.UxmlTraits { }
public UILongField() {
ClearClassList();
AddToClassList("input-field");
labelElement.ClearClassList();
labelElement.AddToClassList("unity-text-element");
labelElement.AddToClassList("input-field-label");
VisualElement inputElement = this.Q<VisualElement>("unity-text-input");
inputElement.ClearClassList();
inputElement.AddToClassList("input-field-box");
VisualElement textElement = inputElement.Q<VisualElement>("");
textElement.ClearClassList();
textElement.AddToClassList("unity-text-element");
textElement.AddToClassList("input-field-text");
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1d30b5caf969d9b4ab1464d329cf16ca
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,55 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
public class UITextField : TextField {
public new class UxmlFactory : UxmlFactory<UITextField, UxmlTraits> { }
public new class UxmlTraits : TextField.UxmlTraits {
public UxmlStringAttributeDescription DefaultPrompt = new UxmlStringAttributeDescription {
name = "default-prompt"
};
public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc) {
base.Init(ve, bag, cc);
UITextField textField = (UITextField)ve;
textField.DefaultPrompt = DefaultPrompt.GetValueFromBag(bag, cc);
textField.SetDefaultPrompt();
}
}
public string DefaultPrompt { get; set; }
public VisualElement inputElement => this.Q<VisualElement>("unity-text-input");
public VisualElement textElement => inputElement.Q<VisualElement>("");
public UITextField() {
ClearClassList();
AddToClassList("input-field");
labelElement.ClearClassList();
labelElement.AddToClassList("unity-text-element");
labelElement.AddToClassList("input-field-label");
inputElement.ClearClassList();
inputElement.AddToClassList("input-field-box");
textElement.ClearClassList();
textElement.AddToClassList("unity-text-element");
textElement.AddToClassList("input-field-text");
RegisterCallback<FocusInEvent>((evt) => { PrepareInput(); });
RegisterCallback<FocusOutEvent>((evt) => { SetDefaultPrompt(); });
}
public void PrepareInput() {
textElement.RemoveFromClassList("input-field-text-d");
if (text != DefaultPrompt) { return; }
text = "";
}
public void SetDefaultPrompt() {
textElement.RemoveFromClassList("input-field-text-d");
if (value != "") { return; }
text = DefaultPrompt;
textElement.AddToClassList("input-field-text-d");
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3bbf7cc5bf423304dbb4eac4f82b2bee
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -8,9 +8,7 @@ namespace MuHua {
/// <summary>
/// 滚动视图
/// </summary>
public class UIScrollView {
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
public class UIScrollView : ModuleUIPanel {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -31,8 +29,8 @@ namespace MuHua {
public readonly VisualElement ScrollerHorizontal;
public readonly VisualElement ScrollerVertical;
public UIScrollView(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.HorizontalAndVertical, UIDirection sh = UIDirection.FromLeftToRight, UIDirection sv = UIDirection.FromTopToBottom) {
this.element = element;
public UIScrollView(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.HorizontalAndVertical,
UIDirection sh = UIDirection.FromLeftToRight, UIDirection sv = UIDirection.FromTopToBottom) : base(element) {
this.canvas = canvas;
this.direction = direction;
@@ -73,7 +71,8 @@ namespace MuHua {
float wheel = Mathf.Clamp(evt.delta.y, -1, 1);
if (direction == UIDirection.Horizontal) {
UpdateValue(new Vector2(value.x - wheel, value.y));
} else {
}
else {
UpdateValue(new Vector2(value.x, value.y - wheel));
}
}
@@ -8,9 +8,7 @@ namespace MuHua {
/// <summary>
/// 滚动条
/// </summary>
public class UIScroller {
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
public class UIScroller : ModuleUIPanel {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -27,8 +25,7 @@ namespace MuHua {
public readonly VisualElement Dragger;
public UIScroller(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) {
this.element = element;
public UIScroller(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) : base(element) {
this.canvas = canvas;
this.direction = direction;
@@ -8,9 +8,7 @@ namespace MuHua {
/// <summary>
/// 滑块
/// </summary>
public class UISlider {
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
public class UISlider : ModuleUIPanel {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -29,8 +27,7 @@ namespace MuHua {
public readonly VisualElement Tracker;
public readonly VisualElement Dragger;
public UISlider(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) {
this.element = element;
public UISlider(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) : base(element) {
this.canvas = canvas;
this.direction = direction;
@@ -0,0 +1,68 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
#if ENABLE_INPUT_SYSTEM && UNITY_INPUT_SYSTEM_PACKAGE
using UnityEngine.InputSystem;
#endif
namespace MuHua {
/// <summary>
/// 悬浮窗口
/// </summary>
public abstract class UIWindow : ModuleUIPanel {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
private bool isDownMove;
private Vector3 pointerPosition;
private Vector3 originalPosition;
public VisualElement Window => element.Q<VisualElement>("Window");
public VisualElement Top => element.Q<VisualElement>("Top");
public VisualElement Container => element.Q<VisualElement>("Container");
public Label Title => element.Q<Label>("Title");
public Button Close => element.Q<Button>("Close");
public UIWindow(VisualElement element, VisualElement canvas) : base(element) {
this.canvas = canvas;
Top.RegisterCallback<PointerDownEvent>(TopDown);
canvas.RegisterCallback<PointerUpEvent>((evt) => isDownMove = false);
canvas.RegisterCallback<PointerLeaveEvent>((evt) => isDownMove = false);
Close.clicked += () => { SetActive(false); };
}
/// <summary> 按下Top </summary>
private void TopDown(PointerDownEvent evt) {
isDownMove = true;
pointerPosition = UITool.GetMousePosition();
originalPosition = Window.transform.position;
}
/// <summary> 设置活动状态 </summary>
public virtual void SetActive(bool active) {
Window.EnableInClassList("window-hidden", !active);
}
/// <summary> 更新状态 </summary>
public virtual void Update() {
if (!isDownMove) { return; }
Vector3 mousePosition = UITool.GetMousePosition();
Vector3 offset = mousePosition - pointerPosition;
Vector3 position = originalPosition + new Vector3(offset.x, -offset.y);
float width = canvas.resolvedStyle.width - Window.resolvedStyle.width;
float height = canvas.resolvedStyle.height - Window.resolvedStyle.height;
position.x = Mathf.Clamp(position.x, 0, width);
position.y = Mathf.Clamp(position.y, 0, height);
Window.transform.position = position;
}
}
}
@@ -1,77 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
#if ENABLE_INPUT_SYSTEM && UNITY_INPUT_SYSTEM_PACKAGE
using UnityEngine.InputSystem;
#endif
namespace MuHua
{
/// <summary>
/// 悬浮窗口
/// </summary>
public abstract class UIFloatingWindow
{
/// <summary> 绑定的元素 </summary>
public readonly VisualElement element;
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
private bool isDownMove;
private Vector3 pointerPosition;
private Vector3 originalPosition;
public VisualElement Window => element.Q<VisualElement>("Window");
public VisualElement Top => element.Q<VisualElement>("Top");
public VisualElement Container => element.Q<VisualElement>("Container");
public Label Title => element.Q<Label>("Title");
public Button Close => element.Q<Button>("Close");
public UIFloatingWindow(VisualElement element, VisualElement canvas)
{
this.element = element;
this.canvas = canvas;
Top.RegisterCallback<PointerDownEvent>(TopDown);
canvas.RegisterCallback<PointerUpEvent>((evt) => isDownMove = false);
canvas.RegisterCallback<PointerLeaveEvent>((evt) => isDownMove = false);
Close.clicked += () => { SetActive(false); };
}
/// <summary> 按下Top </summary>
private void TopDown(PointerDownEvent evt)
{
isDownMove = true;
pointerPosition = UITool.GetMousePosition();
originalPosition = Window.transform.position;
}
/// <summary> 设置活动状态 </summary>
public virtual void SetActive(bool active)
{
Window.EnableInClassList("window-hidden", !active);
}
/// <summary> 更新状态 </summary>
public virtual void Update()
{
if (!isDownMove) { return; }
Vector3 mousePosition = UITool.GetMousePosition();
Vector3 offset = mousePosition - pointerPosition;
Vector3 position = originalPosition + new Vector3(offset.x, -offset.y);
float width = canvas.resolvedStyle.width - Window.resolvedStyle.width;
float height = canvas.resolvedStyle.height - Window.resolvedStyle.height;
position.x = Mathf.Clamp(position.x, 0, width);
position.y = Mathf.Clamp(position.y, 0, height);
Window.transform.position = position;
}
}
}