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;
}
}
}
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;
}
}
}
相关文章推荐
- Unity实现拖拽功能
- Unity 3D 实现拾取物品功能(一)
- 基于jQuery实现拖拽图标到回收站并删除功能
- unityUGUI拖拽物品的实现方法
- Unity手游开发--NGUI实现冷却技能(CD)功能
- Unity 封装 倒计时(计时器,CountDownTimer),实现周期更新、技能冷却等功能
- Unity学习之实现拖拽功能
- [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag
- 基于jQuery实现拖拽图标到回收站并删除功能
- unity _game窗口图片精灵拖拽(背包物品,或者技能)
- [置顶] Unity基于NGUI实现拖拽功能
- [Unity]关于UGUI拖拽备份克隆功能的简单实现
- unity实现鼠标拖拽缩放功能代码
- WinForm实现简单的拖拽功能(C#)
- js实现主页布局的拖拽功能
- EyesBaby功能实现之窗口拖拽与缩放功能
- EyesBaby功能实现之窗口拖拽与缩放功能
- VC++ 文件拖拽功能实现
- ActionScript3 实现拖拽功能
- 如何基于asp.net实现ListBox控件的鼠标拖拽功能