增加更新接口

This commit is contained in:
MuHua-123
2025-08-28 14:24:09 +08:00
parent 301030487e
commit 04b65e6945
38 changed files with 155 additions and 509 deletions
@@ -0,0 +1,18 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIBannerTip : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b0bf333809175ae4ebc4469feab46cc7
guid: 7279e9c7234eb6645b7b1e172b70919d
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -132,15 +132,13 @@ GameObject:
m_Component:
- component: {fileID: 670296964}
- component: {fileID: 670296963}
- component: {fileID: 670296965}
- component: {fileID: 670296966}
m_Layer: 5
m_Name: "----\u754C\u9762\u6587\u6863----"
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
m_IsActive: 1
--- !u!114 &670296963
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -155,7 +153,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_PanelSettings: {fileID: 11400000, guid: 782028a3ae72af7429ad2ecdce684390, type: 2}
m_ParentUI: {fileID: 0}
sourceAsset: {fileID: 9197481963319205126, guid: 31e24fa07355f6e42841c8f1d0e77e54, type: 3}
sourceAsset: {fileID: 9197481963319205126, guid: e4a01fc5cb705fe4c9bedf1d0c5df107, type: 3}
m_SortingOrder: 0
--- !u!4 &670296964
Transform:
@@ -173,31 +171,6 @@ Transform:
- {fileID: 1621578791}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &670296965
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 670296962}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ea89ac05041b5d74582ee9d0add233ac, type: 3}
m_Name:
m_EditorClassIdentifier:
document: {fileID: 670296963}
--- !u!114 &670296966
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 670296962}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3d99eda4d1308724c8374c9e305743bc, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &705507993
GameObject:
m_ObjectHideFlags: 0
@@ -426,7 +399,7 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1439912282}
m_Enabled: 1
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3ce4cafcd40fff3428928289fa060de4, type: 3}
m_Name:
@@ -545,72 +518,9 @@ MonoBehaviour:
m_EditorClassIdentifier:
document: {fileID: 670296963}
SlideButtonTemplate: {fileID: 9197481963319205126, guid: 9452bd34d4b5bff4084d975753638b86, type: 3}
--- !u!1 &1769112986
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1769112988}
- component: {fileID: 1769112987}
- component: {fileID: 1769112989}
m_Layer: 5
m_Name: UIDocument
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!114 &1769112987
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1769112986}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0}
m_Name:
m_EditorClassIdentifier:
m_PanelSettings: {fileID: 11400000, guid: 782028a3ae72af7429ad2ecdce684390, type: 2}
m_ParentUI: {fileID: 0}
sourceAsset: {fileID: 9197481963319205126, guid: 5b53b711220b25a4e9a9896bd5dfad93, type: 3}
m_SortingOrder: 0
--- !u!4 &1769112988
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1769112986}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1769112989
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1769112986}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 13b55fb0978ba0740b207fa9fc1c91bf, type: 3}
m_Name:
m_EditorClassIdentifier:
document: {fileID: 1769112987}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 1439912283}
- {fileID: 670296964}
- {fileID: 1769112988}
+6 -1
View File
@@ -1,5 +1,10 @@
<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">
<ui:Template name="LoginPage" src="project://database/Assets/UI%20Toolkit/GamePage/LoginPage/LoginPage.uxml?fileID=9197481963319205126&amp;guid=7ebceaef0e3991040bf96648c85589a4&amp;type=3#LoginPage" />
<ui:Template name="BannerTip" src="project://database/Assets/UI%20Toolkit/GamePopup/BannerTip/BannerTip.uxml?fileID=9197481963319205126&amp;guid=e4a01fc5cb705fe4c9bedf1d0c5df107&amp;type=3#BannerTip" />
<Style src="project://database/Assets/UI%20Toolkit/Document/Document.uss?fileID=7433441132597879392&amp;guid=9205939af30a4394f8f2e34232b27890&amp;type=3#Document" />
<ui:Instance template="LoginPage" name="LoginPage" class="document-page" />
<ui:Instance template="LoginPage" name="LoginPage" class="document-page document-page-hide" />
<ui:VisualElement name="Window" picking-mode="Ignore" class="document-page" style="flex-grow: 1;" />
<ui:VisualElement name="Popup" picking-mode="Ignore" class="document-page" style="flex-grow: 1;">
<ui:Instance template="BannerTip" name="BannerTip" class="document-page document-page-hide" />
</ui:VisualElement>
</ui:UXML>
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 59a1ea9b07342d04f9b0d4fc62fd24fc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,29 @@
.banner {
height: 300px;
background-color: rgb(40, 137, 255);
transition-duration: 0.2s;
}
.banner-d {
scale: 1 0;
}
.banner-label {
flex-grow: 1;
color: rgb(255, 255, 255);
-unity-text-align: middle-center;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
padding-top: 0;
padding-right: 0;
padding-bottom: 0;
padding-left: 0;
font-size: 60px;
transition-duration: 0.2s;
}
.banner-label-d {
scale: 0 0;
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 75986de11cb02ce479624ef7b29e3193
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
disableValidation: 0
@@ -0,0 +1,8 @@
<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/GamePopup/BannerTip/BannerTip.uss?fileID=7433441132597879392&amp;guid=75986de11cb02ce479624ef7b29e3193&amp;type=3#BannerTip" />
<ui:VisualElement name="Background" style="flex-grow: 1; align-items: stretch; justify-content: space-around; background-color: rgba(0, 0, 0, 0.3);">
<ui:VisualElement name="Banner" class="banner">
<ui:Label tabindex="-1" text="LabelLabelLabelLabelLabelLabel" parse-escape-sequences="true" display-tooltip-when-elided="true" class="banner-label" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: e4a01fc5cb705fe4c9bedf1d0c5df107
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
+1 -1
View File
@@ -75,7 +75,7 @@
padding-right: 0;
padding-bottom: 0;
padding-left: 0;
background-image: url("project://database/Assets/UI%20Toolkit/Assets/Icon/Close.png?fileID=2800000&guid=69ff0e4b4da18f744844c41e5ca6fe3e&type=3#Close");
background-image: url("project://database/Assets/UI%20Toolkit/Assets/Window/Close.png?fileID=2800000&guid=69ff0e4b4da18f744844c41e5ca6fe3e&type=3#Close");
width: 25px;
background-color: rgb(255, 64, 64);
}
@@ -8,7 +8,7 @@ namespace MuHua {
/// <summary>
/// UI项容器
/// </summary>
public class ModuleUIItems<TItem, TData> : ModuleUIPanel, IDisposable where TItem : ModuleUIItem<TData> {
public class ModuleUIItems<TItem, TData> : ModuleUIPanel where TItem : ModuleUIItem<TData> {
/// <summary> 模板资源 </summary>
public readonly VisualTreeAsset templateAsset;
/// <summary> 生成UI项的函数 </summary>
@@ -27,19 +27,19 @@ namespace MuHua {
this.generate = generate;
}
/// <summary> 释放资源 </summary>
public void Dispose() {
public void Release() {
element.Clear();
Items.ForEach(obj => obj.Dispose());
Items = new List<TItem>();
}
/// <summary> 创建UI项 </summary>
public void Create(List<TData> datas, bool isClear = true) {
if (isClear) { Dispose(); }
if (isClear) { Release(); }
datas.ForEach(Create);
}
/// <summary> 创建UI项 </summary>
public void Create(TData data, bool isClear = false) {
if (isClear) { Dispose(); }
if (isClear) { Release(); }
Create(data);
}
/// <summary> 创建UI项 </summary>
@@ -5,7 +5,7 @@ using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// UI控件
/// UI面板
/// </summary>
public class ModuleUIPanel {
/// <summary> 绑定的元素 </summary>
@@ -0,0 +1,13 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MuHua {
/// <summary>
/// UI控制接口
/// </summary>
public interface UIControl {
/// <summary> 更新UI状态 </summary>
public void Update();
}
}
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0721892edd97c594d80af856cbf293c8
guid: b46dec8e6f5bddc49a0a37b501d06229
MonoImporter:
externalObjects: {}
serializedVersion: 2
@@ -8,7 +8,7 @@ namespace MuHua {
/// <summary>
/// 下拉框
/// </summary>
public class UIDropdown<T> : ModuleUIPanel, IDisposable {
public class UIDropdown<T> : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
internal readonly VisualElement canvas;
/// <summary> 下拉框容器 </summary>
@@ -59,7 +59,7 @@ namespace MuHua {
}
public virtual void Dispose() {
canvas.Remove(DropdownContainer);
DropdownItems.Dispose();
DropdownItems.Release();
Input.UnregisterCallback<ClickEvent>(evt => OpenDropdown());
DropdownContainer.UnregisterCallback<PointerDownEvent>(evt => CloseDropdown());
}
@@ -9,7 +9,7 @@ namespace MuHua {
/// <summary>
/// 滚动视图
/// </summary>
public class UIScrollView : ModuleUIPanel, IDisposable {
public class UIScrollView : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 水平滑块 </summary>
@@ -9,7 +9,7 @@ namespace MuHua {
/// <summary>
/// 滚动视图 - 水平
/// </summary>
public class UIScrollViewH : ModuleUIPanel, IDisposable {
public class UIScrollViewH : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -9,7 +9,7 @@ namespace MuHua {
/// <summary>
/// 滚动视图 - 垂直
/// </summary>
public class UIScrollViewV : ModuleUIPanel, IDisposable {
public class UIScrollViewV : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -22,10 +22,10 @@ namespace MuHua {
}
public override void Dispose() {
base.Dispose();
Items.Dispose();
Items.Release();
}
/// <summary> 释放资源 </summary>
public virtual void Release() => Items.Dispose();
public virtual void Release() => Items.Release();
/// <summary> 创建UI项 </summary>
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
@@ -23,10 +23,10 @@ namespace MuHua {
}
public override void Dispose() {
base.Dispose();
Items.Dispose();
Items.Release();
}
/// <summary> 释放资源 </summary>
public virtual void Release() => Items.Dispose();
public virtual void Release() => Items.Release();
/// <summary> 创建UI项 </summary>
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
@@ -23,10 +23,10 @@ namespace MuHua {
}
public override void Dispose() {
base.Dispose();
Items.Dispose();
Items.Release();
}
/// <summary> 释放资源 </summary>
public virtual void Release() => Items.Dispose();
public virtual void Release() => Items.Release();
/// <summary> 创建UI项 </summary>
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
@@ -1,203 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// 滚动条
/// </summary>
[Obsolete("使用 UIScrollerV 或者 UIScrollerH 替换")]
public class UIScroller : ModuleUIPanel {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
public readonly UIDirection direction;
/// <summary> 值改变时 </summary>
public event Action<float> ValueChanged;
public float value;
public bool isDragger;
public float originalPosition;
public float pointerPosition;
public readonly UIScrollerFunc scrollerFunc;
public VisualElement Dragger => Q<VisualElement>("Dragger");
public UIScroller(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) : base(element) {
this.canvas = canvas;
this.direction = direction;
if (direction == UIDirection.FromLeftToRight) { scrollerFunc = new FromLeftToRight(this); }
if (direction == UIDirection.FromRightToLeft) { scrollerFunc = new FromRightToLeft(this); }
if (direction == UIDirection.FromTopToBottom) { scrollerFunc = new FromTopToBottom(this); }
if (direction == UIDirection.FromBottomToTop) { scrollerFunc = new FromBottomToTop(this); }
//设置事件
Dragger.RegisterCallback<PointerDownEvent>(DraggerDown);
element.RegisterCallback<PointerDownEvent>(ElementDown);
canvas.RegisterCallback<PointerUpEvent>((evt) => isDragger = false);
canvas.RegisterCallback<PointerLeaveEvent>((evt) => isDragger = false);
}
/// <summary> 拖拽元素 </summary>
private void DraggerDown(PointerDownEvent evt) => scrollerFunc.DraggerDown(evt);
/// <summary> 按下元素 </summary>
private void ElementDown(PointerDownEvent evt) => scrollerFunc.ElementDown(evt);
/// <summary> 更新状态 </summary>
public void Update() => scrollerFunc.Update();
/// <summary> 更新值(0-1) </summary>
public void UpdateValue(float value, bool send = true) => scrollerFunc.UpdateValue(value, send);
public abstract class UIScrollerFunc {
public readonly UIScroller scroller;
public UIScrollerFunc(UIScroller scroller) => this.scroller = scroller;
/// <summary> 拖拽元素 </summary>
public abstract void DraggerDown(PointerDownEvent evt);
/// <summary> 按下元素 </summary>
public abstract void ElementDown(PointerDownEvent evt);
/// <summary> 更新状态 </summary>
public abstract void Update();
/// <summary> 更新值(0-1) </summary>
public abstract void UpdateValue(float value, bool send = true);
}
/// <summary>
/// 滑块从左到右
/// </summary>
public class FromLeftToRight : UIScrollerFunc {
public FromLeftToRight(UIScroller scroller) : base(scroller) {
scroller.element.style.flexDirection = FlexDirection.Row;
}
public override void DraggerDown(PointerDownEvent evt) {
scroller.isDragger = true;
scroller.originalPosition = scroller.Dragger.transform.position.x;
scroller.pointerPosition = UITool.GetMousePosition().x;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.x - scroller.Dragger.resolvedStyle.width * 0.5f;
float max = scroller.element.resolvedStyle.width - scroller.Dragger.resolvedStyle.width;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void Update() {
if (!scroller.isDragger) { return; }
float differ = UITool.GetMousePosition().x - scroller.pointerPosition;
float offset = differ + scroller.originalPosition;
float max = scroller.element.resolvedStyle.width - scroller.Dragger.resolvedStyle.width;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
scroller.value = value;
if (send) { scroller.ValueChanged?.Invoke(value); }
float max = scroller.element.resolvedStyle.width - scroller.Dragger.resolvedStyle.width;
float x = Mathf.Lerp(0, max, value);
scroller.Dragger.transform.position = new Vector3(x, 0);
}
}
/// <summary>
/// 滑块从右到左
/// </summary>
public class FromRightToLeft : UIScrollerFunc {
public FromRightToLeft(UIScroller scroller) : base(scroller) {
scroller.element.style.flexDirection = FlexDirection.RowReverse;
}
public override void DraggerDown(PointerDownEvent evt) {
scroller.isDragger = true;
scroller.originalPosition = scroller.Dragger.transform.position.x;
scroller.pointerPosition = UITool.GetMousePosition().x;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.x - scroller.Dragger.resolvedStyle.width * 0.5f;
float max = scroller.element.resolvedStyle.width - scroller.Dragger.resolvedStyle.width;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void Update() {
if (!scroller.isDragger) { return; }
float differ = UITool.GetMousePosition().x - scroller.pointerPosition;
float offset = differ + scroller.originalPosition;
float max = scroller.element.resolvedStyle.width - scroller.Dragger.resolvedStyle.width;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
scroller.value = value;
if (send) { scroller.ValueChanged?.Invoke(value); }
float max = scroller.element.resolvedStyle.width - scroller.Dragger.resolvedStyle.width;
float x = Mathf.Lerp(max, 0, value);
scroller.Dragger.transform.position = new Vector3(x, 0);
}
}
/// <summary>
/// 滑块从上到下
/// </summary>
public class FromTopToBottom : UIScrollerFunc {
public FromTopToBottom(UIScroller scroller) : base(scroller) {
scroller.element.style.flexDirection = FlexDirection.Column;
}
public override void DraggerDown(PointerDownEvent evt) {
scroller.isDragger = true;
scroller.originalPosition = scroller.Dragger.transform.position.y;
scroller.pointerPosition = Screen.height - UITool.GetMousePosition().y;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.y - scroller.Dragger.resolvedStyle.height * 0.5f;
float max = scroller.element.resolvedStyle.height - scroller.Dragger.resolvedStyle.height;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void Update() {
if (!scroller.isDragger) { return; }
float differ = Screen.height - UITool.GetMousePosition().y - scroller.pointerPosition;
float offset = differ + scroller.originalPosition;
float max = scroller.element.resolvedStyle.height - scroller.Dragger.resolvedStyle.height;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
scroller.value = value;
if (send) { scroller.ValueChanged?.Invoke(value); }
float max = scroller.element.resolvedStyle.height - scroller.Dragger.resolvedStyle.height;
float y = Mathf.Lerp(0, max, value);
scroller.Dragger.transform.position = new Vector3(0, y);
}
}
/// <summary>
/// 滑块从下到上
/// </summary>
public class FromBottomToTop : UIScrollerFunc {
public FromBottomToTop(UIScroller scroller) : base(scroller) {
scroller.element.style.flexDirection = FlexDirection.ColumnReverse;
}
public override void DraggerDown(PointerDownEvent evt) {
scroller.isDragger = true;
scroller.originalPosition = scroller.Dragger.transform.position.y;
scroller.pointerPosition = Screen.height - UITool.GetMousePosition().y;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.y - scroller.Dragger.resolvedStyle.height * 0.5f;
float max = scroller.element.resolvedStyle.height - scroller.Dragger.resolvedStyle.height;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void Update() {
if (!scroller.isDragger) { return; }
float differ = Screen.height - UITool.GetMousePosition().y - scroller.pointerPosition;
float offset = differ + scroller.originalPosition;
float max = scroller.element.resolvedStyle.height - scroller.Dragger.resolvedStyle.height;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
scroller.value = value;
if (send) { scroller.ValueChanged?.Invoke(value); }
float max = scroller.Dragger.resolvedStyle.height - scroller.element.resolvedStyle.height;
float y = Mathf.Lerp(0, max, value);
scroller.Dragger.transform.position = new Vector3(0, y);
}
}
}
}
@@ -8,7 +8,7 @@ namespace MuHua {
/// <summary>
/// 滚动条 - 水平
/// </summary>
public class UIScrollerH : ModuleUIPanel, IDisposable {
public class UIScrollerH : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -8,7 +8,7 @@ namespace MuHua {
/// <summary>
/// 滚动条 - 垂直
/// </summary>
public class UIScrollerV : ModuleUIPanel, IDisposable {
public class UIScrollerV : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -17,7 +17,7 @@ namespace MuHua {
/// <summary>
/// 滑动按钮
/// </summary>
public class UISlideButton<TItem, Data> : ModuleUIPanel where TItem : ModuleUIItem<Data> where Data : DataSlideButton {
public class UISlideButton<TItem, Data> : ModuleUIPanel, UIControl where TItem : ModuleUIItem<Data> where Data : DataSlideButton {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
@@ -44,7 +44,7 @@ namespace MuHua {
ModuleUIItem<Data>.OnSelect += Settings;
}
public virtual void Dispose() {
Items.Dispose();
Items.Release();
}
public virtual void Update() {
if (data == null || data.element == null) { return; }
@@ -55,7 +55,7 @@ namespace MuHua {
/// <summary> 设置UI项 </summary>
public virtual void Settings(Data data) => this.data = data;
/// <summary> 释放资源 </summary>
public virtual void Release() => Items.Dispose();
public virtual void Release() => Items.Release();
/// <summary> 创建UI项 </summary>
public virtual void Create(List<Data> datas, bool isClear = true) => Items.Create(datas, isClear);
/// <summary> 创建UI项 </summary>
@@ -1,180 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace MuHua {
/// <summary>
/// 滑块
/// </summary>
[Obsolete("使用 UISliderV 或者 UISliderH 替换")]
public class UISlider : ModuleUIPanel {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
public readonly UIDirection direction;
/// <summary> 值改变时 </summary>
public event Action<float> ValueChanged;
public float value;
public bool isDragger;
public float originalPosition;
public float pointerPosition;
public readonly UISliderFunc sliderFunc;
public Label Title => Q<Label>("Title");
public VisualElement Container => Q<VisualElement>("Container");
public VisualElement Tracker => Q<VisualElement>("Tracker");
public VisualElement Dragger => Q<VisualElement>("Dragger");
public UISlider(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromLeftToRight) : base(element) {
this.canvas = canvas;
this.direction = direction;
if (direction == UIDirection.FromLeftToRight) { sliderFunc = new FromLeftToRight(this); }
if (direction == UIDirection.FromRightToLeft) { sliderFunc = new FromRightToLeft(this); }
if (direction == UIDirection.FromTopToBottom) { sliderFunc = new FromTopToBottom(this); }
if (direction == UIDirection.FromBottomToTop) { sliderFunc = new FromBottomToTop(this); }
//设置事件
Dragger.RegisterCallback<PointerDownEvent>(DraggerDown);
Container.RegisterCallback<PointerDownEvent>(ElementDown);
canvas.RegisterCallback<PointerUpEvent>((evt) => isDragger = false);
canvas.RegisterCallback<PointerLeaveEvent>((evt) => isDragger = false);
}
private void DraggerDown(PointerDownEvent evt) => sliderFunc.DraggerDown(evt);
private void ElementDown(PointerDownEvent evt) => sliderFunc.ElementDown(evt);
/// <summary> 更新状态 </summary>
public void Update() => sliderFunc.Update();
/// <summary> 更新值(0-1) </summary>
public void UpdateValue(float value, bool send = true) => sliderFunc.UpdateValue(value, send);
public abstract class UISliderFunc {
public readonly UISlider slider;
public UISliderFunc(UISlider slider) => this.slider = slider;
public abstract void DraggerDown(PointerDownEvent evt);
public abstract void ElementDown(PointerDownEvent evt);
/// <summary> 更新状态 </summary>
public abstract void Update();
/// <summary> 更新值(0-1) </summary>
public abstract void UpdateValue(float value, bool send = true);
}
public class FromLeftToRight : UISliderFunc {
public FromLeftToRight(UISlider slider) : base(slider) { }
public override void DraggerDown(PointerDownEvent evt) {
slider.isDragger = true;
slider.originalPosition = slider.Tracker.resolvedStyle.width;
slider.pointerPosition = UITool.GetMousePosition().x;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.x;
float max = slider.Container.resolvedStyle.width;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void Update() {
if (!slider.isDragger) { return; }
float differ = UITool.GetMousePosition().x - slider.pointerPosition;
float offset = differ + slider.originalPosition;
float max = slider.Container.resolvedStyle.width;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
slider.value = value;
if (send) { slider.ValueChanged?.Invoke(value); }
slider.Tracker.style.width = Length.Percent(value * 100);
}
}
public class FromRightToLeft : UISliderFunc {
public FromRightToLeft(UISlider slider) : base(slider) { }
public override void DraggerDown(PointerDownEvent evt) {
slider.isDragger = true;
slider.originalPosition = slider.Container.resolvedStyle.width - slider.Tracker.resolvedStyle.width;
slider.pointerPosition = UITool.GetMousePosition().x;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.x;
float max = slider.Container.resolvedStyle.width;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void Update() {
if (!slider.isDragger) { return; }
float differ = UITool.GetMousePosition().x - slider.pointerPosition;
float offset = differ + slider.originalPosition;
float max = slider.Container.resolvedStyle.width;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
slider.value = value;
if (send) { slider.ValueChanged?.Invoke(value); }
slider.Tracker.style.width = Length.Percent(value * 100);
}
}
public class FromTopToBottom : UISliderFunc {
public FromTopToBottom(UISlider slider) : base(slider) { }
public override void DraggerDown(PointerDownEvent evt) {
slider.isDragger = true;
slider.originalPosition = slider.Tracker.resolvedStyle.height;
slider.pointerPosition = Screen.height - UITool.GetMousePosition().y;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.y;
float max = slider.Container.resolvedStyle.height;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void Update() {
if (!slider.isDragger) { return; }
float differ = Screen.height - UITool.GetMousePosition().y - slider.pointerPosition;
float offset = differ + slider.originalPosition;
float max = slider.Container.resolvedStyle.height;
float value = Mathf.InverseLerp(0, max, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
slider.value = value;
if (send) { slider.ValueChanged?.Invoke(value); }
slider.Tracker.style.height = Length.Percent(value * 100);
}
}
public class FromBottomToTop : UISliderFunc {
public FromBottomToTop(UISlider slider) : base(slider) { }
public override void DraggerDown(PointerDownEvent evt) {
slider.isDragger = true;
slider.originalPosition = slider.Container.resolvedStyle.height - slider.Tracker.resolvedStyle.height;
slider.pointerPosition = Screen.height - UITool.GetMousePosition().y;
}
public override void ElementDown(PointerDownEvent evt) {
float offset = evt.localPosition.y;
float max = slider.Container.resolvedStyle.height;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void Update() {
if (!slider.isDragger) { return; }
float differ = Screen.height - UITool.GetMousePosition().y - slider.pointerPosition;
float offset = differ + slider.originalPosition;
float max = slider.Container.resolvedStyle.height;
float value = Mathf.InverseLerp(max, 0, offset);
UpdateValue(value);
}
public override void UpdateValue(float value, bool send = true) {
slider.value = value;
if (send) { slider.ValueChanged?.Invoke(value); }
slider.Tracker.style.height = Length.Percent(value * 100);
}
}
}
}
@@ -8,7 +8,7 @@ namespace MuHua {
/// <summary>
/// 滑块 - 水平
/// </summary>
public class UISliderH : ModuleUIPanel, IDisposable {
public class UISliderH : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -8,7 +8,7 @@ namespace MuHua {
/// <summary>
/// 滑块 - 垂直
/// </summary>
public class UISliderV : ModuleUIPanel, IDisposable {
public class UISliderV : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
@@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
@@ -7,9 +8,11 @@ namespace MuHua {
/// <summary>
/// 悬浮窗口
/// </summary>
public abstract class UIWindow : ModuleUIPanel {
public abstract class UIWindow : ModuleUIPanel, IDisposable, UIControl {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 隐藏的USS类名 </summary>
public string hideClassName = "document-page-hide";
private bool isDownMove;
private Vector3 pointerPosition;
@@ -26,10 +29,16 @@ namespace MuHua {
this.canvas = canvas;
Top.RegisterCallback<PointerDownEvent>(TopDown);
canvas.RegisterCallback<PointerUpEvent>((evt) => isDownMove = false);
canvas.RegisterCallback<PointerLeaveEvent>((evt) => isDownMove = false);
Close.RegisterCallback<ClickEvent>((evt) => Settings(false));
canvas.RegisterCallback<PointerUpEvent>(DraggerUpOrLeave);
canvas.RegisterCallback<PointerLeaveEvent>(DraggerUpOrLeave);
Close.RegisterCallback<ClickEvent>(CloseButton);
}
/// <summary> 解绑事件,防止内存泄漏 </summary>
public virtual void Dispose() {
Top.UnregisterCallback<PointerDownEvent>(TopDown);
canvas.UnregisterCallback<PointerUpEvent>(DraggerUpOrLeave);
canvas.UnregisterCallback<PointerLeaveEvent>(DraggerUpOrLeave);
Close.UnregisterCallback<ClickEvent>(CloseButton);
}
/// <summary> 按下Top </summary>
@@ -38,10 +47,18 @@ namespace MuHua {
pointerPosition = UITool.GetMousePosition();
originalPosition = Window.transform.position;
}
/// <summary> 鼠标松开或离开 </summary>
private void DraggerUpOrLeave(EventBase evt) {
isDownMove = false;
}
/// <summary> 关闭按钮 </summary>
private void CloseButton(EventBase evt) {
Settings(false);
}
/// <summary> 设置活动状态 </summary>
public virtual void Settings(bool active) {
element.style.display = active ? DisplayStyle.Flex : DisplayStyle.None;
element.EnableInClassList(hideClassName, !active);
}
/// <summary> 更新状态 </summary>