您的位置:首页 > 移动开发 > Unity3D

[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个接口:



这三个接口很好理解,开始拖拽,拖拽中,拖拽结束

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: