2025-09-24 19:24:19 +08:00

132 lines
4.4 KiB
C#

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using ZXKFramework;
namespace DongWuYiXue.DaoNiaoShu
{
public class Drag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
public enum Group
{
group1,
group2,
group3,
group4
}
public string dragName;
public Group group;
[Header("是否拖拽")]
public bool drag;
[HideInInspector]
public GameObject falseImage;
[HideInInspector]
public GameObject rightImage;
[HideInInspector]
public GameObject hoverImage;
[HideInInspector]
public GameObject dragImage;
public Drag rightTarget;//正确答案
[HideInInspector]
public Drag yourTarget;//您的答案
DragManager dragManager;
[HideInInspector]
public RectTransform rectTransform;
private Vector3 startPos;
private Vector2 offset;
[HideInInspector]
public bool right;
private Canvas canvas;
private void Awake()
{
canvas = GetComponentInParent<Canvas>();
rectTransform = GetComponent<RectTransform>();
startPos = rectTransform.localPosition;
falseImage = transform.FindFirst("FalseImg");
rightImage = transform.FindFirst("RightImg");
hoverImage = transform.FindFirst("HoverImg");
dragImage = transform.FindFirst("DragImg");
}
public void Init(DragManager dragManager)
{
this.dragManager = dragManager;
ResetPos();
right = false;
falseImage.SetActive(false);
rightImage.SetActive(false);
hoverImage.SetActive(false);
dragImage.SetActive(false);
yourTarget = null;
}
// 开始拖拽时调用
public void OnBeginDrag(PointerEventData eventData)
{
if (drag && !falseImage.activeSelf && !rightImage.activeSelf)
{
Vector2 localPoint;
// 使用父级 RectTransform 进行坐标转换
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform.parent as RectTransform, eventData.position, canvas.worldCamera, out localPoint);
// 计算鼠标相对于 UI 元素的偏移量
offset = rectTransform.anchoredPosition - localPoint;
dragManager.drag = this;
}
}
// 拖拽过程中调用
public void OnDrag(PointerEventData eventData)
{
if (drag && !falseImage.activeSelf && !rightImage.activeSelf)
{
dragImage.SetActive(true);
hoverImage.SetActive(false);
Vector2 localPoint;
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform.parent as RectTransform, eventData.position, canvas.worldCamera, out localPoint);
// 根据鼠标位置和偏移量更新 UI 元素的位置
rectTransform.anchoredPosition = localPoint + offset;
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (drag && !falseImage.activeSelf && !rightImage.activeSelf)
{
dragManager.DragEnd();
dragImage.SetActive(false);
}
}
public void ResetPos()
{
rectTransform.localPosition = startPos;
}
public void OnPointerEnter(PointerEventData eventData)
{
// 获取当前的 EventSystem
EventSystem eventSystem = EventSystem.current;
// 检查鼠标是否在 UI 上
if (eventSystem.IsPointerOverGameObject())
{
if (!dragImage.activeSelf && yourTarget == null)//dragImage和hoverImage只能有一个显示
{
hoverImage.SetActive(true);
}
}
}
public void OnPointerExit(PointerEventData eventData)
{
// 获取当前的 EventSystem
EventSystem eventSystem = EventSystem.current;
// 检查鼠标是否在 UI 上
if (eventSystem.IsPointerOverGameObject())
{
hoverImage.SetActive(false);
}
}
}
}