【UI背包】----背包拖拽

本文介绍了一个Unity中的背包拖拽功能实现方法,通过使用IDragHandler等接口,配合射线检测和变换位置等技术,实现了物品在背包界面上的拖拽交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现背包拖拽

1.添加接口:IDragHandler, IEndDragHandler, IBeginDragHandler, ICanvasRaycastFilter
分别为拖拽,结束拖拽,开始拖拽,射线检测
2.SetParent()设置父子关系
public void SetParent(Transform parent);
public void SetParent(Transform parent, bool worldPositionStays);
官方解释:如果为真,那么就保持之前的位置、旋转量、缩放值。而为否的时候则保持局部坐标的位置、旋转、缩放。
3.Vector3
back 用于编写 Vector3(0, 0, -1) 的简便方法。
down 用于编写 Vector3(0, -1, 0) 的简便方法。
forward 用于编写 Vector3(0, 0, 1) 的简便方法。
left 用于编写 Vector3(-1, 0, 0) 的简便方法。
negativeInfinity 用于编写 Vector3(float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity) 的简便方法。
one 用于编写 Vector3(1, 1, 1) 的简便方法。
positiveInfinity 用于编写 Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity) 的简便方法。
right 用于编写 Vector3(1, 0, 0) 的简便方法。
up 用于编写 Vector3(0, 1, 0) 的简便方法。
zero 用于编写 Vector3(0, 0, 0) 的简便方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;//事件
public class MyDrag : MonoBehaviour, IDragHandler, IEndDragHandler, IBeginDragHandler, ICanvasRaycastFilter
{   //接口:拖拽,结束拖拽,开始拖拽,Canvas射线检测
    bool isbool = true;
    Transform start;
    Transform canvas;
    public void Awake()
    {
        canvas = GameObject.Find("Canvas").transform;//找到Canvas的位置
    }
    public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
    {
        return isbool;//返回布尔值
    }
    public void OnBeginDrag(PointerEventData eventData)//拖拽开始
    {
        start = transform.parent;//记录初始位置
        transform.SetParent(canvas);//设置父子关系
        isbool = false;
    }

    public void OnDrag(PointerEventData eventData)//拖拽时
    {
        transform.position = Input.mousePosition;//将鼠标的位置赋给被拖拽的物体的位置
    }

    public void OnEndDrag(PointerEventData eventData)//拖拽结束
    {
        GameObject go = eventData.pointerCurrentRaycast.gameObject;//进行射线检测
        if (go)
        {
            if (go.tag == "Cell")//如果是空的背包格子,改变位置
            {
                ChangeAngPosition(transform, go.transform);//调用函数,改变位置
            }
            else if(go.tag=="Item")//如果背包格子不为空,交换两个物体的位置
            {
                ChangeAngPosition(transform, go.transform.parent);//调用函数,交换位置
                ChangeAngPosition(go.transform, start);
            }
            else //如果在背包之外
            {
                ChangeAngPosition(transform, start);//如果拖出背包外,则回到原位置
            }
            isbool = true;
        }    
    }
    void ChangeAngPosition(Transform child,Transform parent)//改变位置
    {
        child.SetParent(parent);//设置父子关系
        child.position = parent.position;//写成了child.position
        child.localScale = Vector3.one;//Vector3.one写成了Vector.zero
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值