《骑马与砍杀》背包系统实现

一、 效果展示

二、 源代码

1,ItemManager.cs

​​//逻辑简介:该脚本作用是生成背包格子和加载背包物品,获得被拖拽物品和目标物品
//配置:1,需要Scroll View来存放背包物品。
//2,将要作为模板的物品名字更改为EquipSlotTemplate。using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class ItemManager : MonoBehaviour
{[SerializeField] private GameObject currentObject;GameObject EquipSlotTemplate;public static ItemManager instance;Transform content;public GameObject nowItem;public GameObject toItem;public List<Item> itemsList = new List<Item>();//public Dictionary<string, Item> itemsDic = new Dictionary<string, Item>();public Dictionary<int,GameObject> grid=new Dictionary<int,GameObject>();AmourTable amourTable;WeaponTable weaponTable;private void Awake(){amourTable = Resources.Load<AmourTable>("TableData/AmourTable");weaponTable = Resources.Load<WeaponTable>("TableData/WeaponTable");AddItem(amourTable.DataList[0]);//添加装备AddItem(amourTable.DataList[1]);AddItem(amourTable.DataList[2]);AddItem(amourTable.DataList[3]);AddItem(amourTable.DataList[0]);AddItem(amourTable.DataList[0]);AddItem(amourTable.DataList[0]);AddItem(weaponTable.DataList[0]);content = GameObject.Find("Item_Content").transform;EquipSlotTemplate = GameObject.Find("EquipSlotTemplate");if (instance == null){instance = this;}else{Destroy(gameObject);}}private void Start(){int rowCount = 0;int columnCount = 0;float xOffset = 173f;float yOffset = -127f;//生成格子for (int i = 0; i < 20; i++){GameObject equipSlot = Instantiate(EquipSlotTemplate);equipSlot.transform.SetParent(content, false);RectTransform rectTransform = equipSlot.GetComponent<RectTransform>();rectTransform.anchoredPosition = new Vector2(columnCount * xOffset-180f, rowCount * yOffset+82f);columnCount++;if (columnCount >= 3){columnCount = 0;rowCount++;}if (equipSlot.GetComponent<BaseItem>() == null){equipSlot.AddComponent<BaseItem>();}grid.Add(i, equipSlot);}UpdateItem();}private void AddItem(Item item){itemsList.Add(item);}int index = 0;public void UpdateItem(){ //遍历背包物品字典,将背包物品以此赋给格子。foreach (var item in itemsList){grid[index].GetComponent<Image>().sprite = item.sprite;grid[index].GetComponent<BaseItem>().item = item;index++;if (index >= grid.Count){break;}}}}

2,BaseItem.cs

//逻辑简介:拖拽物品时,记录被拖拽物品的初始父物体,被拖拽物品先作为canvas的子物体,拖拽成功后,让被拖拽物品的父物体为目标物体的父物体,目标物体的父物体成为被拖拽物品的的父物体。然后再交换位置。
//配置:1,把Canvas的名称改为StaticCanvas,若不更改的话,需要修改代码canvas = GameObject.Find("StaticCanvas").GetComponent<Canvas>();
//2,所有装备槽有一个父物体。名字为“EquipSlots”。每个装备槽根据类型也要改名为“Head_Slot”等等。背包槽的父物体也要改名为“Item_Content”。
//3,该脚本通过ItemManager挂载到每个物品上。using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class BaseItem :MonoBehaviour,IPointerEnterHandler, IPointerExitHandler, IDragHandler, IBeginDragHandler, IEndDragHandler
{[SerializeField] private GameObject currentObject;RectTransform rectTransform;Canvas canvas;Transform canvasTranform; // 作为临时父级容器,用于装载和移除拖动的图像Transform currentParentTrans;[SerializeField]  Transform itemParentTrans; // 作为临时父级容器,用于装载和移除拖动的图像Image image;public bool hasEquipSlot;Vector2 currentRectTrans;[SerializeField] public Item item;private void Awake() {canvas = GameObject.Find("StaticCanvas").GetComponent<Canvas>();canvasTranform = GameObject.Find("StaticCanvas").transform;rectTransform = GetComponent<RectTransform>();image = GetComponent<Image>();if (item == null){item = new Item();}}private void Start() {if (transform.name == "Head_Slot")//给装备槽 加type{item.type = "头盔";}else if (transform.name == "Clothe_Slot"){item.type = "衣服";}else if (transform.name == "Wrist_Slot"){item.type = "手腕";}else if (transform.name == "Shoes_Slot"){item.type = "鞋子";}else if (transform.name == "Horse_Slot"){item.type = "马匹";}else if (transform.name == "Wepon_Slot"){ item.type = "武器";}currentParentTrans = transform.parent;}public void OnPointerEnter(PointerEventData eventData){currentObject = eventData.pointerEnter;ItemManager.instance.toItem = gameObject;}public void OnPointerExit(PointerEventData eventData){ItemManager.instance.toItem = null;}public void OnBeginDrag(PointerEventData eventData){if (item.name == null){return;}currentRectTrans = rectTransform.anchoredPosition;currentParentTrans = transform.parent;ItemManager.instance.nowItem = gameObject;ItemManager.instance.toItem = null;itemParentTrans = currentObject.transform.parent; //记录当前物体的父物体位置currentObject.transform.SetParent(canvasTranform); //将当前物体移动到临时父级容器}public void OnDrag(PointerEventData eventData){if (item.name == null){return;}transform.GetComponent<Button>().interactable = false;image.raycastTarget = false;// 根据鼠标的移动来调整物体的位置rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;}public void OnEndDrag(PointerEventData eventData){if (item.name == null){return;}Debug.Log(item.sprite);if (ItemManager.instance.toItem == null) //物品栏装备没有拖动到 装备栏和物品栏 即toItem为null {currentObject.transform.SetParent(itemParentTrans);// 将当前物体的位置重置为原始位置rectTransform.anchoredPosition = currentRectTrans;}else if (ItemManager.instance.toItem.transform.parent.name == "EquipSlots"&&currentParentTrans.name=="Item_Content") //物品栏装备拖动到到了装备槽上{//type判断if (ItemManager.instance.nowItem.GetComponent<BaseItem>().item.type == ItemManager.instance.toItem.GetComponent<BaseItem>().item.type){//父类交换ItemManager.instance.nowItem.transform.SetParent(ItemManager.instance.toItem.transform.parent, false);//把这个物体作为装备槽父物体的子物体。ItemManager.instance.toItem.transform.SetParent(currentParentTrans, false);//位置交换Vector2 temp = ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition;//获得装备槽本地坐标ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition = currentRectTrans;ItemManager.instance.nowItem.GetComponent<RectTransform>().anchoredPosition = temp;//把装备槽本地坐标赋值给该物体。}else {currentObject.transform.SetParent(itemParentTrans);rectTransform.anchoredPosition = currentRectTrans;}}else if (currentParentTrans.name=="EquipSlots"&&ItemManager.instance.toItem.transform.parent.name=="Item_Content")//装备栏移动到物品栏 {//判断type是否相同 相同交换位置 或者 不同(装备和格子)也交换位置。if ((ItemManager.instance.nowItem.GetComponent<BaseItem>().item.type == ItemManager.instance.toItem.GetComponent<BaseItem>().item.type) || ItemManager.instance.toItem.GetComponent<BaseItem>().item.name == null){//父类交换ItemManager.instance.nowItem.transform.SetParent(ItemManager.instance.toItem.transform.parent, false);ItemManager.instance.toItem.transform.SetParent(currentParentTrans, false);//位置交换Vector2 temp = currentRectTrans;ItemManager.instance.nowItem.GetComponent<RectTransform>().anchoredPosition = ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition;ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition = temp;ItemManager.instance.nowItem.GetComponent<BaseItem>().item.type = ItemManager.instance.toItem.GetComponent<BaseItem>().item.type;}else{ currentObject.transform.SetParent(itemParentTrans);rectTransform.anchoredPosition = currentRectTrans;}}//物品栏物品相互更换位置else if (ItemManager.instance.toItem.transform.parent.name == "Item_Content" && currentParentTrans.name == "Item_Content")//{//父类交换ItemManager.instance.toItem.transform.SetParent(currentParentTrans);ItemManager.instance.nowItem.transform.SetParent(currentParentTrans);//位置交换Vector2 temp = currentRectTrans;ItemManager.instance.nowItem.GetComponent<RectTransform>().anchoredPosition = ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition;ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition = temp;}//装备栏之间交换位置else if (ItemManager.instance.toItem.transform.parent.name == "EquipSlots" && currentParentTrans.name == "EquipSlots"){if (ItemManager.instance.nowItem.GetComponent<BaseItem>().item.type == ItemManager.instance.toItem.GetComponent<BaseItem>().item.type){//父类交换ItemManager.instance.toItem.transform.SetParent(currentParentTrans);ItemManager.instance.nowItem.transform.SetParent(currentParentTrans);//位置交换Vector2 temp = currentRectTrans;//获得nowItem本地坐标ItemManager.instance.nowItem.GetComponent<RectTransform>().anchoredPosition = ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition;ItemManager.instance.toItem.GetComponent<RectTransform>().anchoredPosition = temp;}else {currentObject.transform.SetParent(itemParentTrans);rectTransform.anchoredPosition = currentRectTrans;}}// 恢复鼠标点击transform.GetComponent<Button>().interactable = true;image.raycastTarget = true;ItemManager.instance.nowItem = null;ItemManager.instance.toItem = null;}}
public class Item
{public int id;public string name;public Sprite sprite;public int price;public string type;
}

3,加载资源

using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "Data/AmourTable", fileName = "AmourTable")]public class AmourTable : ScriptableObject
{public List<AmourTableItem> DataList = new List<AmourTableItem>();public Dictionary<string, AmourTableItem> WeaponDataList = new Dictionary<string, AmourTableItem>();
}
[System.Serializable]public class AmourTableItem:Item
{public int weight;public int defense;}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[CreateAssetMenu(menuName = "Data/ItemTable", fileName = "ItemTable")]public class ItemTable : ScriptableObject
{public List<ItemTableItem> DataList = new List<ItemTableItem>();public Dictionary<string, ItemTableItem> ItemDataList = new Dictionary<string, ItemTableItem>();
}
[System.Serializable]public class ItemTableItem:Item
{public int Price;public int weight;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/437972.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格…

Qt SQLite3数据库加密 QtCipherSqlitePlugin

在客户端软件开发过程中&#xff0c;基本都会涉及到数据库的开发。QT支持的数据库也有好几种&#xff08;QSQLITE, QODBC, QODBC3, QPSQL, QPSQL7&#xff09;&#xff0c;SQLite就是其中之一&#xff0c;但这个 SQLite 是官方提供的开源版本&#xff0c;没有加密功能的。如果对…

如何在 Ubuntu 中安装 Microsoft Edge 浏览器

微软终于聪明了一回&#xff0c;也学会了「打不过就加入」。Microsoft Edge 浏览器的 Linux 稳定版已经于 2020 年 10 月 23 日发布&#xff0c;并提供给 Linux 发行版使用。除了官方 Edge APT 源以外&#xff0c;还提供了.deb和.rpm格式的安装包。 Microsoft Edge 基于 Chrom…

使用WAF防御网络上的隐蔽威胁之反序列化攻击

​ 什么是反序列化 反序列化是将数据结构或对象状态从某种格式转换回对象的过程。这种格式通常是二进制流或者字符串&#xff08;如JSON、XML&#xff09;&#xff0c;它是对象序列化&#xff08;即对象转换为可存储或可传输格式&#xff09;的逆过程。 反序列化的安全风险 反…

计算机毕业设计 | vue+springboot 超市账单管理系统(附源码)

1&#xff0c;绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约&#xff0c;外国人迈克尔库伦开设了第一家合作商店&#xff0c;为了更好地吸引大量客流量&#xff0c;迈克尔库伦精心设计了低价策略&#xff0c;通过大量进货把商品价格压低&#xff0c;通过商店一次性集…

世微AP5151芯片低压差 线性降压 恒流驱动IC 台灯 指示灯 矿灯

概述 AP5151 是一种低压差、线性降压、 固定输出电流的 LED 恒流驱动器。 除 LED 外&#xff0c;AP5151 无需外接其它元 器件即可构成一个恒流输出的 LED 驱动 电路。 AP5151 内置过热保护功能&#xff0c;可有效 保护芯片&#xff0c;避免结温超过 120oC 时因过热 而造成损坏…

宏景-eHR-frcodeaddtreeservlet接口存在SQL注入

指纹特征 FOFA&#xff1a;icon_hash"947874108" || body<div class"hj-hy-all-one-logo" || app"HJSOFT-HCM" 漏洞复现 POST /templates/attestation/../../servlet/FrCodeAddTreeServlet HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windo…

数字艺术展厅有什么好处,搭建数字艺术展厅要注意什么

引言&#xff1a; 数字艺术展厅是一种利用数字科技手段搭建的艺术展览空间&#xff0c;通过数字化展示艺术品&#xff0c;能够为观众带来全新的艺术体验。那么数字艺术展厅有什么好处&#xff0c;搭建数字艺术展厅要注意什么呢&#xff1f; 一、数字艺术展厅的好处 1.创新艺术…

PID校正

一、Introduction to PID Control PID控制是一种应用非常广泛的控制算法。小到控制一个元件的温度&#xff0c;大到控制无人机的飞行姿态和飞行速度等等&#xff0c;都可以使用PID控制。PID(proportion integration differentiation)其实就是指比例&#xff0c;积分&#xff0…

编译Opencv3.3 版本遇到的Cuda版本变更导致:CUDA_nppicom_LIBRARY (ADVANCED)链接找不到的问题根本解法:

前言&#xff1a; Opencv 开源库的使用是必须的&#xff0c;但是&#xff0c;开源项目的特性&#xff0c;造成&#xff0c;版本的依赖性比较复杂&#xff0c; 尤其是针对某一款老硬件的SDK&#xff0c;往往随着某个开源库的使用&#xff0c;导致&#xff0c;无法编译的问题&am…

OpenHarmony—ArkTS限制throw语句中表达式的类型

规则&#xff1a;arkts-limited-throw 级别&#xff1a;错误 ArkTS只支持抛出Error类或其派生类的实例。禁止抛出其他类型&#xff08;例如number或string&#xff09;的数据。 TypeScript throw 4; throw ; throw new Error();ArkTS throw new Error();限制省略函数返回类…

嵌入式系统中C++基础知识精髓

大家好&#xff0c;我在工作经常发现小伙伴们遇到一些C的问题都是对基础知识不熟悉或理解混乱所导致的。正所谓万丈高楼平地起&#xff0c;作为一名合格的程序员来说&#xff0c;没有良好的基本功很难达到一定的高度。而工作中大部分编程问题都是基本功不扎实所导致&#xff0c…