背包系统优化

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

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

首先抽取一个抽象类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. 在线作图|如何绘制一张好看的点棒图
  2. Spring Security 实战干货:自定义配置类入口 WebSecurityConfigurerAdapter
  3. FastReport.net分组排序、打印顺序、分页、函数使用语法、数据块编辑
  4. dbgrid的最小高度设置。否则出现滚动条。
  5. js table 生成序号_CSS Counter 以及 CSS content 内容生成技术的实用价值
  6. pytorch自定义初始化权重
  7. shellshock漏洞回顾
  8. JAVA Eclipse如何设置点击按钮切换图片
  9. 最通俗PLC教程—源自Koyo光洋PLC自学总结(1)
  10. 2021年网络工程师中级考点笔记
  11. centos7安装Memcached
  12. Xcode failed to get reply to handshake packet
  13. java复数类实部_Java编写一个复数类Complex,具有实部、虚部成员变量,可以完成加、减、乘、除和获得实部和虚部的方法...
  14. win7与深度(Deepin)linux 双系统启动顺序调整
  15. 如何在地图上显示多个红包商店 vue
  16. 如何使用VLC媒体播放软件下载网页上视频?
  17. coe_xfr_sql_profile.sql和coe_load_sql_profile.sql
  18. VB 2010 (20)多态性
  19. Homekit智能家居创意DIY一智能灯
  20. 【Python】Python系列教程-- Python3 编程第一步(十八)

热门文章

  1. 《SEM运营36计》第10计:笑里藏刀
  2. zabbix监控-企业微信webhook告警并使用markdown格式
  3. 天猫精灵控制8266 服务器环境
  4. 全角半角符号引发的Entity Framework奇遇记
  5. TCP/IP协议模型详解四ICMP、ICMPv6
  6. 西游记中孙悟空为什么总是欺负捉弄嘲笑猪八戒?
  7. vnc连接不上解决问题方法
  8. netmask的作用
  9. ACM-ICPC2014北京邀请赛感受
  10. 第三方谷歌市场替代软件Blackmart 可用下载Google Play 上的应用