练习目标

练习UI的拖放操作

一、相关组件

  • EventTrigger
  • Canvas Group
  • ScrollRect
  • Mask
  • Scrollbar

二、拖放练习

1、创建一个Panel,命名Panel1,添加EventTrigger组件,稍稍改一下Panel的颜色

2、Panel1下创建一个Text,输入”Test Draggable\n       object”,设置字体颜色及Text超出处理

DragDropScene.cs代码

3、在 uGUI练习(五) Draggable Object一文中,已经大概了解uGUI的EventSystem,需要继承三个事件接口,接下来我们创建一个DragDropScene.cs,代码如下

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems; public class DragDropScene : MonoBehaviour,IDragHandler,IPointerDownHandler,IPointerUpHandler
{
public void OnDrag(PointerEventData eventData)
{
GetComponent<RectTransform>().pivot.Set(0,0);
transform.position=Input.mousePosition;
} public void OnPointerDown(PointerEventData eventData)
{
transform.localScale=new Vector3(0.7f,0.7f,0.7f);
} public void OnPointerUp(PointerEventData eventData)
{
transform.localScale=new Vector3(1f,1f,1f);
}
}

4、上面的代码就是 按下,拖动,抬起 这三个事件的处理.把这个脚本绑定在Panel1,按Ctrl+P 运行游戏,在Game视图我们就可以拖动Panel1了.

5、选中创建好的Panel1,按Ctrl+D Copy 几个Panel,更改成不同的颜色,如下图所示:

6、在上面的步骤中,我们创建了几个Panel1,并且给它们都绑定了DragDropScene.cs,但还没有实现Drop的事件;

接下来,我们创建一个Panel,命名DropPanel,用来作停放Panel的容器

7、在DropPanel下创建一个Panel,命名Grid,并给它添加Grid Layout Group和Canvas Group组件

8、为了让我们知道Drop是可以停放的,我们在Grid下创建两个Panel,同样的给它们绑定DragDropScene.cs,如下图:

9、接下来就是把Panel,拖动并停放在DropPanel下,如下图所示

修改事件代码

10、打开DragDropScene.cs脚本,添加一行,并修改OnPointerDown(),OnPointUp( )

[SerializeField] GameObject grid=null,rootCanvas=null;
public void OnPointerDown(PointerEventData eventData)
{
transform.localScale=new Vector3(0.7f,0.7f,0.7f);
transform.parent=rootCanvas.transform;
}


public void OnPointerUp(PointerEventData eventData)
{
transform.localScale=new Vector3(1f,1f,1f); RaycastHit2D hit = Physics2D.Raycast(Input.mousePosition,-Vector2.up);
if (hit.collider != null) {
//如果射线检测到的gameobject为grid,就把当前Panel放在grid节点下
if(hit.collider.gameObject.name=="Grid")
transform.parent=grid.transform;
}
}

上面的代码,当鼠标抬起时,如果是在Grid的上方,就把当前Panel设置在Grid下,鼠标按下时,设置当前Panel的Parent为rootCanvas11、为DragDropScene设置参数值:

12、到这一步,我们就可以拖动Panel放到Grid下了,为了避免Grid下的Panel超出,在uGUI练习(六) ScrollView一文中我们使用了SrollRect和Mask。所以现在我们就给DropPanel添加上这两个组件,当然最后也可以给DropPanel添加Scrollbar

组件代码

拖拽组件,修改部分代码,更符合实际项目中使用

https://github.com/zhaoqingqing/UGUIDemo 仓库中搜索:DragDropTrigger

三、CanvasGroup

CanvasGroup是一个容器,可以用来改变child的Alpha,Raycasting,Enable state.

可以用来改变child元素的state.

比如:在一段时间内window变淡,在同一个group里的child元素的alpha值也会受到影响,alpha 值=任何嵌套的group相乘。乘以canvas元素的alpha值.

CanvasGroup 可以配置为不遮挡 射线(在这个group里的任何物件都不用为图形射线考虑) ,并且元素是否相互作用.

四、EventTrigger

从事件系统接收事件并调用每一个已注册的事件.

在每一个特殊的函数中,都可以使用EventTrigger,你可以在一个事件上注册多个函数,当EventTrigger接收事件时,将按提供的顺序调用.

