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

在设计背包或者技能栏的时候,通常采用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.pointerCurrentRaycast.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;
		}
	}
}



版权声明:本文为qq_33657132原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。