好的我们的交换来了 交换其实并不难 只需要使用System.Action传出事件然后在需要修改数据的地方接受事件,贴代码,这是一个通用的东西 你加到哪个玩意上面做他的脚本都能拖拽这个玩意
//这里是修改之后的拖拽脚本 各位官人我会仔细注释的 有错误请指正
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class JiaohuanComponent : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler//这里的接口你一个一个去输入然后按alt+enter就可以知道它是啥玩意了
{
//有机会再给大家讲解system action 有需要的也可以私信我 虽然我没有设置消息提醒emmm
public System.Action<object, bool> OnDragEvent = null;//拖动时事件返回true
public System.Action<object, bool> OnEndDragEvent = null;//拖动结束事件返回false 使用这个脚本时这两个bool用同一个bool接收
public System.Action<object, bool> OnPointerEnterEvent = null;//鼠标进入事件
public System.Action<object, bool> OnPointerExitEvent = null;//鼠标退出事件
[HideInInspector]
public Vector3 yuanshiweizhi;//移动前的位置,一开始未初始化就是全0
[HideInInspector]
public object m_aObject = null;//这里是存储数据的地方
public MaskableGraphic m_aGraphics;//这个是每一个图片啊文本啊什么的都会继承的类,我们要使用它来将RaycastTarget给取消掉,下面注释应该会有具体用法emmm
public void OnDrag(PointerEventData eventData)//拖拽时触发的事件
{
SetDraggedPosition(eventData);//调用函数使我们拖拽的图片跟随鼠标移动
if(m_aObject!=null)//这里为了安全
OnDragEvent?.Invoke(m_aObject, true);//这里将事件抛出去给需要修改数据的脚本
}
public void OnBeginDrag(PointerEventData eventData)//刚开始拖拽的瞬间触发的事件
{
yuanshiweizhi = transform.position;//保存初始位置
SetDraggedPosition(eventData);//让图片可以跟随鼠标了
transform.SetAsLastSibling();//这个方法会让当前的图片的图层在最上面,这样玩家的体验会好一点
m_aGraphics.raycastTarget = false;//这里就是上面的那个说的特殊的地方了,
//当我们把它设置成false的同时会让它接收不到鼠标的点击进入的各种事件,
//所以设成false的那一瞬间就会让他触发了鼠标退出图片的事件(这里需要注意
}
public void OnEndDrag(PointerEventData eventData)//拖拽结束的瞬间也就是鼠标不按的时候触发的事件
{
transform.position = yuanshiweizhi;//立刻让它的位置回到原来的位置,你也可以整个有速度的回到原来的位置,想整的话私信我 我给你开小灶(我看到了的话
if (m_aObject != null)
OnEndDragEvent?.Invoke(m_aObject, false);
m_aGraphics.raycastTarget = true;//结束拖拽了又给他设成true 他就又能接收鼠标的信息了
}
public void OnPointerEnter(PointerEventData eventData)//当鼠标移动到这个位置的瞬间触发这个事件
{
if (m_aObject != null)
OnPointerEnterEvent?.Invoke(m_aObject, true);
}
public void OnPointerExit(PointerEventData eventData)//当鼠标退出这个位置的瞬间触发这个事件
{
if (m_aObject != null)
OnPointerExitEvent?.Invoke(m_aObject, false);
}
private void SetDraggedPosition(PointerEventData eventData)
{
RectTransform rt = 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;// + new Vector3(0, 60, 0);这里是你也可以不用设置raycastTarget
}
}
}
//看完了这里的话你可以把设置raycastTarget 或者最后那里+60那句分别注释掉看看什么效果