本人在B站Up主M_Studio的视频中学习了使用该方法进行本地存储,下面是代码和实现效果
原视频链接:
单个物品的属性以及信息:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 鼠标右击会显示该菜单
/// </summary>
[CreateAssetMenu(fileName ="New Item",menuName ="Inventory/New Item")]
//创建一个包含下面属性的物体
public class Item : ScriptableObject
{
public string itemName;//物品名称
public Sprite itemImage;//物品图片
public int itemHeld;//持有个数
[TextArea]
public string itemInfo;//物品描述
public bool equip;//是否是装备
}
背包列表:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 鼠标右击会显示该菜单
/// </summary>
[CreateAssetMenu(fileName = "New Item",menuName = "Inventory/New Inventory")]
//创建一个用来存放物品的背包列表
public class Inventory : ScriptableObject
{
public List<Item> itemList = new List<Item>();
}
在背包中实例化的item信息:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Slot : MonoBehaviour
{
public Item slotItem;
public Image slotImage;
public Text slotNum;
/// <summary>
/// 点击该物品的时候在背包管理器中显示物品信息
/// </summary>
public void ItemOnClick()
{
InventoryManager.UpdateItemInfo(slotItem.itemInfo);
}
}
物品在世界中的事件信息
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemOnWorld : MonoBehaviour
{
public Item thisItem;
public Inventory myBag;
private void OnMouseUpAsButton()
{
Debug.Log("鼠标点击");
Destroy(gameObject);
AddNewItem();
}
/// <summary>
/// 在背包中添加新的物品或增加物品个数
/// </summary>
public void AddNewItem()
{
if (!myBag.itemList.Contains(thisItem))
{
myBag.itemList.Add(thisItem);
//InventoryManager.CreateNewItem(thisItem);
}
else
thisItem.itemHeld += 1;
//刷新背包
InventoryManager.RefreshItem();
}
}
整个管理器,负责背包物品的信息创建和刷新
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InventoryManager : MonoBehaviour
{
static InventoryManager Instance;
public Inventory myBag;//背包
public GameObject slotGrid;//放置item的位置
public Slot slotPrefab;//要实例化的item
public Text itemInfo;//item的信息
private void Awake()
{
Instance = this;
}
private void OnEnable()
{
RefreshItem();
}
/// <summary>
/// 显示物品信息
/// </summary>
/// <param name="Info"></param>
public static void UpdateItemInfo(string Info)
{
Instance.itemInfo.text = Info;
}
/// <summary>
/// 在背包中创建该item
/// </summary>
/// <param name="item"></param>
public static void CreateNewItem(Item item)
{
Slot newItem = GameObject.Instantiate(Instance.slotPrefab, Instance.slotGrid.transform.position, Quaternion.identity);
newItem.transform.SetParent(Instance.slotGrid.transform, false);
newItem.slotItem = item;
newItem.slotImage.sprite = item.itemImage;
newItem.slotNum.text = item.itemHeld.ToString();
}
/// <summary>
/// 刷新背包里的item
/// </summary>
public static void RefreshItem()
{
//清除背包中所有的物品
for (int i = 0; i < Instance.slotGrid.transform.childCount; i++)
{
if (Instance.slotGrid.transform.childCount == 0)
return;
Destroy(Instance.slotGrid.transform.GetChild(i).gameObject);
}
//创建背包列表中的物品
for (int i = 0; i < Instance.myBag.itemList.Count; i++)
{
CreateNewItem(Instance.myBag.itemList[i]);
}
}
}
整体效果的实现: