This commit is contained in:
MuHua-123
2025-07-14 17:05:54 +08:00
parent edde81a2a3
commit 1255b68f7e
15 changed files with 427 additions and 31 deletions
@@ -0,0 +1,56 @@
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
/// <summary>
/// 测试页面
/// </summary>
public class UITestPage : ModuleUIPage {
public VisualTreeAsset SlideButtonTemplate;
public UISlideButton<UIOption, Option> slideButton;
public override VisualElement Element => root;
public VisualElement SlideButton => Q<VisualElement>("SlideButton");
public void Awake() {
slideButton = new UISlideButton<UIOption, Option>(SlideButton, root, SlideButtonTemplate, (data, element) => new UIOption(data, element));
List<Option> options = new List<Option>();
options.Add(new Option());
options.Add(new Option());
options.Add(new Option());
options.Add(new Option());
slideButton.Create(options);
slideButton.Items[1].Select();
}
public void Update() {
slideButton.Update();
}
public class Option : DataSlideButton {
}
public class UIOption : ModuleUIItem<Option> {
public Button Button => Q<Button>("Button");
public UIOption(Option value, VisualElement element) : base(value, element) {
value.element = element;
Button.clicked += Select;
}
public override void SelectState() {
Button.EnableInClassList("slidebutton-button-s", true);
}
public override void DefaultState() {
Button.EnableInClassList("slidebutton-button-s", false);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: be9d3ba84a127e14abd0d56796e7d7e0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -154,7 +154,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
m_PanelSettings: {fileID: 11400000, guid: 782028a3ae72af7429ad2ecdce684390, type: 2}
m_ParentUI: {fileID: 0}
sourceAsset: {fileID: 9197481963319205126, guid: 7360aa427d614894eab01f938a59da18, type: 3}
sourceAsset: {fileID: 9197481963319205126, guid: 6fe6a77ecbfa24d43ad45ccf188d5aee, type: 3}
m_SortingOrder: 0
--- !u!4 &670296964
Transform:
@@ -169,6 +169,7 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1621578791}
- {fileID: 1021979399}
- {fileID: 1616348624}
- {fileID: 1934900742}
@@ -389,7 +390,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!4 &1021979399
Transform:
m_ObjectHideFlags: 0
@@ -536,7 +537,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!4 &1616348624
Transform:
m_ObjectHideFlags: 0
@@ -565,6 +566,52 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
document: {fileID: 0}
--- !u!1 &1621578790
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1621578791}
- component: {fileID: 1621578792}
m_Layer: 5
m_Name: UITestPage
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1621578791
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1621578790}
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: 670296964}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1621578792
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1621578790}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: be9d3ba84a127e14abd0d56796e7d7e0, type: 3}
m_Name:
m_EditorClassIdentifier:
document: {fileID: 670296963}
SlideButtonTemplate: {fileID: 9197481963319205126, guid: 9452bd34d4b5bff4084d975753638b86, type: 3}
--- !u!1 &1934900741
GameObject:
m_ObjectHideFlags: 0
@@ -581,7 +628,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!4 &1934900742
Transform:
m_ObjectHideFlags: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d5748fc4a9393524d9797cbf0e0b2753
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,45 @@
.slidebutton-bg {
background-color: rgb(44, 62, 80);
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-bottom-right-radius: 10px;
border-bottom-left-radius: 10px;
width: 80px;
height: auto;
padding-top: 5px;
padding-right: 5px;
padding-bottom: 5px;
padding-left: 5px;
}
.slidebutton-button {
border-top-left-radius: 5px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
border-top-width: 0;
border-right-width: 0;
border-bottom-width: 0;
border-left-width: 0;
border-left-color: rgb(255, 255, 255);
border-right-color: rgb(255, 255, 255);
border-top-color: rgb(255, 255, 255);
border-bottom-color: rgb(255, 255, 255);
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
padding-top: 5px;
padding-right: 5px;
padding-bottom: 5px;
padding-left: 5px;
color: rgb(255, 255, 255);
height: 30px;
font-size: 18px;
background-color: rgba(0, 0, 0, 0);
transition-duration: 0.2s;
}
.slidebutton-button-s {
color: rgb(51, 51, 51);
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a188682137c1d204a9a873d3ab8a815f
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
disableValidation: 0
@@ -0,0 +1,13 @@
<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="SlideButtonTemplate" src="project://database/Assets/UI%20Toolkit/Component/SlideButton/SlideButtonTemplate.uxml?fileID=9197481963319205126&amp;guid=9452bd34d4b5bff4084d975753638b86&amp;type=3#SlideButtonTemplate" />
<Style src="project://database/Assets/UI%20Toolkit/Component/SlideButton/SlideButton.uss?fileID=7433441132597879392&amp;guid=a188682137c1d204a9a873d3ab8a815f&amp;type=3#SlideButton" />
<ui:VisualElement name="SlideButton" class="slidebutton-bg">
<ui:VisualElement name="Slide" style="position: absolute; left: 5px; right: 5px; background-color: rgb(255, 255, 255); height: 30px; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px;" />
<ui:VisualElement name="Container" style="flex-grow: 1;">
<ui:Instance template="SlideButtonTemplate" name="SlideButtonTemplate" />
<ui:Instance template="SlideButtonTemplate" name="SlideButtonTemplate" />
<ui:Instance template="SlideButtonTemplate" name="SlideButtonTemplate" />
<ui:Instance template="SlideButtonTemplate" name="SlideButtonTemplate" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 6fe6a77ecbfa24d43ad45ccf188d5aee
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
@@ -0,0 +1,4 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" editor-extension-mode="False">
<Style src="project://database/Assets/UI%20Toolkit/Component/SlideButton/SlideButton.uss?fileID=7433441132597879392&amp;guid=a188682137c1d204a9a873d3ab8a815f&amp;type=3#SlideButton" />
<ui:Button text="按钮" parse-escape-sequences="true" display-tooltip-when-elided="true" name="Button" class="slidebutton-button" />
</ui:UXML>
@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 9452bd34d4b5bff4084d975753638b86
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
File diff suppressed because one or more lines are too long
@@ -10,7 +10,7 @@ namespace MuHua {
/// </summary>
public class UIScrollViewListH<T, Data> : UIScrollViewH where T : ModuleUIItem<Data> {
private ModuleUIItems<T, Data> Items;// UI项容器
public ModuleUIItems<T, Data> Items;// UI项容器
public UIScrollViewListH(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset,
Func<Data, VisualElement, T> generate, UIDirection direction = UIDirection.FromLeftToRight) : base(element, canvas, direction) {
@@ -9,7 +9,8 @@ namespace MuHua {
/// 滚动列表 - 垂直
/// </summary>
public class UIScrollViewListV<T, Data> : UIScrollViewV where T : ModuleUIItem<Data> {
private ModuleUIItems<T, Data> Items;// UI项容器
public ModuleUIItems<T, Data> Items;// UI项容器
public UIScrollViewListV(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset,
Func<Data, VisualElement, T> generate, UIDirection direction = UIDirection.FromTopToBottom) : base(element, canvas, direction) {
@@ -0,0 +1,57 @@
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using MuHua;
namespace MuHua {
/// <summary>
/// 滑块按钮 - 数据
/// </summary>
public abstract class DataSlideButton {
/// <summary> 绑定的元素 </summary>
public VisualElement element;
}
/// <summary>
/// 滑动按钮
/// </summary>
public class UISlideButton<T, Data> : ModuleUIPanel where T : ModuleUIItem<Data> where Data : DataSlideButton {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
public Data data;
public ModuleUIItems<T, Data> Items;// UI项容器
/// <summary> 滑块 </summary>
public VisualElement Slide => Q<VisualElement>("Slide");
/// <summary> 容器 </summary>
public VisualElement Container => Q<VisualElement>("Container");
public UISlideButton(VisualElement element, VisualElement canvas, VisualTreeAsset templateAsset, Func<Data, VisualElement, T> generate) : base(element) {
this.canvas = canvas;
Items = new ModuleUIItems<T, Data>(Container, templateAsset, generate);
ModuleUIItem<Data>.OnSelect += Settings;
}
public virtual void Dispose() {
Items.Dispose();
}
public virtual void Update() {
if (data == null || data.element == null) { return; }
Vector3 offset = data.element.worldBound.position - Slide.worldBound.position;
Slide.transform.position += offset * Time.deltaTime * 20;
}
/// <summary> 释放资源 </summary>
public virtual void Release() => Items.Dispose();
/// <summary> 创建UI项 </summary>
public virtual void Create(List<Data> datas) => Items.Create(datas);
/// <summary> 创建UI项 </summary>
public virtual void Create(Data data) => Items.Create(data);
/// <summary> 设置UI项 </summary>
public virtual void Settings(Data data) => this.data = data;
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b85a4dcbe97e9bf42a0cd6c98edad29e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: