using UnityEngine;
using System.Collections; public enum BoxType
{
Normal,//普通格子
Equip//装备栏格子
} public enum EquipType
{
Weapon,//武器
Armor,//护甲
Shoot//鞋子
} public class Box : MonoBehaviour { //格子类型
public BoxType boxType;
//装备类型
public EquipType equipType;
//格子的子对象(一些装备)
public Transform child; void Start()
{
//给子对象赋值
if (transform.childCount == ) {
child = transform.GetChild ();
}
} /// <summary>
/// 接收物品
/// </summary>
/// <param name="goods">Goods.</param>
public void ReceiveGoods(Goods goods)
{
//普通格子
// if (boxType == BoxType.Normal) {
// BagSingleton.instance.SetParent (goods.transform, transform);
// } else {
// //如果装备类型匹配
// if (goods.goodsType == equipType) {
// BagSingleton.instance.SetParent (goods.transform, transform);
// } else {
// //不匹配返回
// goods.ReturnBack ();
// }
// } //优化版
if (boxType == BoxType.Equip && goods.goodsType != equipType) {
goods.ReturnBack ();
} else {
BagSingleton.instance.SetParent (goods.transform, transform);
//更新物品的父物体
goods.parent = transform;
//更新格子的子物体
child = goods.transform;
}
}
}

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems; public class Goods : MonoBehaviour,
IBeginDragHandler,IDragHandler,IEndDragHandler { //物品类型
public EquipType goodsType;
//父对象(格子)
public Transform parent; private CanvasGroup canvasGroup; void Start()
{
//给父对象赋值
if (transform.parent) {
parent = transform.parent;
}
//获取
canvasGroup = GetComponent<CanvasGroup> ();
} public void OnBeginDrag (PointerEventData eventData)
{
//将物品移除格子
transform.SetParent (BagSingleton.instance.bag);
//关闭阻挡射线
canvasGroup.blocksRaycasts = false;
} public void OnDrag (PointerEventData eventData)
{
transform.position = Input.mousePosition;
} public void OnEndDrag (PointerEventData eventData)
{
//如果当前物品下方有对象
if (eventData.pointerEnter) {
//获取底层对象标签
string tag = eventData.pointerEnter.tag;
//如果是格子
if (tag == "Box") {
//接收物品
eventData.pointerEnter.
GetComponent<Box> ().ReceiveGoods (this);
}
//如果是物品
else if (tag == "Goods") {
//下面物品
Goods herGoods = eventData.pointerEnter.GetComponent<Goods> ();
//下面物品所在格子
Box herBox = herGoods.parent.GetComponent<Box>();
//当前物品
Goods myGoods = this;
//当前物品所在格子
Box myBox = parent.GetComponent<Box>();
//交换
BagSingleton.instance.GoodsExchange (myBox, myGoods, herBox, herGoods);
}
//其他
else {
//返回
ReturnBack ();
}
} else {
//返回
ReturnBack ();
} //开启阻挡射线
canvasGroup.blocksRaycasts = true;
} /// <summary>
/// 返回原单位
/// </summary>
public void ReturnBack()
{
BagSingleton.instance.SetParent (transform, parent);
}
}

using UnityEngine;
using System.Collections; public class BagSingleton : MonoBehaviour { //单例
public static BagSingleton instance; //背包
public Transform bag; void Start()
{
instance = this; bag = GameObject.FindWithTag ("Bag").transform;
} /// <summary>
/// 设置格子父物体,并与父物体位置保持同步
/// </summary>
/// <param name="parent">Parent.</param>
public void SetParent(Transform son ,Transform parent)
{
son.SetParent (parent);
son.localPosition = Vector3.zero;
} /// <summary>
/// 物品交换
/// </summary>
/// <param name="myBox">My box.</param>
/// <param name="myGoods">My goods.</param>
/// <param name="herBox">Her box.</param>
/// <param name="herGoods">Her goods.</param>
public void GoodsExchange(Box myBox,Goods myGoods,Box herBox,Goods herGoods)
{
//如果双方都在普通格子中,或,双方物品类型一致
if ((myBox.boxType == BoxType.Normal &&
herBox.boxType == BoxType.Normal)
|| (myGoods.goodsType == herGoods.goodsType)) {
myBox.ReceiveGoods (herGoods);
herBox.ReceiveGoods (myGoods);
} else {
//当前物品返回原单位
myGoods.ReturnBack ();
}
}
}
BagSingleton是Box跟goods两个脚本会引用的单例脚本判断物品切换

