背包逻辑
1. 开始拖拽:记住当前父物体
2. 拖拽中:将当前物体的射线检测关闭,将物体的位置等于鼠标位置,将物体的父物体设为当前深度值高的物体
3. 拖拽后:
①射线检测当前位置是否为空或者检测得到的tag不为bag或goods,为空则把物体的位置还原(位置和父物体);
②如果检测到的是背包bag,则把物体的位置设置为背包格子的位置,父物体设置为各子;
③如果检测到的是物品goods,交换两个物品
把物体的位置设为物品父物体的位置,父物体设为物品的父物体
把物品的位置设为原来物体的父物体位置(nowparent),父物体设为原来物体的父物体
代码
引用EventSystem(事件系统)
继承EventTrigger类,该类含有UGUI的回调方法
开始拖拽:
void OnBeginDrag(PointerEventData eventData)
所在接口IBeginDragHandler
拖拽中
void OnDrag(PointerEventData eventData)
所在接口 IDragHandler
拖拽后
void OnEndDrag(PointerEventData eventData)
所在接口 IEndDragHandler
eventData含有回调的信息
public class Bag : EventTrigger{
//物品最开始的父物体
public Transform nowParent;
//物品拖拽中的父物体
private Transform dragParent;
public string[] tags = new string[] { "bag", "goods" };
public override void OnPointerClick(PointerEventData eventData)
{
//射线碰撞点的信息
print(eventData.pointerCurrentRaycast);
}
public override void OnBeginDrag(PointerEventData eventData)
{
nowParent = transform.parent;
}
/// <summary>
/// 当拖拽时跟着鼠标移动
/// </summary>
/// <param name="eventData"></param>
public override void OnDrag(PointerEventData eventData)
{
//当前物体的位置跟随鼠标进行移动
transform.position = Input.mousePosition;
//拖拽中将物体的射击检测关闭 以便结束拖拽的时候可以去检测物体下方的物体
IsRayCastOn(false);
//将拖拽中的物体父物体改为深度值较高的空物体,以便我们在拖拽中可以看到他
transform.SetParent(dragParent);
}
/// <summary>
/// 当结束拖拽时将物品放到格子里(格子有物品时交换位置)
/// </summary>
/// <param name="eventData"></param>
public override void OnEndDrag(PointerEventData eventData)
{
GameObject go = eventData.pointerCurrentRaycast.gameObject;
//类似于Array.Find
//Array.Find(要查询的数组,查询的条件)
//for (int i = 0; i < tags.Length; i++)
//{
// if (go.tag == tags[i])
// {
// }
//}
//如果是别的UI或者go为空 让拖拽的物品回归原位
//go.tag!="bag"||go.tag!="goods"
if (go == null || Array.Find(tags, p => p == go.tag)==null)
{
SetPosAndParent(transform,nowParent);
return;
}
//射线检测我当前拖拽物品所到位置的物体标签
//射线怎么检测
// 当前射线碰撞事件UI的信息
// print(eventData.pointerCurrentRaycast);
//
//如果是格子 将拖拽的物品放到格子的位置,并且和格子成为父子物体的关系
if (go.tag == "bag")
{
transform.position = go.transform.position;
transform.SetParent(go.transform);
}
else if (go.tag == "goods")
{
//如果是格子当中有物品,那么交换两个物品位置
//将拖拽的物体放到当前格子中
SetPosAndParent(transform,go.transform.parent);
//将现在格子当中的物体移动到当前拖拽物体原来的位置
SetPosAndParent(go.transform,nowParent);
}
IsRayCastOn(true);
}
public void SetPosAndParent(Transform child, Transform parent)
{
child.position = parent.position;
child.SetParent(parent);
}
public void IsRayCastOn(bool flag)
{
GetComponent<Image>().raycastTarget = flag;
}
}