Unity3d学习记录之背包系统(三)

最后将实现拖拽功能,但经过我的测试,发现存在一个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);
        }
    }

做的相当粗糙,但只用于学习记录。

生命不息,学习不止。

猜你喜欢

转载自blog.csdn.net/leanerU/article/details/82762253