注意:将EventTrigger组件绑定在任何Gameobject上之后,它将拦截一切事件,并在这个对象上没有冒泡事件出现.

五、Drag && Drop 效果

uGUI练习(七) Drag And Drop的更多相关文章

  1. HTML5 之拖放(drag与drop)

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...

  2. 通过HTML5的Drag and Drop生成拓扑图片Base64信息

    HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...

  3. 基于HTML5的Drag and Drop生成图片Base64信息

    HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag ...

  4. Android 用户界面---拖放(Drag and Drop)(三)

      设计拖放操作 本节主要内容如下: 1.  如何开始拖拽: 2.  在拖拽期间如何响应事件: 3.  如何响应落下事件: 4.  如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...

  5. Android 用户界面---拖放(Drag and Drop)(二)

      拖拽事件监听器和回调方法 View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事 ...

  6. Android 用户界面---拖放(Drag and Drop)(一)

    用Android的拖放框架,能够允许用户使用图形化的拖放手势,把数据从当前布局中的一个View对象中移到另一个View对象中.这个框架包括:拖拽事件类.拖拽监听器.以及辅助的方法和类. 尽管这个框架主 ...

  7. 20 Best Drag and Drop jQuery Plugins--reference

    reference from:http://dizyne.net/20-best-drag-drop-jquery-plugins/ jQuery has done a great job repla ...

  8. [Javascript + rxjs] Simple drag and drop with Observables

    Armed with the map and concatAll functions, we can create fairly complex interactions in a simple wa ...

  9. HTML 5 drag and drop 简介

    Html 5 drag and drop 简介 HTML5提供了专门拖拽和拖放的API draggable属性 启用拖拽 draggable属性是否可被拖拽, 可选值: true, false, au ...

随机推荐

  1. 研究jdk关于TreeMap 红黑树算法实现

    因为TreeMap的实现方式是用红黑树这种数据结构进行存储的,所以呢我主要通过分析红黑树的实现在看待TreeMap,侧重点也在于如何实现红黑树,因为网上已经有非常都的关于红黑树的实现.我也看了些,但是 ...

  2. html alert 的三种方式

    html alert 一共有三种方式. 第一种是最简单的直接在js的函数里alert("要输出的内容"); 这种直接就是一个弹出框,显示要输出的内容. 第二种是带选择的弹出框,弹出 ...

  3. JS创建对象、继承原型、ES6中class继承

    面向对象编程:java中对象的两个基本概念:1.类:类是对象的模板,比如说Leader 这个是泛称领导,并不特指谁.2:实例:实例是根据类创建的对象,根据类Leader可以创建出很多实例:liyi,y ...

  4. 将内表通过TXT文本输出

    PARAMETERS: num TYPE i. TYPE-POOLS: truxs. "类型组 DATA:w_filename TYPE string. TYPES:BEGIN OF ty_ ...

  5. iOS 在制作framework时候对aggregate的配置

    # Sets the target folders and the final framework product.# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNA ...

  6. iOS 开发 - 改善APP的流畅度 (绘制股票行情)

    这几天做了一个查看股票行情的app. 完成之后,当k线比较多的时候,app 对于捏合.拖动手势的反应不太流畅, 主要原因是drawRect: 干的活太多, 竟然需要40ms+, fps 自然不高 最后 ...

  7. 关于tableView中tableHeaderView/tableFooterView/sectionHeader/sectionFooter/contentInset的理解

    其实每个人的理解有所不同,找到最有利于自己的理解方式即可.有人把Cell,tableHeaderView,tableFooterView,sectionHeader,sectionFooter这些属性 ...

  8. 阿里云ECS/Ubuntu下JDK、Tomcat、MySQL安装记录

    今天六一儿童节,然后... ... ... ... 然后就是父亲节呀孩子们!!! ———————————————————————割———————————————————————— 同事需要JDK.To ...

  9. mysql高可用之LVS + KEEPALIVE + MYSQL

    1.架构图 注意 (一)   Mysql需要把bind-address的配置去掉,否则无法实现虚拟ip访问 (二)   关闭所有linux防火墙:/sbin/iptables –F(可能没用) (三) ...

  10. linux修改open files数

    概要 linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够.这就需要修改ulimit和file-m ...