You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity拖拽功能开发:OnDrop事件触发时切换图片(附脚本)

拖拽卡牌到槽位时切换图片的实现方案

先修正原脚本中的错误

原DragHandler脚本存在变量名不一致问题(比如itemBeingDragged和itemIsDragged、startPosition和StartPos),先统一变量并完善逻辑,避免运行报错。

修改后的完整脚本

1. 修正后的DragHandler脚本

using UnityEngine;
using UnityEngine.EventSystems;

public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public static GameObject itemBeingDragged;
    private Vector3 startPosition;
    private Transform startParent;
    private CanvasGroup canvasGroup;

    void Awake()
    {
        canvasGroup = GetComponent<CanvasGroup>();
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        itemBeingDragged = gameObject;
        startPosition = transform.position;
        startParent = transform.parent;
        Debug.Log("On Begin Drag");
        canvasGroup.blocksRaycasts = false;
    }

    public void OnDrag(PointerEventData eventData)
    {
        transform.position = Input.mousePosition;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        canvasGroup.alpha = 1f;
        itemBeingDragged = null;
        // 未放入有效槽位时返回原位置
        if (transform.parent == startParent)
        {
            transform.position = startPosition;
        }
        canvasGroup.blocksRaycasts = true;
    }
}

2. 添加图片切换逻辑的Slot脚本

在原Slot脚本基础上,增加目标图片引用和切换逻辑:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Slot : MonoBehaviour, IDropHandler
{
    // 拖拽到该槽位后要切换的目标图片,在Inspector中赋值
    public Sprite targetSprite;

    public GameObject item
    {
        get
        {
            return transform.childCount > 0 ? transform.GetChild(0).gameObject : null;
        }
    }

    public void OnDrop(PointerEventData eventData)
    {
        if (!item)
        {
            GameObject draggedItem = DragHandler.itemBeingDragged;
            if (draggedItem != null)
            {
                // 将卡牌挂载到槽位下
                draggedItem.transform.SetParent(transform);
                draggedItem.transform.localPosition = Vector3.zero; // 对齐槽位中心

                // 切换卡牌图片
                Image cardImage = draggedItem.GetComponent<Image>();
                if (cardImage != null && targetSprite != null)
                {
                    cardImage.sprite = targetSprite;
                }
            }
        }
    }
}

使用步骤

  • 给你的卡牌物体添加Image组件,并设置初始显示的图片。
  • 给卡牌物体添加CanvasGroup组件(DragHandler会自动获取该组件)。
  • 将DragHandler脚本挂载到卡牌物体上,Slot脚本挂载到槽位占位对象上。
  • 在Slot物体的Inspector面板中,把targetSprite设置为你想要切换到的图片资源。

内容的提问来源于stack exchange,提问作者Moazzam ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:25:20