Demon_背包系统(实现装备栏,背包栏,可以切换装备)的更多相关文章

  1. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  2. jQuery----左侧导航栏面板切换实现

    页面运行结果:                                                      点击曹操 点击刘备 点击孙权 原图 需求说明:原图如上所示,点击一方诸侯的时候 ...

  3. 导航栏图标切换:click事件,hover事件

    最近再做一个基于angular6的项目,导航栏需求:1.hover切换图标 2.click切换图标 先用jquery实现功能,在在angular组件里面实现. demo如下: <!DOCTYPE ...

  4. android下ViewPager的使用,带下部选项栏的切换动画

    (文章针对类似我这种初学者,大神看到不要嘲笑) 演示 我的规矩是先上GIF动画效果(Linux下用转的GIF,清晰度还可以但是不知道为什么放博客上,界面会这么大): 代码: android中有View ...

  5. 利用cocostudio库函数 实现左右滑动的背包栏UI (cocos2d-x 2.2.0)

    .h #ifndef __COMMON_COMPONENTS__ #define __COMMON_COMPONENTS__ #include "cocos2d.h" #inclu ...

  6. 20个Flutter实例视频教程-01节底部导航栏和切换效果的制作-1

    视频地址: https://www.bilibili.com/video/av39709290?zw 博客地址: https://jspang.com/post/flutterDemo.html#to ...

  7. Objective-C ,ios,iphone开发基础:多个视图(view)之间的切换2,使用导航栏控制,以及视图之间传值。

    首先需要说明的是每个应用程序都是一个window,背景色为黑色.在window上可以跑多个view进行来回切换,下面就通过手动写代码来体现导航栏切换view的原理. 第一步,新建一个single vi ...

  8. JavaScript实现Tab栏切换

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 京东网页上,可以看到下面这种tab栏的切换: 我们把模型抽象出来,实现一 ...

  9. AndroidStudio制作底部导航栏以及用Fragment实现切换功能

    前言 大家好,给大家带来AndroidStudio制作底部导航栏以及用Fragment实现切换功能的概述,希望你们喜欢 学习目标 AndroidStudio制作底部导航栏以及用Fragment实现切换 ...

随机推荐

  1. Linux系统下分割tomcat日志

    在Linux系统下,tomcat日志catalina.out并不会像window系统下,按日期进行重写备份,因此在Linux系统下会造成日志文件过大的情况,本文介绍采用 cronolog工具进行如在w ...

  2. Tomcat 8熵池阻塞变慢详解(转)

    Tomcat 8熵池阻塞变慢详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Tomcat 8启动很慢,且日志上无任何错误,在日志中查看到如下信息: ...

  3. PHP+MySQL中对UTF-8,UTF8(utf8),set names gbk 的理解

    问题一:在我们进行数据库操作时会发现,数据库中表的编码用的是utf-8,但是在进行dos命令是要使用set names gbk (一)Mysql中默认字符集设置有四级:服务器级,数据库级,表级,和字段 ...

  4. Oracle数据库之rownum

    1. 介绍 当我们在做查询时,经常会遇到如查询限定行数或分页查询的需求,MySQL中可以使用LIMIT子句完成,在MSSQL中可以使用TOP子句完成,那么在Oracle中,我们如何实现呢? Oracl ...

  5. HDU 1996

    Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上, ...

  6. Win10的革新与突破

    7月29号win10全球发布,作为微软最后一款操作系统,它会有那些令人期待的革新,作为一个互联网后现代时代,这款操作系统又会融入什么特别元素? 抱着期待,更新了win10后,我花了大概一天的时间,亲身 ...

  7. 显示Mac电脑下的隐藏文件

    1. 在应用程序里打开终端, cd 你的文件夹名 ls -a 即可显示该文件夹下的所有隐藏文件 2. 如果你想打开整个系统的隐藏文件可以在终端下输入以下命令 defaults write com.ap ...

  8. Mac iOS-----PhoneGap 添加条形扫描码插件

    此随笔记录的是通过plugman来安装phonegap插件. 第1步:安装plugman npm install -g plugman QiaodeMacBook-Pro:MyApp root# np ...

  9. 关于Verilog 中的for语句的探讨

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

  10. 单例模式在Unity中的应用

    起因:每个游戏场景中都会有许多的游戏对象,而各个游戏场景之间也是同等的关系.如何去管理它们,是我们要解决的问题. 场景中各脚本间的直接访问,会在各脚本间形成一个巨大而又混乱的网络,这给以后代码的维护带 ...