前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity-Demo实例之 ✨ 实现UI-背包装备拖拽功能

Unity-Demo实例之 ✨ 实现UI-背包装备拖拽功能

作者头像
呆呆敲代码的小Y
发布2021-08-12 11:06:19
1.5K0
发布2021-08-12 11:06:19
举报
文章被收录于专栏:呆呆敲代码的小Y 公众号

Unity实现简单的背包装备拖拽

描述:在一个简单的UI场景内实现背包内物品可以互相拖拽,装备栏内相同装备间互换、不相同的装备间不能相互拖拽。


1.是通过标签Tag与层Layer来判断的装备是在背包内还是在装备栏内 2.脚本挂在背包内的物品身上,每个装备标签和道具标签都不一样分为Weapon,Clothes,Wing,Shoes,

3.层分为了背包层Bag和装备层Weapon。通过射线检测的物体标签Tag与层Layer。

将脚本挂在装备或者物品上即可


完整代码送上

代码语言:javascript
复制
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Drag : MonoBehaviour,IBeginDragHandler,IEndDragHandler,IDragHandler,ICanvasRaycastFilter
{
    private Transform nowparent;//记录原始坐标位置
    private bool isRaycastLocationValid = true;//默认射线不能穿透物体

    public void OnBeginDrag(PointerEventData eventData)
    {
        nowparent = transform.parent;//初始位置
        isRaycastLocationValid = false;//设置为可以穿透
    }

    public void OnDrag(PointerEventData eventData)
    {
        transform.position = Input.mousePosition;

    }

    public void OnEndDrag(PointerEventData eventData)
    {
       
        //获取鼠标终点位置可能存在的物品
        GameObject go = eventData.pointerCurrentRaycast.gameObject;

        if (go != null)//落点位置不为空
        {
            Debug.Log(go.name);//打印一下落点位置名称
            if (go.tag==("Gird") && go.layer.Equals(9))//鼠标终点位置是空格子而且为背包层(判断将装备或道具拖到背包空物体处)
            {
                SetParentAndPosition(transform,go.transform);
            }
            else if((go.tag.Equals("Prop") || go.tag.Equals("Weapon") || go.tag.Equals("Clothes") 
                  || go.tag.Equals("Wing") || go.tag.Equals("Shoes")) && go.transform.parent.gameObject.layer.Equals(9)
                  && transform.parent.gameObject.layer.Equals(9)) 
                  //鼠标落下的终点也是背包的一个物体而且落点位置父物体层数为背包层,此时拖拽的物品父物体对象层数也为背包层(判断为背包内物体随意交换)
            {
                //将拖拽的物品1放到鼠标终点下的位置
                SetParentAndPosition(transform,go.transform.parent);
                //将鼠标终点的物品2放到原来物品1的位置
                SetParentAndPosition(go.transform,nowparent);
                if (transform.position == go.transform.position)
                {
                    Debug.Log("error");
                }
             }
            else if (go.tag == transform.tag && go.layer.Equals(10))//标签相同,而且落点在装备层(判断从背包内往装备栏放置装备)
            {
                //将拖拽的物品1放到鼠标终点下的位置
                SetParentAndPosition(transform, go.transform);
            }
            else if (go.tag == transform.tag && transform.gameObject.layer == go.layer)//标签相同而且层相同(判断装备栏内装备交换位置与从装备栏拖到背包相同类型装备互换位置)
            {
                //将拖拽的物品1放到鼠标终点下的位置
                SetParentAndPosition(transform, go.transform.parent);
                SetParentAndPosition(go.transform,nowparent);
            }
            else//无效位置,物品回到原来的位置
            {
                SetParentAndPosition(transform,nowparent);
            }
        }
        else
        {
            SetParentAndPosition(transform,nowparent);
        }
        isRaycastLocationValid = true;//射线不可以穿透物体
    }
    // 将child放到parent下做其子物体
    private void SetParentAndPosition(Transform child,Transform parent)
    {
        child.SetParent(parent);
        child.position = parent.position;//子物体的坐标跟随父物体
    }
    public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
    {
        return isRaycastLocationValid;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Unity实现简单的背包装备拖拽
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档