最后将实现拖拽功能,但经过我的测试,发现存在一个Bug。通过查找各种文档,以及模拟修改了好几次代码,暂时未能解决。但通过官方的一个UGUI例子中的拖拽icon让我有了启发,也明白了问题所在。
Bug是因为,当如果拖拽的是空格子,因为没有对空格子做处理,将会得到一个null值,就会覆盖了背包物品中的物品文本。而通过官方例子中的代码可以知道,它所处理的就是物品本身,所以当没有物品的时候,就不会实现拖拽的功能。所以这或许是一种解决方法,将对格子的操作修改成对物品文本。暂时未能解决,先将原视频拖拽过程post。
在GridUI中添加拖拽的三个接口 IBeginDragHandler, IDragHandler, IEndDragHandler
public class GridUI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler,
IBeginDragHandler, IDragHandler, IEndDragHandler
{
public static Action<Transform> OnleftBeginDrag;
public static Action<Transform, Transform> OnleftEndDrag;
public static Action<Transform> OnleftDrag;
public void OnBeginDrag(PointerEventData eventData)
{
if (eventData.button == PointerEventData.InputButton.Left)
if (OnleftBeginDrag != null)
{
OnleftBeginDrag(transform);
}
}
public void OnDrag(PointerEventData eventData)
{
}
public void OnEndDrag(PointerEventData eventData)
{
if (eventData.button == PointerEventData.InputButton.Left)
{
if (eventData.pointerEnter == null)
OnleftEndDrag(transform, null);
else
OnleftEndDrag(transform, eventData.pointerEnter.transform);
}
}
}
在KnapscakUI中调用
private void Awake()
{
_instace = this;
LoadData();
GridUI.OnEnter += GridUI_OnEnter;
GridUI.OnExit += GridUI_OnExit;
GridUI .OnleftBeginDrag += GridUI_OnleftBeginDrag;
GridUI.OnleftEndDrag += GridUI_OnleftEndDrag;
}
private void GridUI_OnleftEndDrag(Transform preTransform,Transform entertTransform)
{
isDrag = false;
DragItemUI.HideText();
if (entertTransform == null)//如果拖动的箭头下,物体为空,则表示扔掉
{
ItemModel.DeleteItem(preTransform.name);
}
else if (entertTransform.transform.tag == "Grid")
{
if (entertTransform.childCount == 0)//如果拖动的箭头下,物体不存在子物体,则放入
{
Item item = ItemModel.GetItem(preTransform.name);//若原位置的信息被删除,则item为null
ItemModel.DeleteItem(preTransform.name);
this.CreateItem(item, entertTransform);
}
else//存在子物体,则交换
{
Destroy(entertTransform.GetChild(0).gameObject);
Item preGridItem = ItemModel.GetItem(preTransform.name);
Item entertGridItem = ItemModel.GetItem(entertTransform.name);
this.CreateItem(preGridItem, entertTransform);
this.CreateItem(entertGridItem, preTransform);
}
}
else//如果拖动的箭头下,存在物体,但其标签不为Grid,则返回原来的物品格子
{
Item item = ItemModel.GetItem(preTransform.name);
this.CreateItem(item, preTransform);
}
}
private void GridUI_OnleftBeginDrag(Transform transform)
{
if (transform.childCount == 0)
return;
else
{
Item item = ItemModel.GetItem(transform.name);
DragItemUI.UpdateText(item.Name);
isDrag = true;
Destroy(transform.GetChild(0).gameObject);
}
}
之后在Update里面添加拖拽的显示
private void Update()
{
Vector2 postion;
RectTransformUtility.ScreenPointToLocalPointInRectangle(GameObject.Find("Canvas").transform
as RectTransform, Input.mousePosition, null, out postion);
if(isDrag)
{
DragItemUI.ShowText();
DragItemUI.SetLocalPosition(postion);
}
else if(isShow)
{
ToolipUI.ShowText();
ToolipUI.SetLocalPosition(postion);
}
}
做的相当粗糙,但只用于学习记录。
生命不息,学习不止。