Unity中实现背包物品拖动和更换位置

Unity UI元素拖拽示例
本文介绍了一个Unity中UI元素拖拽的实现案例。该案例通过定义一个名为PointMoveController的脚本,实现了UI元素的开始拖拽、拖拽过程中及结束拖拽的行为。在拖拽过程中,UI元素会跟随鼠标移动,并且根据目标对象的标签进行不同的操作。

using UnityEngine;

using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class PointMoveController : MonoBehaviour,IBeginDragHandler, IDragHandler,IEndDragHandler
{

//// Use this for initialization
//void Start () 
//{

//}

//// Update is called once per frame
//void Update () 
//{ 
//}

private Vector3 Original;
private Transform OriginalParent;
/// <summary>
/// 开始拖动
/// </summary>
/// <param name="EventData"></param>
public void OnBeginDrag(PointerEventData EventData)
{
    OriginalParent = this.transform.parent;//设置父位置点
    Original = this.transform.position;
    this.GetComponent<CanvasGroup>().blocksRaycasts = false;//设置射线穿透
}
/// <summary>
/// 正在拖拽
/// </summary>
/// <param name="EventData"></param>
public void OnDrag(PointerEventData EventData)
{
    this.transform.position = Input.mousePosition;//当前位置为鼠标所在位置
    if (EventData.pointerEnter.tag == "Weapon")
    {
        this.transform.SetParent(EventData.pointerEnter.transform);
    }
    if (EventData.pointerEnter.tag == "P")
    {
        this.transform.SetParent(EventData.pointerEnter.transform.parent);
    }
}
public void OnEndDrag(PointerEventData EventData)
{
    this.transform.localPosition = new Vector3(0,0,0);
    this.GetComponent<CanvasGroup>().blocksRaycasts = true;
    if (EventData.pointerEnter.tag == "P")
    {
        EventData.pointerEnter.transform.position = Original;
        EventData.pointerEnter.transform.SetParent(OriginalParent);
    }
    if (EventData.pointerEnter.tag == this.name)
    {
        this.transform.FindChild("Text").GetComponent<Text>().text = int.Parse(this.transform.FindChild("Text").GetComponent<Text>().text) +int.Parse(EventData.pointerEnter.transform.FindChild("Text").GetComponent<Text>().text)+"";
    }
    if (EventData.pointerEnter.tag == "BackGround")
    {
        GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
        go.tag = "P";
        this.transform.FindChild("Text").GetComponent<Text>().text = (int.Parse(this.transform.FindChild("Text").GetComponent<Text>().text) - 1) + "";
        OriginalParent = this.transform.parent;
        Original = this.transform.position;
    }
}

}

实现Unity2D背包物品拖拽交换,你需要进行以下步骤: 1. 创建你的背包UI 首先,你需要创建你的背包UI。你可以使用Unity的UI工具来创建一个网格,每个格子代表一个背包物品。然后,你需要将每个物品图像作为子对象添加到每个格子上。 2. 编写拖拽脚本 接下来,你需要编写一个脚本来实现拖拽功能。该脚本应该附加到每个物品上。 在该脚本中,你需要实现以下功能: - 当用户按下鼠标左键时,开始拖动物品。 - 当用户拖动物品时,物品应该跟随鼠标移动。 - 当用户松开鼠标左键时,将物品放置在目标格子中。 - 如果目标格子中已经有物品,则将两个物品交换。 以下是一个示例脚本: ```csharp using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class DragAndDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { private Transform initialParent; private Vector3 initialPosition; public void OnBeginDrag(PointerEventData eventData) { initialParent = transform.parent; initialPosition = transform.position; GetComponent<CanvasGroup>().blocksRaycasts = false; } public void OnDrag(PointerEventData eventData) { transform.position = Input.mousePosition; } public void OnEndDrag(PointerEventData eventData) { GetComponent<CanvasGroup>().blocksRaycasts = true; if (eventData.pointerEnter != null && eventData.pointerEnter.tag == "Slot") { transform.SetParent(eventData.pointerEnter.transform); if (eventData.pointerEnter.transform.childCount > 1) { transform.position = eventData.pointerEnter.transform.GetChild(1).position; eventData.pointerEnter.transform.GetChild(1).position = initialPosition; eventData.pointerEnter.transform.GetChild(1).SetParent(initialParent); } else { transform.localPosition = Vector3.zero; } } else { transform.position = initialPosition; } } } ``` 3. 添加事件触发器 最后,你需要在每个格子上添加事件触发器。当用户将物品拖动到一个格子上时,该格子将触发一个事件。你可以使用事件触发器来调用一个函数,该函数将处理物品交换。 在事件触发器上,你需要选择“PointerDown”事件类型,并将“DragAndDrop”脚本中的“OnBeginDrag”函数添加为事件处理程序。 对于每个格子,你还需要选择“PointerUp”事件类型,并将“DragAndDrop”脚本中的“OnEndDrag”函数添加为事件处理程序。 最终,你将拥有一个可以拖拽交换物品背包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值