整理了下以前写的

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5.  
  6. [RequireComponent(typeof(CanvasGroup))]
  7. public class ItemDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
  8. {
  9. private CanvasGroup canvasGroup;
  10. private Transform originalGrid;//拖出的格子
  11. public GameObject bagFrame;//拖出格子的父级
  12. Vector2 originGridSize;//原始大小
  13.  
  14. // Start is called before the first frame update
  15. void Start()
  16. {
  17. originGridSize = (transform as RectTransform).sizeDelta;
  18. canvasGroup = GetComponent<CanvasGroup>();
  19. }
  20.  
  21. public void OnBeginDrag(PointerEventData eventData)
  22. {
  23. //让eventTrigger无法检测到物体,让他去检测物体后面的格子
  24. canvasGroup.blocksRaycasts = false;
  25. originalGrid = gameObject.transform.parent;
  26. gameObject.transform.SetAsLastSibling();//设置ui最上层
  27. }
  28.  
  29. public void OnDrag(PointerEventData eventData)
  30. {
  31. //把物体设置到背景上的字节点上,是为了防止格子挡住物品
  32. transform.SetParent(bagFrame.transform);
  33. //跟随鼠标移动
  34. transform.position = Input.mousePosition;
  35. }
  36.  
  37. public void OnEndDrag(PointerEventData eventData)
  38. {
  39. //结束拖拽时,鼠标所碰撞的点的物品
  40. GameObject curEnter = eventData.pointerEnter;
  41. //满足条件,正确地放入格子里面
  42. if (curEnter != null && curEnter.tag == "bagGrid")
  43. {
  44. //设置格子的父节点
  45. transform.SetParent(curEnter.transform, false);
  46. //设置预制物的位置
  47. (transform as RectTransform).localPosition = Vector3.zero;
  48. (transform as RectTransform).localRotation = Quaternion.identity;
  49. (transform as RectTransform).localScale = Vector3.one;
  50. //设置成原来的大小
  51. (transform as RectTransform).sizeDelta = originGridSize;
  52. }
  53. //没有满足条件
  54. else
  55. {
  56. //设置格子的父节点
  57. transform.SetParent(originalGrid.transform);
  58. //设置预制物的位置
  59. (transform as RectTransform).localPosition = Vector3.zero;
  60. (transform as RectTransform).localRotation = Quaternion.identity;
  61. (transform as RectTransform).localScale = Vector3.one;
  62. //设置成原来的大小
  63. (transform as RectTransform).sizeDelta = originGridSize;
  64. print("没有满足条件");
  65. }
  66.  
  67. //eventTrigger可以检测到物体
  68. canvasGroup.blocksRaycasts = true;
  69. }
  70.  
  71. //点击
  72. public void OnPointerClick(PointerEventData eventData)
  73. {
  74. print("点击");
  75. }
  76.  
  77. //鼠标进入
  78. public void OnPointerEnter(PointerEventData eventData)
  79. {
  80. print("进入");
  81. }
  82.  
  83. //鼠标退出
  84. public void OnPointerExit(PointerEventData eventData)
  85. {
  86. print("退出");
  87. }
  88. }

ugui拖拽的更多相关文章

  1. 使用UGUI实现拖拽功能(拼图小游戏)

    实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragH ...

  2. Unity3D UGUI窗口拖拽

    在开发UGUI时 我们时常需要做一个窗口拖拽的功能 先上代码 using UnityEngine; using UnityEngine.EventSystems; public class DragW ...

  3. Unity UGUI 实现简单拖拽功能

    说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...

  4. 使用NGUI实现拖拽功能(拼图小游戏)

    上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现 实现原理 NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的 ...

  5. Unity输出PC端(Windows) 拖拽文件到app中

    需求:给策划们写一个PC端(Window)的Excel导表工具.本来用OpenFile打开FileExplorerDialog后让他们自己选择想要添加的Excel文件就行了,结果有个需求是希望能拖拽E ...

  6. 在屏幕拖拽3D物体移动

    3D物体的拖拽不同于2D的.因为3D物体有x,y,z当然.实际拖拽还是在XZ平面.只是多了几个转换 using UnityEngine; using System.Collections; publi ...

  7. NGUI拖拽简介

    挂上UIDragDropItem就可以实现拖拽,按钮监听Drop消息即可实现对拖放的监听. UIDragDropItem有一个Clone On Drag选项,勾上可以克隆,但会被ScrollView遮 ...

  8. Unity实现放大缩小以及相机位置平移实现拖拽效果

    放大缩小功能是游戏开发中用到的功能,今天就来讲一下Unity中放大缩小怎么实现. 1.IDragHandler, IBeginDragHandler, IEndDragHandler这三个接口是Uni ...

  9. JavaScript动画-拖拽改变元素大小

    ▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...

随机推荐

  1. java数据结构03

    1.求二叉树的深度 https://www.cnblogs.com/xudong-bupt/p/4036190.html class TreeNode { char val; TreeNode lef ...

  2. vs开发之工程属性

    1.建立工程 最好使用自己创建工程 然后把代码移过去 2.不要使用别人建立的工程直接导入(差异比较大的话),后面32位 64位 配置属性 可能造成冲突 3.冲突了 还需要重新做 上面 1

  3. UILabel的行间距,字间距处理

    啥都不说了,直接上代码,做了一个Category #import <UIKit/UIKit.h> @interface UILabel (ChangeLineSpaceAndWordSpa ...

  4. 【NOIP2016提高A组模拟9.9】总结

    第一题,题面很不错,正解是分治,不过用ljj水法也可以轻松的所过去. 第二题,本来以为是个有向无环图, 结果搞了半天才发现,事实并不是这样的,于是暂时弃疗, 接着在最后的40分中,某人大喊:哦原来是t ...

  5. 【NOIP2016提高A组模拟9.9】爬山

    题目 国家一级爬山运动员h10今天获得了一张有着密密麻麻标记的地图,在好奇心的驱使下,他又踏上了去爬山的路. 对于爬山,h10有一个原则,那就是不走回头路,于是他把地图上的所有边都标记成了有向边.他决 ...

  6. SQL limit(分页)

    1.limit使用 limit参数,第一个参数:从哪儿开始查:第二个参数:查几条 i : 为查询结果的索引值(默认从0开始): n : 为查询结果返回的数量  -- 从3开始 取 3 条 SELECT ...

  7. @JsonView注解指定返回的model类中显示的字段

    1.User类 package com.imooc.model; import com.fasterxml.jackson.annotation.JsonView; /** * @author oy ...

  8. PHP基础教程 php 网络上关于设计模式一些总结

    1.单例模式 单例模式顾名思义,就是只有一个实例.作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的要点有三个: 一是某个类只能有一个实例; 二 ...

  9. html br标签 语法

    html br标签 语法 br标签什么意思? 作用:插入一个简单的换行符.广州大理石机械构件 说明:<br> 标签是空标签(意味着它没有结束标签,因此这是错误的:<br>< ...

  10. css使用2

    一.盒子模型 盒子模型 margin:用来调节盒子与盒子之间的距离(标签与标签之间距离) border:盒子的包装厚度(边框) padding:内部物体与盒子之间距离(文本与边框之间的距离) cont ...