实现背包拖拽
1.添加接口:IDragHandler, IEndDragHandler, IBeginDragHandler, ICanvasRaycastFilter
分别为拖拽,结束拖拽,开始拖拽,射线检测
2.SetParent()设置父子关系
public void SetParent(Transform parent);
public void SetParent(Transform parent, bool worldPositionStays);
官方解释:如果为真,那么就保持之前的位置、旋转量、缩放值。而为否的时候则保持局部坐标的位置、旋转、缩放。
3.Vector3
back 用于编写 Vector3(0, 0, -1) 的简便方法。
down 用于编写 Vector3(0, -1, 0) 的简便方法。
forward 用于编写 Vector3(0, 0, 1) 的简便方法。
left 用于编写 Vector3(-1, 0, 0) 的简便方法。
negativeInfinity 用于编写 Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity) 的简便方法。
one 用于编写 Vector3(1, 1, 1) 的简便方法。
positiveInfinity 用于编写 Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity) 的简便方法。
right 用于编写 Vector3(1, 0, 0) 的简便方法。
up 用于编写 Vector3(0, 1, 0) 的简便方法。
zero 用于编写 Vector3(0, 0, 0) 的简便方法。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;//事件
public class MyDrag : MonoBehaviour, IDragHandler, IEndDragHandler, IBeginDragHandler, ICanvasRaycastFilter
{ //接口:拖拽,结束拖拽,开始拖拽,Canvas射线检测
bool isbool = true;
Transform start;
Transform canvas;
public void Awake()
{
canvas = GameObject.Find("Canvas").transform;//找到Canvas的位置
}
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
{
return isbool;//返回布尔值
}
public void OnBeginDrag(PointerEventData eventData)//拖拽开始
{
start = transform.parent;//记录初始位置
transform.SetParent(canvas);//设置父子关系
isbool = false;
}
public void OnDrag(PointerEventData eventData)//拖拽时
{
transform.position = Input.mousePosition;//将鼠标的位置赋给被拖拽的物体的位置
}
public void OnEndDrag(PointerEventData eventData)//拖拽结束
{
GameObject go = eventData.pointerCurrentRaycast.gameObject;//进行射线检测
if (go)
{
if (go.tag == "Cell")//如果是空的背包格子,改变位置
{
ChangeAngPosition(transform, go.transform);//调用函数,改变位置
}
else if(go.tag=="Item")//如果背包格子不为空,交换两个物体的位置
{
ChangeAngPosition(transform, go.transform.parent);//调用函数,交换位置
ChangeAngPosition(go.transform, start);
}
else //如果在背包之外
{
ChangeAngPosition(transform, start);//如果拖出背包外,则回到原位置
}
isbool = true;
}
}
void ChangeAngPosition(Transform child,Transform parent)//改变位置
{
child.SetParent(parent);//设置父子关系
child.position = parent.position;//写成了child.position
child.localScale = Vector3.one;//Vector3.one写成了Vector.zero
}
}