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

举报
呆呆敲代码的小Y 发表于 2021/07/27 01:19:15 2021/07/27
【摘要】 Unity实现简单的背包装备拖拽 描述:在一个简单的UI场景内实现背包内物品可以互相拖拽,装备栏内相同装备间互换、不相同的装备间不能相互拖拽。 1.是通过标签Tag与层Layer来判断的装备是在背包内还是在装备栏内 2.脚本挂在背包内的物品身上,每个装备标签和道具标签都不一样分为Weapon,Clothes,Wing,Shoes, 3.层分...

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

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


1.是通过标签Tag与层Layer来判断的装备是在背包内还是在装备栏内

2.脚本挂在背包内的物品身上,每个装备标签和道具标签都不一样分为Weapon,Clothes,Wing,Shoes,

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

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


完整代码送上

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; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

文章来源: blog.csdn.net,作者:呆呆敲代码的小Y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/zhangay1998/article/details/108202275

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。