// using System.Collections.Generic; using EventCubeMelt; using UnityEngine; using UnityEngine.EventSystems; namespace EventCubeMelt.UI { public class UIDragManager : MonoBehaviour { public static UIDragManager Instance; [HideInInspector] public RectTransform dragContainer; // 用于存放正在拖拽的物体的容器 private Dictionary> _pools = new(); // 对象池 private Canvas _rootCanvas; // 主Canvas,用于坐标计算 private void Awake() { if (!Instance) Instance = this; _rootCanvas = GetComponentInParent(); dragContainer = GetComponent(); InitializePools(); } private void InitializePools() { } // #region LOG private static void ELog(string message) { #if UNITY_EDITOR if (!EventCubeMeltLogPolicy.EnableELog) return; Debug.Log($" UIDragManager => {message} "); #endif } #endregion // 创建可拖动Piece public PieceRenderer CreateDragPiece(GameObject go, PointerEventData eventData) { var newItem = Instantiate(go,transform); newItem.gameObject.name = "DragPiece"; var pieceRender = newItem.GetComponent(); if (!pieceRender) { pieceRender = newItem.AddComponent(); } pieceRender.CopyData(go.GetComponent()); pieceRender.OffsetYWithDelta = pieceRender.OffsetY; UpdatePiecePos(eventData, pieceRender); pieceRender.transform.localScale = Vector3.one * pieceRender.ScaleFactor; pieceRender.gameObject.SetActive(true); return pieceRender; } public void UpdatePiecePos(PointerEventData eventData, PieceRenderer pieceRender,float diff = 0f) { var offset = pieceRender.OffsetYWithDelta + diff; var screenPosition = eventData.position; var scrPos = new Vector2(screenPosition.x, screenPosition.y + offset); ELog($"UpdatePiecePos ->{diff} {offset} "); // 设置初始位置(在手指下方一点,视觉效果更好) RectTransformUtility.ScreenPointToWorldPointInRectangle( dragContainer, scrPos, _rootCanvas.worldCamera, out var worldPos); pieceRender.transform.position = worldPos; } } }