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实现切换 ...
随机推荐
- LA 6474 Drop Zone (最小割)
题目链接 要添最少的挡板使所有的'D'不存在到达网格外的路径. 以每个格子向四个方向中可以到达的格子连容量为1的边, 从源点向所有'D' 连容量为4的边,网格外的点向汇点连一条容量为4的边. 答案就是 ...
- 【转载】【挖掘Treap的潜力】
原帖: http://fanhq666.blog.163.com/blog/static/819434262011021105212299/ 你的Treap能支持以下操作吗?1.区间增减 2.区间求最 ...
- ios开发相关网站
1.苹果开发者中心(ios Dev Center):最权威的学习ios开发的地方,提供ios开发所能用到的所有内容(包含文档.指南以及实例代码). https://developer.apple.co ...
- websocket以及自定义协议编程一些总结
以下仅供自己翻阅,因为时间久了会忘2.发送缓冲区主要是为了处理发送前一些小内容,可以自己控制flush,或者write的不是那么频繁因为没必要.至于大内容就没必要了.3.其实tcp以上的通信协议也好, ...
- Java compile时,提示 DeadCode的原因
在工程编译时,编译器发现部分代码是无用代码,则会提示:某一行代码是DeadCode.今天compile工程的时候发现某一个循环出现这个问题,如下: public void mouseOver(fina ...
- <select>与<datalist>的区别
size:下拉框中每次出现选项的个数 multiple:可以一次性选多个选项: disabled:时下拉框不可用,无法点击选项 list:它的值应于id的值对应 datalist要与input标签一 ...
- C# 跨线程访问控件
this.BeginInvoke(new Action(() => { this.StatusProgressBar_ExecutingTaskStatus.Value = (int)value ...
- 使用php实现爬虫程序 套取网站的图片实例
<?php //去采集a67 图片 网站链接 http://www.xiamov.com/list/1/p.2 你也可以采集其他网站的图片 //创建链接 dedecms--a67 //设置执行不 ...
- 【技术宅11】php入门运算
//1.空bool $a=''; $b=NULL; $c=false; $d=0; $e='0'; $f=array(); $g=array(array()); $h='NULL'; var_dump ...
- TCP协议握手与分手
TCP(Transmission Control Protocol) 传输控制协议 TCP的7次握手可以理解为3次握手和4次分手. TCP状态转换图,如下: 这个图N多人都知道,它对排除和定位网络或系 ...