修复BUG

This commit is contained in:
MuHua-123
2025-06-17 16:18:54 +08:00
parent 5e7fa2ef57
commit e14ba6d45f
71 changed files with 6471 additions and 214 deletions
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
@@ -8,13 +9,13 @@ namespace MuHua {
/// <summary>
/// 滚动视图 - 垂直
/// </summary>
public class UIScrollViewV : ModuleUIPanel {
public class UIScrollViewV : ModuleUIPanel, IDisposable {
/// <summary> 绑定的画布 </summary>
public readonly VisualElement canvas;
/// <summary> 元素方向 </summary>
public readonly UIDirection direction;
/// <summary> 垂直滑块 </summary>
public readonly UIScroller vertical;
public readonly UIScrollerV vertical;
/// <summary> 值改变时 </summary>
public event Action<float> ValueChanged;
@@ -31,35 +32,43 @@ namespace MuHua {
public Vector3 originalPosition;
public Vector3 pointerPosition;
public VisualElement Viewport => Q<VisualElement>("Viewport");
public VisualElement Container => Q<VisualElement>("Container");
public VisualElement ScrollerVertical => Q<VisualElement>("ScrollerVertical");
public readonly VisualElement Viewport;
public readonly VisualElement Container;
public readonly VisualElement ScrollerVertical;
public UIScrollViewV(VisualElement element, VisualElement canvas, UIDirection direction) : base(element) {
public UIScrollViewV(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromTopToBottom) : base(element) {
this.canvas = canvas;
this.direction = direction;
if (direction == UIDirection.FromTopToBottom) {
// vertical = new UIScroller(ScrollerVertical, canvas, direction);
Viewport.style.flexDirection = FlexDirection.Column;
}
if (direction == UIDirection.FromBottomToTop) {
// vertical = new UIScroller(ScrollerVertical, canvas, direction);
Viewport.style.flexDirection = FlexDirection.ColumnReverse;
}
Viewport = element.Children().FirstOrDefault(e => e.name == "Viewport");
Container = Viewport.Children().FirstOrDefault(e => e.name == "Container");
ScrollerVertical = element.Children().FirstOrDefault(e => e.name == "ScrollerVertical");
if (direction == UIDirection.FromTopToBottom) { vertical = new UIScrollerV(ScrollerVertical, canvas, UIScrollerV.UIDirection.FromTopToBottom); }
if (direction == UIDirection.FromBottomToTop) { vertical = new UIScrollerV(ScrollerVertical, canvas, UIScrollerV.UIDirection.FromBottomToTop); }
// 设置事件
vertical.ValueChanged += (y) => { UpdateValue(y); };
Viewport.RegisterCallback<WheelEvent>(ViewportWheel);
Viewport.RegisterCallback<PointerDownEvent>(DraggerDown);
Viewport.RegisterCallback<MouseCaptureEvent>((evt) => isDrag = false);
Viewport.RegisterCallback<MouseCaptureEvent>(DraggerUpOrLeave);
Viewport.style.flexDirection = direction == UIDirection.FromTopToBottom ? FlexDirection.Column : FlexDirection.ColumnReverse;
// 释放
canvas.RegisterCallback<PointerUpEvent>((evt) => isDrag = false);
canvas.RegisterCallback<PointerLeaveEvent>((evt) => isDrag = false);
canvas.RegisterCallback<PointerUpEvent>(DraggerUpOrLeave);
canvas.RegisterCallback<PointerLeaveEvent>(DraggerUpOrLeave);
// 视图原始更新
element.generateVisualContent += ElementGenerateVisualContent;
}
/// <summary> 解绑事件,防止内存泄漏 </summary>
public virtual void Dispose() {
Viewport.UnregisterCallback<WheelEvent>(ViewportWheel);
Viewport.UnregisterCallback<PointerDownEvent>(DraggerDown);
Viewport.UnregisterCallback<MouseCaptureEvent>(DraggerUpOrLeave);
canvas.UnregisterCallback<PointerUpEvent>(DraggerUpOrLeave);
canvas.UnregisterCallback<PointerLeaveEvent>(DraggerUpOrLeave);
element.generateVisualContent -= ElementGenerateVisualContent;
}
/// <summary> 原始更新 </summary>
private void ElementGenerateVisualContent(MeshGenerationContext context) {
float height = Mathf.Clamp01(Viewport.resolvedStyle.height / Container.resolvedStyle.height);
@@ -96,6 +105,10 @@ namespace MuHua {
if (value > max) { value = Mathf.Lerp(value, max, Time.deltaTime * 10); }
if (original != value) { UpdateValue(value); }
}
/// <summary> 鼠标松开或离开 </summary>
private void DraggerUpOrLeave(EventBase evt) {
isDrag = false;
}
/// <summary> 更新状态 </summary>
public virtual void Update() {