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. mysql 数据sqoop到hive 步骤

    1.hive建表 hive是支持分区的,但是这次建表没有写分区. CREATE TABLE `cuoti_rpt` ( `COURSE_ID` string, `NAME` string, `PERI ...

  2. POJ 1830.开关问题(高斯消元)

    题目链接 Solutin: 将每个开关使用的情况当成未知数,如果开关i能影响到开关j,那么系数矩阵A[j][i]的系数为1. 每个开关增广矩阵的值是开关k的初状态异或开关k的目标状态,这个应该很容易想 ...

  3. HTML TAG FROM MDN

    A <a> <abbr> <acronym> <address> <applet> <area> <article> ...

  4. sed 简明教程

    做个标记 http://coolshell.cn/articles/9104.html sed全名叫stream editor,流编辑器,用程序的方式来编辑文本,相当的hacker啊.sed基本上就是 ...

  5. PHP图片操作

    <?php $filename="http://pic.nipic.com/2007-12-06/2007126102233577_2.jpg";//图片地址//获取图片信息 ...

  6. 通过命令修改wampserver的mysql密码

    WAMP安装好后,mysql教程密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按 ...

  7. 【Linux】vi编辑器命令

       1)进入vi的命令 vi filename :             打开或新建文件,并将光标置于第一行首 vi +n filename :          打开文件,并将光标置于第n行首 ...

  8. Swiper的简单实用方法

    最近项目中有用到一个非常强大的组件idangerous.swiper.js的组件,这个组件能够实现幻灯片的播放效果,而且有各种3D效果,大家可以去试一下,效果很不错的说! 这是这个项目的api文档:h ...

  9. hadoop各版本下载

    http://hadoop.apache.org/ Download Hadoop from the release page. http://hadoop.apache.org/releases.h ...

  10. 接受、online、见刊时,期刊的 IF 都不同,究竟算发几分期刊?