75 lines
2.6 KiB
C#
75 lines
2.6 KiB
C#
//
|
||
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<int, Queue<PieceRenderer>> _pools = new(); // 对象池
|
||
|
||
private Canvas _rootCanvas; // 主Canvas,用于坐标计算
|
||
private void Awake()
|
||
{
|
||
if (!Instance)
|
||
Instance = this;
|
||
|
||
_rootCanvas = GetComponentInParent<Canvas>();
|
||
dragContainer = GetComponent<RectTransform>();
|
||
InitializePools();
|
||
}
|
||
|
||
private void InitializePools()
|
||
{
|
||
|
||
}
|
||
//
|
||
#region LOG
|
||
private static void ELog(string message)
|
||
{
|
||
#if UNITY_EDITOR
|
||
if (!EventCubeMeltLogPolicy.EnableELog) return;
|
||
Debug.Log($"<color=orange> UIDragManager => {message} </color>");
|
||
#endif
|
||
}
|
||
#endregion
|
||
// 创建可拖动Piece
|
||
public PieceRenderer CreateDragPiece(GameObject go, PointerEventData eventData)
|
||
{
|
||
var newItem = Instantiate(go,transform);
|
||
newItem.gameObject.name = "DragPiece";
|
||
var pieceRender = newItem.GetComponent<PieceRenderer>();
|
||
if (!pieceRender)
|
||
{
|
||
pieceRender = newItem.AddComponent<PieceRenderer>();
|
||
}
|
||
pieceRender.CopyData(go.GetComponent<PieceRenderer>());
|
||
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;
|
||
}
|
||
}
|
||
} |