Unity 背包物品拖動/物品互換


簡單記錄,方便使用

創建好背包格子

 

 格子的tag值需要設置成Grid   物品tag值需要設置成 Good  (自己設置成什么都行) 設置其他參數 需要在腳本中修改

                     

  

 下面上代碼    一個繼承 MonoBehaviour  一個繼承 Button

第一種

using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
/// <summary>
/// 本腳本掛在物品上運行即可
/// </summary>
public class DragImage : MonoBehaviour
{
    private Transform beginParentTransform; //記錄開始拖動時的父級對象        
  
    private Transform canvasParent;
    private EventTrigger trigger;
    // Use this for initialization
    void Start()
    {
        canvasParent = GameObject.Find("Canvas").transform;
        if (!GetComponent<EventTrigger>())
        {
            trigger = gameObject.AddComponent<EventTrigger>();
        }
        else
        {
            trigger = gameObject.GetComponent<EventTrigger>();
        }
        //開始拖拽的事件
        UnityAction<BaseEventData> click = new UnityAction<BaseEventData>(Begin);
        EventTrigger.Entry myclick = new EventTrigger.Entry();
        myclick.eventID = EventTriggerType.BeginDrag;
        myclick.callback.AddListener(click);

        trigger.triggers.Add(myclick);

        //拖拽中的事件
        UnityAction<BaseEventData> _click = new UnityAction<BaseEventData>(OnDrag);
        EventTrigger.Entry myclick_ = new EventTrigger.Entry();
        myclick_.eventID = EventTriggerType.Drag;
        myclick_.callback.AddListener(_click);
        trigger.triggers.Add(myclick_);
        //結束拖拽的事件
        UnityAction<BaseEventData> Endclick = new UnityAction<BaseEventData>(End);
        EventTrigger.Entry Endclick_ = new EventTrigger.Entry();
        Endclick_.eventID = EventTriggerType.EndDrag;
        Endclick_.callback.AddListener(Endclick);
        trigger.triggers.Add(Endclick_);
    }
    /// <summary>
    /// 開始拖動時
    /// </summary>
    public void Begin(BaseEventData data)
    {
        if (transform.parent == canvasParent) return;
        beginParentTransform = transform.parent;
        transform.SetParent(canvasParent);
    }


    /// <summary>
    /// 拖動中
    /// </summary>
    /// <param name="e">UI事件數據</param>
    public void OnDrag(BaseEventData e)
    {
        transform.position = Input.mousePosition;
        if (transform.GetComponent<Image>().raycastTarget)
            transform.GetComponent<Image>().raycastTarget = false;
    }


    /// <summary>
    /// 結束時
    /// </summary>
    public void End(BaseEventData data)
    {
        PointerEventData e = data as PointerEventData;
        if (e == null) return;
        GameObject target = e.pointerCurrentRaycast.gameObject;
        if (target.tag == "Grid") //如果當前拖動物體下是:格子(沒有物品)時
        {
            SetPos_Parent(transform, target.transform);
            transform.GetComponent<Image>().raycastTarget = true;
        }
        else if (target.tag == "Good") //如果是物品
        {
            SetPos_Parent(transform, target.transform.parent);                              //將當前拖動物品設置到目標位置
            target.transform.SetParent(canvasParent);                                             //目標物品設置到 UI 頂層
            SetPos_Parent(target.transform, beginParentTransform); //再將目標物品設置到開始拖動物品的父物體 來完成物品的切換

            transform.GetComponent<Image>().raycastTarget = true;
        }
        else //其他任何情況,物體回歸原始位置
        {
            SetPos_Parent(transform, beginParentTransform);
            transform.GetComponent<Image>().raycastTarget = true;
        }
    }


    /// <summary>
    /// 設置父物體,UI位置歸正
    /// </summary>
    /// <param name="targetods">對象Transform</param>
    /// <param name="parent">要設置到的父級</param>
    private void SetPos_Parent(Transform targetods, Transform parent)
    {
        targetods.SetParent(parent);
        targetods.position = parent.position;
    }
}

第一種實現來回拖拽的效果,可以相互替換

擴展(實現在背包里拖拽到其他固定地方,在從其他地方拖到背包)

using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
/// <summary>
/// 本腳本掛在物品上運行即可
/// </summary>
public class DragImage : MonoBehaviour
{
    public Transform targerTransform;  //目標位置
    private Transform beginParentTransform; //記錄開始拖動時的父級對象        
  
