本文章记录麦扣老师相关的背包系统代码
首先是ScriptableObject数据存储相关
一个Item类一个Inventory类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName ="NewData",menuName ="Iventory/New Item")]
public class Item : ScriptableObject
{
public string itemName;
public Sprite itemImage;
public int itemHeld =1;
[TextArea]
public string itemInfo;
public bool equal;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName ="New Inventory",menuName = "Iventory/New Inventory")]
public class Iventory : ScriptableObject
{
public List<Item> items = new List<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 ItemNum;
public void ItemOnclick()
{
InventoryManager.UpdateItemInfo(SlotItem.itemInfo);
}
}
数据的获取是InventoryManager->Slot预设体->ScriptableObject
挂载在场景物体的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemOnworld : MonoBehaviour
{
public Item thisItem;
public Iventory playeriventory;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
AddList();
Destroy(gameObject);
}
}
public void AddList()
{
if (!playeriventory.items.Contains(thisItem))
{
playeriventory.items.Add(thisItem);
}
else
{
thisItem.itemHeld += 1;
}
InventoryManager.RefeshItem();
}
}
InventoryManager类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InventoryManager : MonoBehaviour
{
public static InventoryManager Instance;
public Iventory myBag;
public GameObject slotGrid;
public Slot slotPrefab;
public Text itemInformation;
private void Awake()
{
Instance = this;
}
private void OnEnable()
{
RefeshItem();
Instance.itemInformation.text = "";
}
public static void UpdateItemInfo(string itemDes)
{
Instance.itemInformation.text = itemDes;
}
public static void CreateItem(Item item)
{
Slot newItem = Instantiate(Instance.slotPrefab, Instance.slotGrid.transform.position, Quaternion.identity);
newItem.gameObject.transform.SetParent(Instance.slotGrid.transform);
newItem.SlotItem = item;
newItem.SlotImage.sprite = item.itemImage;
newItem.ItemNum.text = item.itemHeld.ToString();
}
public static void RefeshItem()
{
for(int i = 0; i< Instance.slotGrid.transform.childCount; i++)
{
Destroy(Instance.slotGrid.transform.GetChild(i).gameObject);
}
for(int i = 0; i < Instance.myBag.items.Count; i++)
{
CreateItem(Instance.myBag.items[i]);
}
}
}