效果类似背包功能,可以随意拖拽位置,交换两个格子位置
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
public class ExchangeCardNode : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
[SerializeField] Role _role;
public Role role { get { return _role; } }
Image image;
void Start()
{
image = GetComponent<Image>();
}
// ------
Vector2 dragOffset;
Transform lastParent;
public void OnBeginDrag(PointerEventData eventData)
{
lastParent = transform.parent;
dragOffset = (Vector2)transform.position - eventData.position;
transform.position = eventData.position + dragOffset;
image.raycastTarget = false;
transform.SetParent(transform.parent.parent);
}
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position + dragOffset;
}
public void OnEndDrag(PointerEventData eventData)
{
float moveTime = 0.3f;
GameObject exchangeObj = eventData.pointerCurrentRaycast.gameObject;
ExchangeCardNode exchangeNode = null;
if (exchangeObj != null)
exchangeNode = exchangeObj.GetComponent<ExchangeCardNode>();
if (exchangeNode != null && role == exchangeNode.role)
{
transform.SetParent(exchangeObj.transform.parent);
exchangeObj.transform.SetParent(lastParent);
exchangeNode.MoveToPos(Vector3.zero, moveTime);
}
else
{
transform.SetParent(lastParent);
}
MoveToPos(Vector3.zero, moveTime);
image.raycastTarget = true;
CardManager.Instance.RefreshBattleCardOrder();
}
public void MoveToPos(Vector3 targetPos, float time)
{
transform.DOKill();
if (time <= 0)
{
transform.localPosition = targetPos;
}
else
{
transform.DOLocalMove(targetPos, time, false);
}
}
}