Unity 简单的背包实现

作者: Unity学习的路上 | 来源:发表于2017-01-05 22:29 被阅读0次

使用Unity完成简单的背包功能

用UGUI布局成一下这个样子

设置BackGround的tag为Bag 

Lft,Center,Right设置为Groove

所有的Item设置为BagItem

在BackGround中添加组件Grid Layout Group,使拖动上去之后能够正确排版

并且为所有item添加CanvasGroup组件,当BlockRaycasts为false时使射线能够穿透该物体,反则则不能

编写脚本

在BackGround上挂载的脚本.m_BagPageMgr,这是一个管理类

using UnityEngine;

public class m_BagPageMgr : MonoBehaviour

{    

Transform _Panle;   //保存Panle的Transform 

Transform BackGound;    //保存BackGround的Transform

void Awake()    

{        

_Panle = transform.parent.GetComponent<Transform>();       //获取到Transform组件

BackGound = GetComponent<Transform>();//获取到Transform组件

Inst = this;//初始化实例

}

private m_BagPageMgr()//私有化构造方法,使外部不能随意实例化该类

{

}

static m_BagPageMgr Inst;//定义一个静态的私有的实例

public static m_BagPageMgr Instance//使用属性获取上面的实例

{

get

{

return Inst;

}

}

public  Transform getPanle//使用属性获取Panle的Transform

{

get

{

return _Panle;

}

}

public Transform getBG//使用属性获取BackGround的Transform

{

get

{

return BackGound;

}

}

}

在Item上挂载的组件

using UnityEngine;

using UnityEngine.EventSystems;

public class m_ItemDarg : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler//继承能够实现拖拽的接口

{    

CanvasGroup _canvasGroup;    //定义一个CanvasGroup的引用变量

Transform _selfParent;    //这个用来保存当前的父对象

void Awake()    

{        

_canvasGroup = transform.GetComponent();//获取Item上的CanvasGroup组件

}

public void OnBeginDrag(PointerEventData eventData)//当开始拖动时调用该方法,且只调用一次

{

_selfParent = transform.parent;//记录下当前对象的父物体

_canvasGroup.blocksRaycasts = false;//使射线能够穿过鼠标拖拽的物体

transform.SetParent(m_BagPageMgr.Instance.getPanle.transform);//当鼠标开始拖拽时,将其父物体设置为Panle,使其能够显示在在所有的游戏对象上面

}

public void OnDrag(PointerEventData eventData)//当鼠标正在拖动时调用,在这期间该方法一直调用

{

transform.position = eventData.position;//使鼠标拖拽的物体的位置等于鼠标的位置

}

public void OnEndDrag(PointerEventData eventData)//当鼠标拖拽完成,松开鼠标时执行该方法,且只执行一次

{

GameObject pointobj = eventData.pointerEnter;//获取鼠标拖拽的物体下面的游戏对象

if (pointobj == null)//当该游戏对象为空时

{

transform.SetParent(_selfParent);//将其返回至原来的位置,也就是将其父对象设置成初始的父对象

transform.localPosition = Vector3.zero;//坐标归零

}

else if (pointobj.tag == "Bag")//当射线检测到的是BackGround时

{

transform.SetParent(m_BagPageMgr.Instance.getBG.transform);//将其父物体设置为BackGround

transform.localPosition = Vector3.zero;

}

else if (pointobj.tag == "Groove")//当射线检测到的是Lft,Center,Right,这三个的时候

{

transform.SetParent(pointobj.transform);//将该物体的父物体设置为检测到的物体

transform.localPosition = Vector3.zero;

}

else if (pointobj.tag == "BagItem")//当射线检测到的是Item时,交换两个的父物体

{

transform.SetParent(pointobj.transform.parent);

transform.localPosition = Vector3.zero;

pointobj.transform.SetParent(_selfParent);

pointobj.transform.localPosition = Vector3.zero;

}

else//以上都不满足时,这是我们并不期望的一个结果,所以返回初始的父对象

{

transform.SetParent(_selfParent);

transform.localPosition = Vector3.zero;

}

_canvasGroup.blocksRaycasts = true;//使射线不能穿过Item,也就是不能检测到Item下面的物体

}

}

相关文章

  • Unity 简单的背包实现

    使用Unity完成简单的背包功能 用UGUI布局成一下这个样子 设置BackGround的tag为Bag Lft,...

  • [Unity]NGUI代码实现背包效果

    [Unity]技术学习路线图(长期更新) 效果实现如图 对象层级关系图 PacketCell - Right对象作...

  • Unity3d 对接android SDK

    Unity3d 对接android SDK 从Unity3D到Android工程 为了实现交互,我们采用的是简单的...

  • Leap Motion Unity 资源

    Leap Motion Unity 资源提供了在unity中实现运动手的控制的一个简单方法 系统需求 *Leap ...

  • unity A*算法简单实现

    项目要用A算法做运算所以边学边练。http://edu.manew.com/course/44/task/432/...

  • unity 简易有限状态机实现

    unity 简易有限状态机实现 在我们从事unity工作时,有时候会面对复杂的状态切换,最简单的方法就是用if e...

  • Unity:Addressable实现简单换肤

    Unity中资源的加载方式 直接引用,把引用的物体直接通过Inspector面板拖入: 这种方式使用的局限性很大,...

  • Unity动画 让人物动起来

    简介: 除了在unity内制作一些简单的动画外,我们也可以使用外部导入的文件来实现 unity 内的动画版本:Un...

  • Unity背包系统设计

    背包系统设计思路 基本思路:玩家在场景中捡到东西——放入背包中对应Item栏——点击装备武器放入人物装备槽(改变s...

  • UNITY制作游戏背包

    在游戏中,我们的背包中都有各种各样的物品,我们通常会通过拖拽对游戏物品进行排序,这里我将其中的一些知识分享出来,如...

网友评论

    本文标题:Unity 简单的背包实现

    本文链接:https://www.haomeiwen.com/subject/acttbttx.html