背包系统优化

上一次发的背包其实不能算面向对象。只是一种面向过程的解决了背包的基本需求,这次更新面向对象该怎么实现背包。

多的就不说了,实现的效果是一样的,说一下脚本。

首先抽取一个抽象类BagItem,如下:

using UnityEngine;
//装备种类
public enum EquipType
{//无类型None,//武器Weapon,//防具Armor,//鞋子shoe
}public abstract class BagItem : MonoBehaviour {public EquipType type;//背包格子接收方法public abstract void Receive(Equipment equip);}

然后,装备格子和背包格子用同一个脚本继承此抽象类,如下:

using UnityEngine;public class BoxItem : BagItem
{   //用于判断是否为物品交换位置操作public bool isExchange = false;//重写方法public override void Receive(Equipment equip){   //如果是空的普通格子if (type == EquipType.None && (isExchange || transform.childCount == 0)){    //放入格子SingleTon.GetInstance().SetEquipToBox(equip.transform, transform);}//如果是空的装备格子且类型匹配else if (type != EquipType.None && (isExchange || transform.childCount == 0) && equip.type == type){  //放入格子SingleTon.GetInstance().SetEquipToBox(equip.transform, transform);}else{  //回复原位SingleTon.GetInstance().SetEquipToBox(equip.transform, equip.parent);}//标志位重置isExchange = false;}
}

然后写一个单例,用来执行移位操作

using UnityEngine;
public class SingleTon{private static SingleTon instance;private SingleTon() { }public static SingleTon GetInstance(){if (instance == null){instance = new SingleTon();}return instance;}//将装备放入指定格子public void SetEquipToBox(Transform equip, Transform box){equip.SetParent(box);equip.localPosition = Vector3.zero;equip.GetComponent<Equipment>().parent = box;}}

最后就是在装备上挂上脚本,同样继承抽象类

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;public class Equipment : BagItem,IDragHandler,IBeginDragHandler,IEndDragHandler
{//拿到图片组件private Image image;//记录父对象public Transform parent;void Awake(){   //初始化图片组件image = GetComponent<Image>();}void Start(){    //记录父对象parent = transform.parent;}public void OnBeginDrag(PointerEventData eventData){ //记录父对象parent = transform.parent;//可以理解为把所选装备放在屏幕的最前面以防被其他UI遮挡transform.SetParent(transform.root);//关闭图片射线检测image.raycastTarget = false;}public void OnDrag(PointerEventData eventData){transform.position = Input.mousePosition;}public void OnEndDrag(PointerEventData eventData){ //拿到当前图片下的游戏对象的BagItem组件BagItem bagItem = eventData.pointerEnter.GetComponent<BagItem>();//如果不是空,调用接收方法if (bagItem != null){bagItem.Receive(this);}else{ //否则复位SingleTon.GetInstance().SetEquipToBox(transform, parent);}//开启图片射线检测image.raycastTarget = true;}public override void Receive(Equipment equip){   //获取自己原来的格子BoxItem myBox = parent.GetComponent<BoxItem>();//获取目标的格子BoxItem otherBox = equip.parent.GetComponent<BoxItem>();//如果两个格子有一个是装备格子if (myBox.type != EquipType.None || otherBox.type != EquipType.None){    //且二者类型不匹配if (equip.type != type){ //回到格子的格子myBox.Receive(this);otherBox.Receive(equip);return;}}//程序走到这里,说明发生交换操作,将交换标志设为truemyBox.isExchange = true;otherBox.isExchange = true;//互相接收对方myBox.Receive(equip);otherBox.Receive(this);}}

点个关注,给个赞呗!

一起来玩U3D之背包系统优化相关推荐

  1. 一起来玩U3D之基础物理引擎

    一.人机交互Input类 人机交互的常用外部设备就是我们平时用的那些⿏标.键盘.⼿柄.遥杆.触屏.VR⼿柄.按键.VR 等等一系列.我们就是使用这些与计算机进行交互,下面我们看看U3D中常用 的一些方 ...

  2. 一起来玩U3D之坦克大战(单机)

    The War Of Tanks!!! 项目需求: 主⻆移动.坦克转身.开炮 敌⼈⼯⼚ ⽣成敌⼈ 必须在空地⽣成 随机位置 .每隔3s⽣成⼀辆坦克 .设置敌⼈数量<=50辆 摄像机跟随 炮弹 敌 ...

  3. 华为平板可以安装python_平板电脑能否代替笔记本电脑?平板电脑购买指南

    「更新时间 2021年1月」 平板电脑的选择相较于手机和笔记本要简单许多,因为没有那么多品牌,也没有那么多产品线,选择区间在一个比较小的范围内.在这种情况下,它们之间的价位区分也比较明显,并且各价位段 ...

  4. 关于URP中RendererFeature的使用及毛发效果的几种实现方式

    目录 前言 一.铺垫 二.基于程序网格复制的实现 三.基于程序多材质的实现 四.基于RenderObjects手动配置的实现 4.1.多Pass实现多层毛发 4.2.override material ...

  5. gtx1060 能用catia软件吗_为何垃圾独显作设计比核显强?

    一.前言 也许我们一部分网友曾经觉得核显的性能玩游戏已经比很多低端独显强了,尤其是笔记本方面,觉得性能不如核显或跟核显性能差不多的独显没有存在的必要,那么事实真的如此吗? (本文末尾有精力将整理哪些软 ...

  6. 阿里云GPU可视化计算型实例规格族ga1配置性能详解

    阿里云GPU可视化计算型实例规格族ga1配置性能CPU.内存.适用场景.ga1实例规格族,InstanceTypes分享GPU可视化计算型实例规格族ga1实例详解: GPU可视化计算型实例规格族ga1 ...

  7. Unity3D的脚本-script入门

    Unity3D的基本操作很容易就能掌握了,接下来就是游戏系统的核心部分:脚本. 什么是Script(脚本)?简而言之,就是使用代码来执行一系列动作命令的特殊文本,它需要编译器来从新解读.U3D内部如何 ...

  8. android的pptp设置方法,联想z6pro怎么升级系统?联想Z6 Pro系统更新详细介绍

    6月18日消息 根据联想官方的消息,联想 Z6 Pro现开始灰度推送ZUI 11.0.542,6月17日推送时段:15:00-18:00,新增双景Vlog模式,支持前后同框拍摄视频. 更新日志: 锁屏 ...

  9. 安卓手机adb使用技巧-p40

    adb官网 https://adbshell.com/upload/adb.zip Android 调试桥 (adb)  |  Android 开发者  |  Android Developers G ...

最新文章

  1. Union和Union All到底有什么区别
  2. 澳大利亚研究者研制出一种计算机芯片 他们,快讯:几乎看不见的3D打印机器人;西澳大利亚大学的研究人员开发出一种保护生态机器鱼;效率达CPU一万倍的神经形态芯片发布!...
  3. do not lie on the bed to watch pc or phones
  4. Eclipse to android
  5. JQuery 方法查询大全
  6. ae2021最新遮罩路径图形扭曲插件:BAO Boa for Mac
  7. DirectX 基础学习系列5 纹理映射
  8. mybatis基于XML(二)
  9. 扎克伯格公开信:Facebook拥有五大核心价值
  10. java处理最后一周_Java得到的一周的最后一天的一段时间内
  11. 联想小新air13pro重装系统_小新air13pro改win7系统 联想小新air13pro安装win7系统教程...
  12. 51单片机汇编语言实验及代码
  13. 天线巴伦制作和原理_一种2.4GHz巴伦天线的制作方法
  14. 类似中国知网但是搜索英文文献的权威网站有哪些?
  15. 《天下强汉》6、西汉历史的最后一抹辉煌——绝域名将陈汤
  16. html 旋转木马 轮播,jQuery 3D旋转木马轮播图插件jquery.caroursel.js
  17. 数字电路实验 01 - | TTL门电路的逻辑功能测试
  18. 【数据库系统】——经典示例University数据库建表代码和添加数据(大学系统)
  19. 对话V神:区块链跨链技术大规模应用将在一到两年内爆发
  20. 小程序绑定手机,发送验证码

热门文章

  1. 沿途的向阳花读书笔记
  2. misc中文件无扩展名修复
  3. html5如何设置自动对焦,如何HTML5自动对焦添加到轨道的形式?
  4. /opt/nginx/sbin/nginx: error while loading shared librari
  5. 垃圾邮件过滤python_手把手教你用 python 和 scikit-learn 实现垃圾邮件过滤
  6. MongoDB 2018 深圳年度大会 报告
  7. 机器学习应用开发的典型步骤
  8. oracle游标等待,Oracle Mutex 等待事件之: cursor mutex X
  9. 局域网无法访问发布的网站问题解决
  10. 如何加载 那个大图片