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

unity实现物品或技能图标的拖拽功能

2017-04-07 10:08 309 查看
在设计背包或者技能栏的时候,通常采用MVC模式。

Model脚本读取存放在数据库中的物品或技能的相关资源(Icon,prefabs)

view脚本将读取的资源显示在背包或技能栏中。

而Controller脚本我则用来实现物品或技能的拖拽。而我的Drag脚本分在Controller中,给每个物品或技能资源都挂上脚本,实现拖拽核心功能。

而Drag脚本中的方法Unity已提供接口。

主要方法是public void OnBeginDrag (PointerEventData eventData)

                    public void OnDrag(PointerEventData eventData)

                    public void OnEndDrag(PointerEventData eventData)

而函数private void SetDraggedPosition(PointerEventData eventData)是Unity提供的让拖拽目标跟随鼠标移动的方法,我在上面3个函数中都进行了调用。

Start()和OnbeginDrag中的数据都是为OnEndDrag中判断能否交换目标物品的位置做准备,以及如果能则实现交换。实现的方法千差万别,感觉我这里写的方法适用范围很小,若要参考推荐重写这部分功能(判断能否交换及实现交换)

代码如下

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
/// <summary>
/// MVC-controll;
/// </summary>
public class Drag : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler {
public Transform bg;
public Transform rawParent;
public GameObject exchange;
// begin dragging
public void Start(){
bg = GameObject.Find ("Canvas_Windows").transform;
}

public void OnBeginDrag (PointerEventData eventData)
{ if (gameObject.GetComponent<Image> ().sprite == null) {
return;
}
rawParent = transform.parent;
transform.SetParent (bg);
SetDraggedPosition (eventData);
gameObject.GetComponent<Image> ().raycastTarget = false;

}

// during dragging
public void OnDrag(PointerEventData eventData)
{ if (gameObject.GetComponent<Image> ().sprite == null) {
return;
}
SetDraggedPosition(eventData);
}

// end dragging
public void OnEndDrag(PointerEventData eventData)
{ if (gameObject.GetComponent<Image> ().sprite == null) {
return;
}
//SetDraggedPosition(eventData);
GameObject goal=eventData.poi
4000
nterCurrentRaycast.gameObject;
Debug.Log (goal.name);
if (goal.transform.parent.name == "Icon") {

exchange = Instantiate (goal);
transform.SetParent (goal.transform.parent);
transform.localPosition = Vector3.zero;
Destroy (exchange,0.2f);
Destroy (goal,0.3f);
GameObject k = Instantiate (exchange, rawParent);
k.transform.localPosition = Vector3.zero;
k.GetComponent<Image> ().enabled = true;

gameObject.GetComponent<Image> ().raycastTarget = true;
}

else {
transform.SetParent (rawParent);
transform.localPosition = Vector3.zero;
gameObject.GetComponent<Image> ().raycastTarget = true;
}
}

/// <summary>
/// set position of the dragged game object
/// </summary>
/// <param name="eventData"></param>
private void SetDraggedPosition(PointerEventData eventData)
{
var rt = gameObject.GetComponent<RectTransform>();

// transform the screen point to world point int rectangle
Vector3 globalMousePos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out globalMousePos))
{
rt.position = globalMousePos;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: