使用NGUI实现拖拽功能(拼图小游戏)
上一次用UGUI实现了拼图小游戏,这次,我们来用NGUI来实现
实现原理
NGUI中提供了拖拽的基类UIDragDropItem,所以我们要做的就是在要拖拽的图片上加一个继承于该类的脚本,并实现其中的方法即可
public class DragOnPic : UIDragDropItem {
protected override void OnDragDropStart ()
{
base.OnDragDropStart ();
}
protected override void OnDragDropRelease (GameObject surface)
{
base.OnDragDropRelease (surface);
}
}
拼图游戏实例
1、准备拼图素材,由于NGUI使用的Atlas为Texture,所以不能用UGUI中裁剪图片的方法,所以偷了一下懒,从网上找了一个小工具把图片裁剪了一下。。
2、给图片命名,为了最后检测简单一点,所以我这里统一命名为f-0~f-15,并制作Atlas
下面的基本操作步骤跟UGUI大同小异,所以我们这里搞一个不一样的方式,Unity中不做任何操作,只在摄像机上挂一个脚本ImageCreater来调用我们的代码
void Start () {
//调用UIManager中生产图片的方法.
UIManager.Instance.CreatPics();
}
新建一个UIManager类,下面是该类的内容:
1 public class UIManager {
2
3 //单例.
4 private static UIManager instance;
5 public static UIManager Instance{
6 get{
7 if(instance == null)
8 {
9 instance = new UIManager();
10 }
11 return instance;
12 }
13 }
14 private UIManager(){}
15
16 //根节点.
17 UIPanel panel;
18
19 public void CreatPics()
20 {
21 panel = NGUITools.CreateUI(false);
22
23 //添加Grid组件用于自动排列图片.
24 UIGrid grid = NGUITools.AddChild<UIGrid>(panel.gameObject);
25
26 //设置grid各个属性.
27 grid.arrangement = UIGrid.Arrangement.Horizontal;
28 grid.maxPerLine = 4;
29 grid.cellWidth = 100;
30 grid.cellHeight = 100;
31 grid.pivot = UIWidget.Pivot.TopLeft;
32 grid.transform.localPosition = new Vector3(-150, 150, 0);
33
34 //从Resources文件夹中动态加载Atlas
35 UIAtlas myAtlas = Resources.Load<UIAtlas>("Atlas/MyAtlas");
36
37 //通过GameManager得到一个随机数数组.
38 int[] randomIndex = GamaManager.RandomArray();
39
40 //生成图片.
41 for (int i = 0; i < 16; i++) {
42 UISprite cell = NGUITools.AddChild<UISprite>(grid.gameObject);
43
44 //设置图片容器的Atlas及图片名称.
45 cell.atlas = myAtlas;
46 cell.spriteName = "box";
47 cell.name = "f-" + i.ToString();
48
49 //添加UIDragDropContainer组件用于接收图片.
50 UIDragDropContainer container = NGUITools.AddMissingComponent<UIDragDropContainer>(cell.gameObject);
51 container.reparentTarget = cell.transform;
52
53 //添加显示图片的sprite.
54 UISprite sprite = NGUITools.AddChild<UISprite>(cell.gameObject);
55 sprite.atlas = myAtlas;
56 sprite.spriteName = "f-" + randomIndex[i];
57
58 sprite.tag = "Cell";
59
60 //设置sprite的depth使其能显示在上方.
61 sprite.depth = cell.depth + 1;
62
63 //为图片添加BoxCollider组件用于鼠标交互,并重新设置它的大小与图片大小一致.
64 NGUITools.AddMissingComponent<BoxCollider>(sprite.gameObject);
65 sprite.autoResizeBoxCollider = true;
66 sprite.ResizeCollider();
67
68 //添加我们自己写的DragOnPic脚本用于实现拖拽功能.
69 NGUITools.AddMissingComponent<DragOnPic>(sprite.gameObject);
70 }
71 }
72
73 }
拖拽脚本:
public class DragOnPic : UIDragDropItem {
UISprite _sprite;
Transform myParent;
void OnEnable()
{
_sprite = this.GetComponent<UISprite>();
}
protected override void OnDragDropStart ()
{
//开始拖拽时增加depth,是其能显示在别的图片上方.
_sprite.depth += ;
//开始拖拽时记下自己的父物体.
myParent = this.transform.parent;
//父类的方法.
base.OnDragDropStart ();
}
protected override void OnDragDropRelease (GameObject surface)
{
//父类的方法.
base.OnDragDropRelease (surface);
//松开鼠标时如果是另一张图片,则交换两张图片的位置,否则重置自己的位置.
if(surface.tag == "Cell")
{
this.transform.SetParent(surface.transform.parent);
surface.transform.SetParent(myParent);
this.transform.localPosition = Vector3.zero;
surface.transform.localPosition = Vector3.zero;
}
else {
this.transform.localPosition = Vector3.zero;
}
//拖拽结束时判断是否完成拼图.
if(GamaManager.CheckWin())
{
NGUIDebug.Log("Win!!!!");
}
//结束拖拽时重置depth.
_sprite.depth -= ;
}
}
GameManager中判断是否完成拼图分方法跟UGUI中的类似,这里就不多写了~~~
好了,大功告成!
使用NGUI实现拖拽功能(拼图小游戏)的更多相关文章
- 使用UGUI实现拖拽功能(拼图小游戏)
实现方式 1.引入UGUI自带的事件系统 UnityEngine.EventSystems 2.为我们的类添加接口 IBeginDragHandler, IDragHandler, IEndDragH ...
- canvas drag 实现拖拽拼图小游戏
博主一直心心念念想做一个小游戏- 前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...
- React Editor 应用编辑器(1) - 拖拽功能剖析
这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...
- JQuery UI的拖拽功能
JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...
- Js元素拖拽功能实现
Js元素拖拽功能实现 需要解决的问题 最近项目遇到了一个问题,就是用户某个操作需要弹出一个自定义的内容输入框,但是有个缺点,当浏览太大的时候没办法点击确认和取消按钮,应为这个弹出框是采用绝对定位的,取 ...
- (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
利用JavaScript(JS)实现一个九宫格拖拽功能 Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...
- html5中的拖拽功能
拖拽元素支持的事件 ondrag 应用于拖拽元素,整个拖拽过程都会调用 ondragstart 应用于拖拽元素,当拖拽开始时调用 ondragleave 应用于拖拽元素,当鼠标离开拖拽元素是调用 on ...
- 使用 vue3 的自定义指令给 element-plus 的 el-dialog 增加拖拽功能
element-plus 提供的 el-dialog 对话框功能非常强大,只是美中不足不能通过拖拽的方式改变位置,有点小遗憾,那么怎么办呢?我们可以通过 vue 的自定义指令来实现一个可以拖拽的对话框 ...
- RCP:拖拽功能的实现 Drag and Drop
SWT中的拖拽是使用的org.eclipse.swt.dnd. 有三个需要密切注意的类: 1.DragSource 2.DropTarget 3.Transfer DragSource封装了需要被拖拽 ...
随机推荐
- SDN理解:云数据中心底层网络架构
目录 - 目录 - 云数据中心流量类型 - NSX整体网络结构 - 管理网络(API网络) - 租户网络 - 外联网络 - 存储网络 - openstack整体网络结构 - 管理网络:(上图中蓝线) ...
- android中edittext被键盘挡住问题
最近开始新项目,做注册页时候由于ui布局问题,edittext被键盘挡住了. 在stackoverflow上找了一遍,有提到在对应activity中设置windowSoftInputMode, 例如: ...
- [Q]自定义快捷键
打开CAD批量打图精灵主界面可以使用以下三个命令其一:“QuickPlot”.“QPlot”.“QP”.“PP”,其中“PP”可以更改, 方法如下:进入AutoCAD传统界面,点“工具”-“自定义”- ...
- JAVA上连接ubuntu14.04上的Hbase
对于新手来说,连接虚拟机上的Hbase有点繁琐,而且网上的配置不太适合初学者,今天我就整理了一下,希望对你们有帮助,第一次发博客. 1.首先去官网下载Hbase的压缩包.我这里用的是1.2.1 htt ...
- 循序渐进看Java web日志跟踪(2)-Java日志API认识
接触过Java的朋友应该都会知道,java的开源框架百花齐放,实现同样的功能,总能找到几个强大的开源框架来进行选择.在日志方面,Java同样不逊色.除了JDK本身自带的简单的日志工具,java还有如l ...
- 循序渐进看Java web日志跟踪(1)-Tomcat 日志追踪与配置
日志,是软件运行过程中,对各类操作中重要信息的记录. 日志跟踪,不管对于怎么样的项目来说,都是非常重要的一部分,它关系到项目后期的维护和排错,起着举足轻重的作用.项目开发过程中,对日志的记录规则,也将 ...
- FileOutputStream flush()
FileOutputStream 继承 OutputStream ,flush方法查看源码方法体为空,所以flush没起到清除缓存的作用 改用BufferedOutputStream再调用flush( ...
- 仅以一个前端开发人员的角度看微信小程序
看了几天的小程序(当然也包括了上手书写),才有了这篇博文,非技术贴,只是发表下个人观点,仅以个人技术能力来看小程序. 首先说下优点: 调试工具:官方的工具还是做了很多工作,包括监听文件变动自动刷新,编 ...
- 深入理解Solaris内核中互斥锁(mutex)与条件变量(condvar)之协同工作原理
在Solaris上写内核模块总是会用到互斥锁(mutex)与条件变量(condvar), 光阴荏苒日月如梭弹指一挥间,Solaris的大船说沉就要沉了,此刻心情不是太好(Orz).每次被年轻的有才华的 ...
- thinkphp5.0 自动加载
自动加载 概述 ThinkPHP5.0真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载. 自动加载的实现由think\Loader类库完成,自动加载规范符 ...