一个简单实现拖拽 具体哪里用到还没有想好 背包里拖拽一个图片时可能会用到吧
写的很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>();

// 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 下
效果图: