unity UGUI 实现一个拖拽

一个简单实现拖拽 具体哪里用到还没有想好 背包里拖拽一个图片时可能会用到吧 

写的很low 要是各位有别的更好的方法可以留言互相学习一下 qq1902649397

废话不多说 直接上脚本吧  把脚本复制走 按照下面的图添加脚本就行

/***
 * UGUI 实现一个拖拽
 * 继承接口 IBeginDragHandler, IDragHandler, IEndDragHandler
 * 这个脚本需要挂到一个底格上 比如背包的底格
 * 
*/
using UnityEngine;
using UnityEngine.EventSystems;

public class DragTest : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public int Id;//记录id
    private DragImage dragImage = null;

    //初始化时调用
    public void InitDragTest(int id)
    {
        Id = id;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("Begin---");
        if (dragImage == null)
        {
            dragImage = CreateDragImage();
            dragImage.transform.SetParent(this.transform.root);
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log("ing...---");
        if (dragImage != null)
        {
            SetDraggedPosition(eventData);
        }
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("End---");
        if (dragImage != null)
        {
            if (eventData.pointerEnter.tag == "Grid")
            {
                //当拖到格子上 一个设置了tag值为"Grid"的地方
                //处理一些方法 比如销毁之前的 在新地方生成对应的物体
            }
            Destroy(dragImage.gameObject);
            dragImage = null;
        }
    }

    private DragImage CreateDragImage()
    {
        //这里需要生成一个DragImage
        string path = "DragImage";
        GameObject go = GameObject.Instantiate(Resources.Load(path) as GameObject);
        DragImage item = go.GetComponent<DragImage>();
        item.transform.localPosition = Vector3.zero;
        item.transform.localScale = Vector3.one;
        item.InitDrageImage(Id);
        return item;
    }

    private void SetDraggedPosition(PointerEventData eventData)
    {
        var rt = dragImage.gameObject.GetComponent<RectTransform>();

扫描二维码关注公众号,回复: 17516254 查看本文章

        // transform the screen point to world point int rectangle
        Vector3 globalMousePos;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
        {
            rt.position = globalMousePos;
        }
    }
}

/***
*这是一个在拖拽时被生成的图片
*需要把这个做成一个预制放到可以动态加载的地方
 *我这里放到了 Resources 目录下 名为“DragImage”的预制
*/

using UnityEngine;
using UnityEngine.UI;

public class DragImage : MonoBehaviour
{

    public int Id;

    public Image TestImage;

    //初始化时调用
    public void InitDrageImage(int id)
    {
        Id = id;
        UpdateDrageImageInfo();
    }

    private void UpdateDrageImageInfo()
    {
        //可以根据id找个一个图片赋值给TestImage
        //TestImage.sprite = 
    }
}

脚本挂载情况:Canvas/DragSubgrid就是一个图片   预制直接放到了Resources 下

效果图:

猜你喜欢

转载自blog.csdn.net/unity_http/article/details/85172357