Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件) Posted 2023-03-30 小小数媒成员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)相关的知识,希望对你有一定的参考价值。
目录
内置方法OnMouseDrag【对象含有Collider组件】
配对小游戏
Event Trigger组件
接口
窗口小案例
内置方法OnMouseDrag【对象含有Collider组件】
OnMOuseOver()检测鼠标是否进入到这个2D贴图
当鼠标进入或离开2D贴图,会相应的放大、缩小
private void OnMouseEnter ()
transform.localScale += Vector3.one * 0.1f;
private void OnMouseExit ()
transform.localScale -= Vector3.one * 0.1f;
经验:只会在2D场景贴图和3D场景中使用OnMouseDrag等内置方法
配对小游戏
private bool isFinished;//是否拖到了正确位置
[SerializeField] private Transform correctTrans;
private Vector2 startPos;
// Start is called before the first frame update
void Start()
startPos = transform.position;
//如果没有拖拽到正确位置,图片在松开鼠标的时候,回到一开始位置
private void OnMouseDrag()
if(isFinished==false)
//图片跟着鼠标一起移动
Vector2 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = new Vector2(cursorPos.x, cursorPos.y);
private void OnMouseUp()
//如果当前拖得图片和对应正确位置足够小,就让当前图片固定到正确位置,否则回到原来位置 if(Mathf.Abs(transform.position.x-correctTrans.position.x)<=0.5f&&Mathf.Abs(transform.position.y-correctTrans.position.y)<=0.5f)
transform.position = correctTrans.position;
isFinished = true;
else
transform.position = new Vector2(startPos.x, startPos.y);
调整Sorting Layer渲染层顺序
Event Trigger组件
Event Trigger—>Add New Event Type根据不同的事件类型实现不同的交互效果
private Vector3 startPos;
void Start()
startPos = transform.position;
public void DragMethod()
transform.position = Input.mousePosition;
//如果UI模式是ScreenSpace Overlay,可以直接将鼠标位置信息赋值给transform.position
public void EndDragMethod()
GameObject slotGo = GameObject.Find("Slot");
//在所有游戏对象中通过名字查找
float dist = Vector3.Distance(transform.position, slotGo.transform.position);
if (dist <= 100)
transform.position = slotGo.transform.position;
else
transform.position = startPos;
接口
引用 using UnityEngine.EventSystems 命名空间
接口中方法没有方法体的,接口的成员,也都是(隐式的)public公共类
使用这个接口必须将接口中未实现的方法加以实现
有关Drag的接口,BeginDrag,EndDrag,IDrag
BeginDrag和EndDrag要在有IDrag的基础上
public class Move : MonoBehaviour,IBeginDragHandler,IEndDragHandler,IDragHandler
private RectTransform rectTrans;
private CanvasGroup canvasGroup;
void Start ()
rectTrans = GetComponent<RectTransform>();
canvasGroup = GetComponent<CanvasGroup>();
public void OnDrag(PointerEventData eventData)
rectTrans.anchoredPosition += eventData.delta;
//获取这个UI图片相对于Anchor锚点的位置坐标信息
//eventData.delta自从上一次Update,用户拖着这个对象所移动的2D位置坐标信息
public void OnBeginDrag(PointerEventData eventData)
canvasGroup.blocksRaycasts = false;
canvasGroup.alpha = 0.5f;
public void OnEndDrag(PointerEventData eventData)
canvasGroup.blocksRaycasts = true;
canvasGroup.alpha = 1f;
表示在刚开始拖拽的整个过程中,鼠标不会在去把这个UI物体当作阻挡物,
保证拖拽物品到槽的上方时,鼠标能顺利的去忽略这个UI物体
Canvas Group组件 管理这一物体包括它的子物体的所有UI对象(透明度,可交互,是否遮挡等属性)
鼠标只有放在槽上方的时候松开,才能判断拖拽的物体在槽内还是槽外
,IDrapHander 在松开物品后被调用,若没有调用,槽被上一层所拖拽的UI对象所遮罩了,无法获取到鼠标何时松开Drop的操作
public class Slot : MonoBehaviour,IDropHandler
public void OnDrop(PointerEventData eventData)
eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;
eventData.pointerDrag 直接获取鼠标 当前拖拽的这个游戏对象
若鼠标和拖拽的点的位置偏离过大
,去检查Canvas画布中Scale数值是否为1
窗口小案例
通过接口实现针对不同的UI面板窗口,进行拖拽的功能,并且点击的窗口会显示在UI的最高层
public class Anli : MonoBehaviour,IBeginDragHandler,IDragHandler
public RectTransform panelRectTrans;
public void OnBeginDrag(PointerEventData eventData)
panelRectTrans.SetAsLastSibling();
//设置为同级最下方的位置
public void OnDrag(PointerEventData eventData)
panelRectTrans.anchoredPosition += eventData.delta;
【盘点】Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)_哔哩哔哩_bilibili
【仅当学习笔记,若有冒犯,必删】
关于Unity中UGUI 图片实现拖拽功能
应用方法:将下面脚本挂载在需要拖拽功能的UI图片上即可
两种拖拽选择:A.中心拖拽(图片中心跟随鼠标位置)m_isPrecision为false;
B.精准拖拽(图片被鼠标点击的位置跟随鼠标位置)m_isPrecision为true;
1 /* ************************************************
2 * 项目名称:UGUI通用
3 * 脚本创建人:魔卡
4 * 脚本创建时间:2017.12.14
5 * 脚本功能:UI图片拖拽功能(将脚本挂载在需要拖放的图片上)
6 * ********************************************** */
7 using UnityEngine;
8 using System.Collections;
9 using UnityEngine.EventSystems;
10
11 // UI图片拖拽功能类
12 public class UIDragByMocha : MonoBehaviour,IBeginDragHandler, IDragHandler, IEndDragHandler
13 {
14 [Header( " 是否精准拖拽 " )]
15 public bool m_isPrecision;
16
17 // 存储图片中心点与鼠标点击点的偏移量
18 private Vector3 m_offset;
19
20 // 存储当前拖拽图片的RectTransform组件
21 private RectTransform m_rt;
22 void Start()
23 {
24 // 初始化
25 m_rt= gameObject.GetComponent<RectTransform>();
26 }
27
28 // 开始拖拽触发
29 public void OnBeginDrag(PointerEventData eventData)
30 {
31 // 如果精确拖拽则进行计算偏移量操作
32 if (m_isPrecision)
33 {
34 // 存储点击时的鼠标坐标
35 Vector3 tWorldPos;
36 // UI屏幕坐标转换为世界坐标
37 RectTransformUtility.ScreenPointToWorldPointInRectangle(m_rt, eventData.position, eventData.pressEventCamera, out tWorldPos);
38 // 计算偏移量
39 m_offset = transform.position - tWorldPos;
40 }
41 // 否则,默认偏移量为0
42 else
43 {
44 m_offset = Vector3.zero;
45 }
46
47 SetDraggedPosition(eventData);
48 }
49
50 // 拖拽过程中触发
51 public void OnDrag(PointerEventData eventData)
52 {
53 SetDraggedPosition(eventData);
54 }
55
56 // 结束拖拽触发
57 public void OnEndDrag(PointerEventData eventData)
58 {
59 SetDraggedPosition(eventData);
60 }
61
62 /// <summary>
63 /// 设置图片位置方法
64 /// </summary>
65 /// <param name="eventData"></param>
66 private void SetDraggedPosition(PointerEventData eventData)
67 {
68 // 存储当前鼠标所在位置
69 Vector3 globalMousePos;
70 // UI屏幕坐标转换为世界坐标
71 if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
72 {
73 // 设置位置及偏移量
74 m_rt.position = globalMousePos + m_offset;
75 }
76 }
77 }
以上是关于Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)的主要内容,如果未能解决你的问题,请参考以下文章
线程间通信常用的三种方法
unity基础交互入门(按钮点击事件的三种方法)
Unity中获取物体的尺寸(size)的三种方法
Unity鼠标带动物体运动的三种方法
100个 Unity实用技能| Unity读取本地文件(Json,txt等)的三种方法示例
100个 Unity实用技能| Unity读取本地文件(Json,txt等)的三种方法示例