实现方式

1、引入UGUI自带的事件系统  UnityEngine.EventSystems

2、为我们的类添加接口  IBeginDragHandler, IDragHandler, IEndDragHandler

1 usingUnityEngine;2 usingSystem.Collections;3 usingUnityEngine.EventSystems;4

5 public classDragOnPic : MonoBehaviour,IBeginDragHandler, IDragHandler, IEndDragHandler {6

7

8 public voidOnBeginDrag (PointerEventData eventData)9 {10 throw newSystem.NotImplementedException ();11 }12

13

14 voidIDragHandler.OnDrag (PointerEventData eventData)15 {16 throw newSystem.NotImplementedException ();17 }18

19

20 public voidOnEndDrag (PointerEventData eventData)21 {22 throw newSystem.NotImplementedException ();23 }24

25 }

拼图游戏实例

1、准备一张拼图要用到的图片素材,并拖入Unity中

2、图片的TextureType选为Sprite(2D and UI), 点击Apply

3、将SpriteMode改为Multiple,点击SpriteEditor,在弹出的窗口中点Slice,Type为Grid,我这张图片分辨率是500x500的,拆分为16份,所以我的PixelSize是125x125,最终结果如下图:

4、添加一个Panel作为背景,为Panel添加GridLayoutGroup组件,具体设置如下,添加脚本ImageCreater用于生成图片

5、为Panel添加一个Image作为我们拼图的格子的背景,名字改为Cell,在这个Cell上再添加一个Image作为图片的载体,并将它的Tag设置为Cell,为Image添加拖拽脚本DragOnPic,将Cell拖成预制体备用

6、新建一个GameManager类用于实现随机生成图片的功能

1 public classGameManager {2

3 ///

4 ///Randoms the array.5 ///

6 static public voidRandomArray(Sprite[] sprites)7 {8 for (int i = 0; i < sprites.Length; i++) {9 //随机抽取数字中的一个位置,并将这张图片与第i张图片交换.

10 int index =Random.Range(i, sprites.Length);11 Sprite temp =sprites[i];12 sprites[i] =sprites[index];13 sprites[index] =temp;14 }15 }16 }

7、在ImageCreater中写入生产图片的方法

1 usingUnityEngine;2 usingSystem.Collections;3 usingUnityEngine.UI;4

5 public classImageCreater : MonoBehaviour {6

7 public staticImageCreater _instance;8

9 //存储裁剪好图片的数组.

10 publicSprite[] sprites;11

12 //格子的预设体.

13 publicGameObject cellPrefab;14

15 voidStart () {16 _instance = this;17 CreateImages();18 }19

20 private voidCreateImages()21 {22 //将图片数组随机排列.

23 GameManager.RandomArray(sprites);24

25 //生产图片.

26 for (int i = 0; i < sprites.Length; i++) {27 //通过预设体生成图片.

28 GameObject cell =(GameObject)Instantiate(cellPrefab);29

30 //设置cell的名字方便检测是否完成拼图.

31 cell.name =i.ToString();32

33 //获取cell的子物体.

34 Transform image = cell.transform.GetChild(0);35

36 //设置显示的图片.

37 image.GetComponent().sprite =sprites[i];38

39 //设置子物体的名称,方便检测是否完成拼图.

40 int tempIndex = sprites[i].name.LastIndexOf('_');41 image.name = sprites[i].name.Substring(tempIndex + 1);42

43 //将Cell设置为Panel的子物体.

44 cell.transform.SetParent(this.transform);45

46 //初始化大小.

47 cell.transform.localScale =Vector3.one;48 }49 }50

51 }

8、到这里,拼图游戏已经基本成形,下面只需要实现每张图片的拖拽功能就OK了,下面是DragOnPic的代码

1 usingUnityEngine;2 usingSystem.Collections;3 usingUnityEngine.EventSystems;4

