使用UGUI实现背包物体的拖拽,交换等操作

时间:2025-02-07 12:39:26

本实例通过UGUI实现背包的简单功能,物品的拖拽,交换,拖放位置处理,还有针对背包多页面的滑动翻页的处理。

具体的代码如下。


首先是UIItem类,这个背包内各种物体的类:

using UnityEngine;
using ;
using ;
public class UIItem : MonoBehaviour {
    public Text name;
    public Image image;

    public void Show(string name)
    {
         = name;
    }

}


然后是拖拽事件类,出来鼠标拖拽UIItem类:

using UnityEngine;
using ;
using ;
using ;
using ;
public class DragEvent : MonoBehaviour,IBeginDragHandler ,IDragHandler ,IEndDragHandler ,IPointerDownHandler ,IPointerUpHandler {

    public RectTransform rectTransform;
    public RectTransform rectTransformSlot;
    public Transform draggedItemBox;
    private Vector2 pointerOffset;
    public CanvasGroup canvasGroup;
    public Transform grid;

    /// <summary>
    /// 开始拖拽!
    /// </summary>
    /// <param name="eventData"></param>
    public void OnBeginDrag(PointerEventData eventData)
    {
        SetDraggedPosition(eventData);
    }
    /// <summary>
    /// 设置拖拽开始和结束的位置
    /// </summary>
    /// <param name="eventData"></param>
    private void SetDraggedPosition(PointerEventData eventData)
    {
        if (rectTransform == null)
            return;

        if(eventData .button ==PointerEventData .InputButton .Left )
        {
            //把世界坐标转换为局部坐标
            ();

            (draggedItemBox);
            Vector2 localPointerPosition;
            //画布是否接受射线
             = false;
            if(RectTransformUtility .ScreenPointToLocalPointInRectangle (rectTransformSlot ,Input .mousePosition ,
                eventData .pressEventCamera ,out localPointerPosition ))
            {
                 = localPointerPosition - pointerOffset;
            }
        } 
    }

    public void OnDrag(PointerEventData eventData)
    {
        SetDraggedPosition(eventData);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        SetDraggedPosition(eventData);
         = true;

        if(eventData .pointerCurrentRaycast .gameObject .name =="skill")
        {
            ();
             = ;
        }
        else if(eventData .pointerCurrentRaycast .gameObject .name =="Text99")
        {
            ();
             = ;
            (grid);
        }
        else
        {
            (grid);
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
         =  * 0.5f;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
         = ;
    }
}


最后的对画布和Scroll的类处理:

using UnityEngine;
using ;
using ;
using ;
using ;
using System;
public class ScrollRectHelper : MonoBehaviour ,IBeginDragHandler ,IEndDragHandler {
    /// <summary>
    /// 滑动速度
    /// </summary>
    private float smooting = 2;
    /// <summary>
    /// 每页显示的数目
    /// </summary>
    private int pageCount = 16;

    private ScrollRect sRect;
    /// <summary>
    /// 总页数
    /// </summary>
    private float pageIndex;
    /// <summary>
    /// 是否拖拽结束
    /// </summary>
    private bool isDrag = false;
    /// <summary>
    /// 总页数索引比例
    /// </summary>
    private List<float> listPageValue = new List<float> { 0 };
    /// <summary>
    /// 滑动目标位置
    /// </summary>
    float targetPos = 0;
    /// <summary>
    /// 当前索引位置
    /// </summary>
    float nowIndex = 0;

    public GameObject UIItem;

    private int count;
    void Awake()
    {
        sRect = GetComponent<ScrollRect>();
        ListPageValueInit();
    }


    /// <summary>
    /// 初始化UIItem
    /// </summary>
    void Start()
    {
        for (int i = 0; i < count ; i++)
        {
            GameObject go = Instantiate(UIItem);
             += +i;
            (true);
             = ;
             = ;
            <UIItem>().Show("物品" + i);
        }
    }
    /// <summary>
    /// 每页比例
    /// </summary>
    private void ListPageValueInit()
    {
        pageIndex = (count / pageCount) - 1;
        if(count !=0)
        {
            for (int i = 1; i < pageIndex ; i++)
            {
                ((i / pageIndex));
            }
        }
    }

    void Update()
    {
        if(!isDrag )
        {
             = (, targetPos, );
        }
    }


    /// <summary>
    /// 开始拖拽
    /// </summary>
    /// <param name="eventData"></param>
    public void OnBeginDrag(PointerEventData eventData)
    {
        isDrag = true;
    }
    /// <summary>
    /// 拖拽结束
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData)
    {
        isDrag = false;
        //获取拖动的值
        float  tempPos = ;
        var index = 0;
        //拖动的绝对值
        float offset = (listPageValue[index] - tempPos);

        for (int i = 0; i < listPageValue .Count ; i++)
        {
            float temp = (tempPos - listPageValue[i]);
            if(temp <offset )
            {
                index = i;
                offset = temp;
            }
        }

        targetPos = listPageValue[index];
        nowIndex = index;
    }

    #region 如果需要分页,此处为左右分页代码,现有功能不需要,所以注释掉了
    //public void BtnLeftGo()
    //{
    //    nowindex = (nowindex - 1, 0, pageIndex);
    //    targetPos = listPageValue[Convert.ToInt32(nowindex)];
    //}

    //public void BtnRightGo()
    //{
    //    nowindex = (nowindex + 1, 0, pageIndex);
    //    targetPos = listPageValue[Convert.ToInt32(nowindex)];

    //}
    #endregion
}

原文: 点击打开链接