[Unity]关于UGUI拖拽备份克隆功能的简单实现
2017-12-18 11:32
956 查看
最近题主在做一个RPGDemo的技能拖拽到技能栏的功能时,遇到了UGUI中并没有直接实现拖拽备份克隆的功能(PS:题主还是刚入门的新手),索性自己就写了一下,逻辑算不上复杂,但刚开始也不太简单。
之前的效果(没有实现前)
在讲ugui的实现之前我们来看看老版本的ngui如何实现拖拽备份克隆的功能。
就是直接继承了UIDragDropItem接口直接实现
这个借口在面板提供了一个对象Clone On Drag 选择是否拖拽备份克隆
好了我们来正式说UGUI的实现:
想要实现的功能很简单,就是拖拽备份克隆。
每一个技能面板有单独的格子gird,和图片icon-name.
给icon-name和icon-name_1都挂载UISkillItemDrag脚本
这个skillitem做成了预置体,同时把icon-name技能的图片单独做成预置体icon-name_1.
同时设置Skillitem的tag为skillitem。
UGUI需要继承这3个接口:
这三个接口很好理解,开始拖拽,拖拽中,拖拽结束
在开始拖拽时我们通过查找所有的Tag=skillitem的预制体,再通过遍历的方式判断每一个子物体!=5的SkillItem,因为当我们拖拽当前的SkillItem时,它的子物体icon-name图片会放到root根目录下,也就是当前SkillItem的子物体!=5。
之前的效果(没有实现前)
在讲ugui的实现之前我们来看看老版本的ngui如何实现拖拽备份克隆的功能。
就是直接继承了UIDragDropItem接口直接实现
这个借口在面板提供了一个对象Clone On Drag 选择是否拖拽备份克隆
好了我们来正式说UGUI的实现:
想要实现的功能很简单,就是拖拽备份克隆。
每一个技能面板有单独的格子gird,和图片icon-name.
给icon-name和icon-name_1都挂载UISkillItemDrag脚本
这个skillitem做成了预置体,同时把icon-name技能的图片单独做成预置体icon-name_1.
同时设置Skillitem的tag为skillitem。
UGUI需要继承这3个接口:
这三个接口很好理解,开始拖拽,拖拽中,拖拽结束
public void OnBeginDrag(PointerEventData eventData) { this.transform.parent = this.transform.root;//当开始拖拽设置当前图片icon-name的父物体为根目录,取消拖拽的边界限制作用! SetDraggedPosition(eventData); //转换坐标 } private void SetDraggedPosition(PointerEventData eventData) { var rt = this.gameObject.GetComponent<RectTransform>(); Vector3 globalMousePos; if (RectTra 99fd nsformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out globalMousePos)) { rt.position = globalMousePos; } }
在开始拖拽时我们通过查找所有的Tag=skillitem的预制体,再通过遍历的方式判断每一个子物体!=5的SkillItem,因为当我们拖拽当前的SkillItem时,它的子物体icon-name图片会放到root根目录下,也就是当前SkillItem的子物体!=5。
public void OnBeginDrag(PointerEventData eventData) { skillId = this.transform.parent.GetComponent<skillItem>().id; this.transform.parent = this.transform.root; GameObject[] skillitems = GameObject.FindGameObjectsWithTag("skillitem"); //开始拖拽时我们通过查找所有的Tag=skillitem的预制体 for (int i = 0; i < skillitems.Length; i++) { if (skillitems[i].transform.childCount != 5) { //再通过遍历的方式判断每一个子物体!=5的SkillItem //设置父物体 //得到它的sprite组件 Sprite goimg = eventData.pointerCurrentRaycast.gameObject.GetComponent<Image>().sprite; GameObject go = Instantiate(icon_name_01); //更新图片信息 go.GetComponent<Image>().sprite = goimg; go.transform.SetParent(skillitems[i].transform); //更新位置属性 /// <summary> /// 当我们实例化出来的时候icon-name_1预置物体的RectTransform的Position属性是相对于根目录的Position,当我们设置新的父物体事我们需要修改它的RectTransform.anchoredPosition的值相对于当前的父物体的位置。 /// </summary> go.GetComponent<RectTransform>().anchoredPosition = new Vector2(-73.2f,1.8f); } } SetDraggedPosition(eventData); }
相关文章推荐
- 关于UGUI实现拖拽功能的接口(IBeginDragHandler、IEndDragHandler、IDragHandler )需注意的问题
- 简单实现UGUI拖拽功能
- 简单实现UGUI拖拽功能
- C#实现外部图片的拖拽到应用程序的简单功能,附全部源码,供有需要的参考
- Unity3.5 自带的寻路功能简单实现
- C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
- unity 实现简单的触屏功能
- C#实现外部图片的拖拽到应用程序的简单功能,附全部源码,供有需要的参考
- Unity3D-UGUI-drag and drop实现拖拽放下功能
- 关于“多线程断点续传下载”功能的一个简单实现和讲解
- WinForm实现简单的拖拽功能(C#)
- 关于java打印功能的最简单实现的学习笔记
- WPF简单拖拽功能实现
- 利用VRRP功能实现简单的路由器备份(图)
- WinForm实现简单的拖拽功能(C#)
- 简单的实现对话框中文件的拖拽功能
- 使用UGUI实现拖拽功能(拼图小游戏)
- js实现简单div拖拽功能实例
- javascript实现简单的弹出层以及拖拽功能(支持firefox、IE7.0以上、oprea、chrom)
- 非常简单的拖拽功能实现