5 public classDragOnPic : MonoBehaviour,IBeginDragHandler, IDragHandler, IEndDragHandler {6

7 //记录下自己的父物体.

8 Transform myParent;9

10 //Panel,使拖拽是显示在最上方.

11 Transform tempParent;12

13 CanvasGroup cg;14 RectTransform rt;15

16 //记录鼠标位置.

17 Vector3 newPosition;18

19 voidAwake()20 {21 //添加CanvasGroup组件用于在拖拽是忽略自己,从而检测到被交换的图片.

22 cg = this.gameObject.AddComponent();23

24 rt = this.GetComponent();25

26 tempParent = GameObject.Find("Canvas").transform;27 }28

29

30

31

32 ///

33 ///Raises the begin drag event.34 ///

35 public voidOnBeginDrag (PointerEventData eventData)36 {37 //拖拽开始时记下自己的父物体.

38 myParent =transform.parent;39

40 //拖拽开始时禁用检测.

41 cg.blocksRaycasts = false;42

43 this.transform.SetParent(tempParent);44 }45

46 ///

47 ///Raises the drag event.48 ///

49 voidIDragHandler.OnDrag (PointerEventData eventData)50 {51 //推拽是图片跟随鼠标移动.

52 RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, Input.mousePosition, eventData.enterEventCamera, outnewPosition);53 transform.position =newPosition;54 }55

56 ///

57 ///Raises the end drag event.58 ///

59 public voidOnEndDrag (PointerEventData eventData)60 {61 //获取鼠标下面的物体.

62 GameObject target =eventData.pointerEnter;63

64 //如果能检测到物体.

65 if(target)66 {67 GameManager.SetParent(this.transform, target.transform, myParent);68 }69 else{70 this.transform.SetParent (myParent);71 this.transform.localPosition =Vector3.zero;72 }73

74 //拖拽结束时启用检测.

75 cg.blocksRaycasts = true;76

77 //检测是否完成拼图.

78 if(GameManager.CheckWin())79 {80 Debug.Log("Win!!!");81 }82

83 }84

85 }

在GameManager中加入设置父物体的方法及检测是否完成拼图的方法:

1 ///

2 ///Sets the parent.3 ///

4 static public voidSetParent(Transform mine, Transform target, Transform oldParent)5 {6 //如果检测到图片,则交换父物体并重置位置.

7 switch(target.tag)8 {9 case "Cell":10 mine.SetParent(target.parent);11 target.SetParent(oldParent);12 mine.localPosition =Vector3.zero;13 target.localPosition =Vector3.zero;14 break;15 default:16 mine.SetParent (oldParent);17 mine.localPosition =Vector3.zero;18 break;19 }20 }21

22 ///

23 ///Checks is win.24 ///

25 static public boolCheckWin()26 {27 for (int i = 0; i < ImageCreater._instance.transform.childCount; i++) {28 if(ImageCreater._instance.transform.GetChild(i).name != ImageCreater._instance.transform.GetChild (i).transform.GetChild(0).name)29 {30 return false;31 }32 }33 return true;34 }

到这里,拼图的基本功能就算是全部完成了

