Unity使用ScriptableObject进行本地存储

本人在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]);
        }
    }
}
 

整体效果的实现:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值