Demon_背包系统(实现装备栏,背包栏,可以切换装备)

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_背包系统(实现装备栏,背包栏,可以切换装备)的更多相关文章
- 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- jQuery----左侧导航栏面板切换实现
页面运行结果: 点击曹操 点击刘备 点击孙权 原图 需求说明:原图如上所示,点击一方诸侯的时候 ...
- 导航栏图标切换:click事件,hover事件
最近再做一个基于angular6的项目,导航栏需求:1.hover切换图标 2.click切换图标 先用jquery实现功能,在在angular组件里面实现. demo如下: <!DOCTYPE ...
- android下ViewPager的使用,带下部选项栏的切换动画
(文章针对类似我这种初学者,大神看到不要嘲笑) 演示 我的规矩是先上GIF动画效果(Linux下用转的GIF,清晰度还可以但是不知道为什么放博客上,界面会这么大): 代码: android中有View ...
- 利用cocostudio库函数 实现左右滑动的背包栏UI (cocos2d-x 2.2.0)
.h #ifndef __COMMON_COMPONENTS__ #define __COMMON_COMPONENTS__ #include "cocos2d.h" #inclu ...
- 20个Flutter实例视频教程-01节底部导航栏和切换效果的制作-1
视频地址: https://www.bilibili.com/video/av39709290?zw 博客地址: https://jspang.com/post/flutterDemo.html#to ...
- Objective-C ,ios,iphone开发基础:多个视图(view)之间的切换2,使用导航栏控制,以及视图之间传值。
首先需要说明的是每个应用程序都是一个window,背景色为黑色.在window上可以跑多个view进行来回切换,下面就通过手动写代码来体现导航栏切换view的原理. 第一步,新建一个single vi ...
- JavaScript实现Tab栏切换
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 京东网页上,可以看到下面这种tab栏的切换: 我们把模型抽象出来,实现一 ...
- AndroidStudio制作底部导航栏以及用Fragment实现切换功能
前言 大家好,给大家带来AndroidStudio制作底部导航栏以及用Fragment实现切换功能的概述,希望你们喜欢 学习目标 AndroidStudio制作底部导航栏以及用Fragment实现切换 ...
随机推荐
- Linux技巧总结(个人经验版)
1:善用桌面:1.图形界面的编辑,2.终端只要开机就在第2桌面,3.浏览器在第3桌面,4.娱乐在第4桌面. 2:cd命令中,输入中文目录很不方便,用 ln -s 桌面 desktop 创建软链接,不必 ...
- 在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开
在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开,使用V10版本没问题,但2015中默认使用的就是V12版本,所以需要避免使用V12版本
- 封装cookie组件
var Cookie = { // 读取 get: function(name){ var cookieStr = "; "+document.cookie+"; &qu ...
- ThinkPHP 自动验证与自动填充无效可能的原因
原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇 ...
- ECSHOP在商品详细页面上获取该商品的顶级分类id和名称
在 goods.php 文件, 找到 $smarty->assign('goods', $goods); 在它上面增加下面代码: 方法一: $cat_arr = get_parent_cats( ...
- Notepad++插件之FingerText
FingerText是一个标签触发片段插件记事本.支持多个热点同时编辑,嵌套的热点,动态热点(很多不仅仅是纯文本的,可以通过命令,或触发另一个片段中的片段),热点的文本提示(而不是仅仅是$或#号)和热 ...
- KVO初探
一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应 ...
- centos 下vmware 下添加硬盘到root
### #vmware 里找到硬盘拖大点...,如果不想从启动么,添加个新 #的也行.不过那个是另外的方法了 ### #### ##找下硬盘添加在哪里 #### fdisk -l //创建分 ...
- bzoj3047: Freda的传呼机 && 2125: 最短路
Description 为了随时与rainbow快速交流,Freda制造了两部传呼机.Freda和rainbow所在的地方有N座房屋.M条双向光缆.每条光缆连接两座房屋,传呼机发出的信号只能沿着光缆传 ...
- 学习 html5 需要学习的 基本 库
jquery backbone bootstrap underscore appframework require.js