Unity3D-背包
来源:互联网 发布:观后感怎么写 知乎 编辑:程序博客网 时间:2024/05/28 06:05
背包逻辑
1. 开始拖拽:记住当前父物体
2. 拖拽中:将当前物体的射线检测关闭,将物体的位置等于鼠标位置,将物体的父物体设为当前深度值高的物体
3. 拖拽后:
①射线检测当前位置是否为空或者检测得到的tag不为bag或goods,为空则把物体的位置还原(位置和父物体); ②如果检测到的是背包bag,则把物体的位置设置为背包格子的位置,父物体设置为各子; ③如果检测到的是物品goods,交换两个物品 把物体的位置设为物品父物体的位置,父物体设为物品的父物体 把物品的位置设为原来物体的父物体位置(nowparent),父物体设为原来物体的父物体
代码
引用EventSystem(事件系统)
继承EventTrigger类,该类含有UGUI的回调方法
开始拖拽:
void OnBeginDrag(PointerEventData eventData)
所在接口IBeginDragHandler
拖拽中
void OnDrag(PointerEventData eventData)
所在接口 IDragHandler
拖拽后
void OnEndDrag(PointerEventData eventData)
所在接口 IEndDragHandler
eventData含有回调的信息
public class Bag : EventTrigger{ //物品最开始的父物体 public Transform nowParent; //物品拖拽中的父物体 private Transform dragParent; public string[] tags = new string[] { "bag", "goods" }; public override void OnPointerClick(PointerEventData eventData) { //射线碰撞点的信息 print(eventData.pointerCurrentRaycast); } public override void OnBeginDrag(PointerEventData eventData) { nowParent = transform.parent; } /// <summary> /// 当拖拽时跟着鼠标移动 /// </summary> /// <param name="eventData"></param> public override void OnDrag(PointerEventData eventData) { //当前物体的位置跟随鼠标进行移动 transform.position = Input.mousePosition; //拖拽中将物体的射击检测关闭 以便结束拖拽的时候可以去检测物体下方的物体 IsRayCastOn(false); //将拖拽中的物体父物体改为深度值较高的空物体,以便我们在拖拽中可以看到他 transform.SetParent(dragParent); } /// <summary> /// 当结束拖拽时将物品放到格子里(格子有物品时交换位置) /// </summary> /// <param name="eventData"></param> public override void OnEndDrag(PointerEventData eventData) { GameObject go = eventData.pointerCurrentRaycast.gameObject; //类似于Array.Find //Array.Find(要查询的数组,查询的条件) //for (int i = 0; i < tags.Length; i++) //{ // if (go.tag == tags[i]) // { // } //} //如果是别的UI或者go为空 让拖拽的物品回归原位 //go.tag!="bag"||go.tag!="goods" if (go == null || Array.Find(tags, p => p == go.tag)==null) { SetPosAndParent(transform,nowParent); return; } //射线检测我当前拖拽物品所到位置的物体标签 //射线怎么检测 // 当前射线碰撞事件UI的信息 // print(eventData.pointerCurrentRaycast); // //如果是格子 将拖拽的物品放到格子的位置,并且和格子成为父子物体的关系 if (go.tag == "bag") { transform.position = go.transform.position; transform.SetParent(go.transform); } else if (go.tag == "goods") { //如果是格子当中有物品,那么交换两个物品位置 //将拖拽的物体放到当前格子中 SetPosAndParent(transform,go.transform.parent); //将现在格子当中的物体移动到当前拖拽物体原来的位置 SetPosAndParent(go.transform,nowParent); } IsRayCastOn(true); } public void SetPosAndParent(Transform child, Transform parent) { child.position = parent.position; child.SetParent(parent); } public void IsRayCastOn(bool flag) { GetComponent<Image>().raycastTarget = flag; }}
阅读全文
0 0
- Unity3D-背包
- Unity3D(六)背包系统
- unity3D之角色背包的设计
- Unity3D使用NGUI实现简单背包功能
- [Unity3D]移动端手游背包功能实现&UGUI
- Unity3D学习:制作背包换装备UI
- Unity3D——UGUI实现背包系统
- Unity3d 简单的背包系统(物品交换)
- unity3D之NGUI血条和背包系统
- Unity3D游戏开发之背包系统(三)
- unity3D游戏开发中如何用UGUI制作背包
- Unity3D学习(13)之UI界面与背包系统
- 基于Unity3D(UGUI)的背包系统<二>
- 基于Unity3D(UGUI)的背包系统<三>
- 基于Unity3D(UGUI)的背包系统<四>完结篇
- Unity3d背包系统系统(〇)——功能演示
- 【背包】
- 背包
- Python3使运行暂停的方法
- java的垃圾回收机制
- python 字符串string 处理函数
- python中常见的数学函数
- 重新起航,版本3.0
- Unity3D-背包
- js中类似java继承的使用 call
- makefile的使用
- 在Ubuntu16.04中设置默认Python3.5的命令
- softmax函数以及相关求导过程
- Spring AOP 一般应用场景
- C++笔记
- POJ2785 4 Values whose Sum is 0(折半枚举+二分)
- Handler和Timer实现倒计时和三秒跳转