java基础,鼠标拖动拼图_使用UGUI实现拖拽功能(拼图小游戏)相关推荐

  1. vue 实现文本的拖拽_基于Vue实现拖拽功能

    本文实例为大家分享了Vue实现拖拽功能的具体代码,供大家参考,具体内容如下 效果图: HTML代码: 位置 x:{{val.x}} y:{{val.y}} //注意这里要通过指令绑定函数将当前元素的位 ...

  2. java swing 控件拖动_java swing中实现拖拽功能示例

    java实现拖拽示例 Swing中实现拖拽功能,代码很简单,都有注释,自己看,运行效果如下图: package com; import java.awt.*;import java.awt.datat ...

  3. Atitit。DD dragdrop拖拽功能c#.net java swing的对比与实现总结

    Atitit.D&D drag&drop拖拽功能c#.net java swing的对比与实现总结 1. 实现一个D&D操作一般包括三个步骤: 1 2. .net黑头的拖曳机制 ...

  4. js实现鼠标拖拽功能基本思路

    如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒. onmousedown:鼠标按下事件 onmousemove:鼠标移动事件 onmouseup:鼠标抬起事件 拖拽的基本原 ...

  5. Vue2 _ 实现拖拽功能

    老项目重构,其中有一些拖拽功能,不过用的是两个开源 JS 拖拽文件实现的效果,版本太老了,所以需要换代了,然后就查阅了能够用 Vue 来简单快速实现拖拽的功能实现方法 : 目录 一.HTML 拖放 二 ...

  6. js分隔条实现拖拽功能(支持左右拖动)

    这次记录就不贴代码了,只是记录一下原理和思路,因为代码封装的太严格,所以不好拿出来. lz的页面是左右各一个分隔条实现拖拽的,左边是框架自带一个功能没问题,右边是lz模仿做的,结果样子是做出来了,就是 ...

  7. python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)

    这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...

  8. java 拖拽生成_JAVA UI 拖拽功能

    java GUI拖拽功能是很实用也相对高级一些的功能. 有一小部分的GUI控件支持 他们有dragEnabled属性.这些JComponent包括: javax.swing.JColorChooser ...

  9. css元素可拖动,使用css-transform实现更好的拖拽功能

    拖拽功能是目前网页上一种非常常见的功能,例如"登录弹窗"的拖拽.本文将使用transform来实现这一功能. 一.拖拽的用户行为分析与原理解析 二.代码实现 三.总结 本文所涉及的 ...

  10. swift 拖动按钮_Swift下使用UICollectionView 实现长按拖拽功能

    导读 简单用Swift写了一个collectionview的拖拽点击排序效果; 拖拽排序是新闻类的App可以说是必有的交互设计,如今日头条,网易新闻等. 效果 主要代码 手势长按移动 1.给Colle ...

最新文章

  1. 和12岁小同志搞创客开发:手撕代码,做一款遥控灯
  2. 看完这些、你能体会到半导体与电路集成的伟大了吗?
  3. Python -- Scrapy 命令行工具(command line tools)
  4. PetShop4,错误提示:System.Web.Security.SqlMembershipProvider”要求一个与架构版本“1”兼容的数据...
  5. The Road to SDN: An Intellectual History of Programmable Networks
  6. 【Linux】一步一步学Linux——touch命令(33)
  7. 在ListView控件中绘底图
  8. 乔布斯18岁求职信拍卖价22.24万美元,值吗?
  9. GitHub 又又又挂了?
  10. 双十一淘宝、京东服务器瘫痪大揭秘 感悟
  11. php调用trait方法,PHP Laravel中的Trait使用方法
  12. 《.Net 软件设计新思维》作者讲述成书的背后故事
  13. vscode 字体颜色变得花里胡哨的
  14. 电子板书:Word,PPT,PDF手写批注很轻松
  15. SDN为何一直热度不减?一文解析SDN的前世今生
  16. GetFlashInfo V7.5_u盘芯片检测工具
  17. polkit启动失败_Linux MySQL 常见无法启动或启动异常的解决方案(上)
  18. voip 音频采集时间_树莓派3 音频配置及其应用场景(录音、VoIP 电话等)(锁定重发)...
  19. easyui treegrid php,Easyui在treegrid添加控件实例教程
  20. rap技术原理_那些你可能没有听到的技术特色Rap

热门文章

  1. T9智能输入法实现原理和步骤
  2. php 调用 百度句法分析,【原创源码】百度新版翻译API调用使用范例
  3. ftp下载工具 免费,3款绝对让你喜欢的免费ftp下载工具
  4. 网盘背后的秘密(稍作修改)
  5. 滚动加载分辨率scrollTop小数问题
  6. 2020年1024程序员节,成为CSDN博客专家
  7. java 方法详解(有参无参,有返回值无返回值) 局部变量
  8. 话费充值api接口 手机话费充值功能接入
  9. 从MSDN我告诉你下载镜像
  10. 运行IE显示“该文件没有程序与之关联来执行该操作”