    private Transform canvasParent;
    private EventTrigger trigger;
    // Use this for initialization
    void Start()
    {
        canvasParent = GameObject.Find("Canvas").transform;
        if (!GetComponent<EventTrigger>())
        {
            trigger = gameObject.AddComponent<EventTrigger>();
        }
        else
        {
            trigger = gameObject.GetComponent<EventTrigger>();
        }
        //開始拖拽的事件
        UnityAction<BaseEventData> click = new UnityAction<BaseEventData>(Begin);
        EventTrigger.Entry myclick = new EventTrigger.Entry();
        myclick.eventID = EventTriggerType.BeginDrag;
        myclick.callback.AddListener(click);

        trigger.triggers.Add(myclick);

        //拖拽中的事件
        UnityAction<BaseEventData> _click = new UnityAction<BaseEventData>(OnDrag);
        EventTrigger.Entry myclick_ = new EventTrigger.Entry();
        myclick_.eventID = EventTriggerType.Drag;
        myclick_.callback.AddListener(_click);
        trigger.triggers.Add(myclick_);
        //結束拖拽的事件
        UnityAction<BaseEventData> Endclick = new UnityAction<BaseEventData>(End);
        EventTrigger.Entry Endclick_ = new EventTrigger.Entry();
        Endclick_.eventID = EventTriggerType.EndDrag;
        Endclick_.callback.AddListener(Endclick);
        trigger.triggers.Add(Endclick_);
    }
    /// <summary>
    /// 開始拖動時
    /// </summary>
    public void Begin(BaseEventData data)
    {
        //if (transform.parent == canvasParent) return;
        beginParentTransform = transform.parent;
        transform.SetParent(canvasParent);
    }


    /// <summary>
    /// 拖動中
    /// </summary>
    /// <param name="e">UI事件數據</param>
    public void OnDrag(BaseEventData e)
    {
        transform.position = Input.mousePosition;
        if (transform.GetComponent<Image>().raycastTarget)
            transform.GetComponent<Image>().raycastTarget = false;
       // Debug.Log(e);
    }


    /// <summary>
    /// 結束時
    /// </summary>
    public void End(BaseEventData data)
    {
      
        PointerEventData e = data as PointerEventData;
      
        if (e == null) return;
        GameObject target = e.pointerCurrentRaycast.gameObject;
        if (transform.parent == canvasParent)
        {
            SetPos_Parent(transform, beginParentTransform);
            transform.GetComponent<Image>().raycastTarget = true;

        }

        if (target.tag == "Grid"&& target.name == this.name|| target.tag == "Grid" && target.name =="Grid") //如果當前拖動物體下是:格子(沒有物品)時
        {
            SetPos_Parent(transform, target.transform);
            transform.GetComponent<Image>().raycastTarget = true;
        }
        else if (target.tag == "Good") //如果是物品
        {
            SetPos_Parent(transform, target.transform.parent);                              //將當前拖動物品設置到目標位置
            target.transform.SetParent(canvasParent);                                             //目標物品設置到 UI 頂層
            SetPos_Parent(target.transform, beginParentTransform); //再將目標物品設置到開始拖動物品的父物體 來完成物品的切換

            transform.GetComponent<Image>().raycastTarget = true;
        }
       
        else //其他任何情況,物體回歸原始位置
        {

            SetPos_Parent(transform, beginParentTransform);
            transform.GetComponent<Image>().raycastTarget = true;
        }
      
    }


    /// <summary>
    /// 設置父物體,UI位置歸正
    /// </summary>
    /// <param name="targetods">對象Transform</param>
    /// <param name="parent">要設置到的父級</param>
    private void SetPos_Parent(Transform targetods, Transform parent)
    {
        targetods.SetParent(parent);
        targetods.position = parent.position;
    }
}
擴展

 

 

第二種

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;

namespace DragAmer.UI {
    //繼承button 掛在物品上即可 需要其他功能請自行添加
public class CongDragSwapImage : Button, IDragHandler, IBeginDragHandler, IEndDragHandler
    {
    private Transform beginParentTransform; //記錄開始拖動時的父級對象        
      
    private Transform canvasParent;

    protected override void Start()
    {
        base.Start();
        canvasParent = GameObject.Find("Canvas").transform;
    }


    public void OnBeginDrag(PointerEventData _)
    {
        if (transform.parent == canvasParent) return;
        beginParentTransform = transform.parent;
        transform.SetParent(canvasParent);
    }


    public void OnDrag(PointerEventData _)
    {
        transform.position = Input.mousePosition;
        if (transform.GetComponent<Image>().raycastTarget) transform.GetComponent<Image>().raycastTarget = false;
    }


    public void OnEndDrag(PointerEventData e)
    {
        GameObject target = e.pointerCurrentRaycast.gameObject;
            if (target.tag == "Grid") //如果當前拖動物體下是:格子(沒有物品)時
            {
                SetPos_Parent(transform, target.transform);
                transform.GetComponent<Image>().raycastTarget = true;
            }
            else if (target.tag == "Good") //如果目標是物品
            {
                SetPos_Parent(transform, target.transform.parent);                    //將當前拖動物品設置到目標位置
                target.transform.SetParent(canvasParent);                                  //目標物品設置到 UI 頂層

                SetPos_Parent(target.transform, beginParentTransform); //再將目標物品設置到開始拖動物品的父物體 來完成物品的切換

                transform.GetComponent<Image>().raycastTarget = true;


            }
            else //其他任何情況,物體回歸原始位置
            {
                SetPos_Parent(transform, beginParentTransform);
                transform.GetComponent<Image>().raycastTarget = true;
            }
    }
        /// <summary>
        /// 設置父物體,UI位置歸正
        /// </summary>
        /// <param name="targetods">對象Transform</param>
        /// <param name="parent">要設置到的父級</param>
        private void SetPos_Parent(Transform targetods, Transform parent)
        {
            targetods.SetParent(parent);
            targetods.position = parent.position;
        }
    }
}

 

 

 

end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM