原本以为这东西会如我以往那般代码量并不会过多,但事实是,代码量远超出了我的想象
首先,这个系统参考了codeMonkey大佬的教程,以下是他视频B站的搬运视频的链接,搬运视频的简介里会有油管的原视频链接,我个人建议去看大佬的教程,人家讲的确实好
【搬运】Unity简单背包系统实现 Simple Inventory System in Unity_哔哩哔哩_bilibili
在原来大佬教程的理解上(虽然我现在感觉我是理解了个寂寞)我认为背包系统应该要有方便保存数据的特性,所以保存数据的对象应当尽量的小,并且应尽可能的方便在开发时能尽可能方便的加入新的物品,所以我尝试实现了自己的想法。
接下来是我个人对于背包系统的理解,一种是刻板印象里的背包,如《像素地牢》里面的人物背包主要强调用于保存玩家获得的物品,而另一种并不像刻板印象的背包,但它又如背包那样可以保存,获取,调用,但相比于刻板印象中的背包强调 “保存” 而它是强调 “调用”(类似于《元气骑士》里的武器吧) 与其叫她为背包或许叫它装备更为合适,可能这种的 “背包”真的被称为装备吧,学的不多欢迎指教,总之,不同的 “背包” 侧重点不同,因此背包系统不应像保存数据的系统和对象池一样,有着固定通用的设计思路,应该根据项目的需要定制。
说回正题,因为这个系统涉及的类太多了所以我制作了一个关系图,这样或许能直观点,但是相比于以往少了大量的注释,可能日后会补上吧(终于我也要变成自己讨厌的人了吗?)
以下是各类的脚本代码
首先是ItenData和ItemDataType类(我把它们写一起了)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "ZiZhiLei/物品类", fileName = "ItemData")]
public class ItemData : ScriptableObject //为什么要创建一个ScriptableObject容器而不是写一个脚本的呢
//因为创建脚本要把他挂载到游戏对象上,甚至还要放到场景中(当然,有预制体可能不用)
//而ScriptableObject不用
{
[Header("元素号就是物品对象在list中的位置")]
public List<ItemDataType> list=new List<ItemDataType>();
}
[System.Serializable]
public class ItemDataType
{
//这里的这些数据感觉可以放在一个结构体里
[Tooltip("物品的名字")]
public string name;
[Tooltip("物品的图标")]
public Sprite ItemSprite;
[Tooltip("物品能否堆叠")]
public bool IsStacking;
[Tooltip("物品的数值")]
public float ItemValue;
}
criptableObject容器就跳过了(详情可以参考我以前的帖子)
ItemDataManager类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemDataManager : MonoBehaviour //这个类似于中介将背包类
{
//说一下我对于C#中对委托这一概念的理解,
//委托可以在一个类中调用事先存入的一个另一个类的方法,
//而调用时这个方法还是在拥有哪个方法的类中运行的,
//因此委托只是一个类去调用令一个类的“权限”,
//但是这种调用相比实例化后的直接调用可以更加灵活
public ItemData _itemData;//这里未来可能要改成主动获取而不是挂载
private void Start()
{
}
public ItemDataType GatItemData(int Number)//获取变量
{