1、UML图
背包数据类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New Item",menuName ="Inventory/New Item")]
public class Item : ScriptableObject
{
public string itemName;//名
public Sprite itemSprite;//精灵图
public int itemHeld;//持有个数
[TextArea]
public string itemInfo;//描述
public bool equip;
}
背包库存类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName ="New Item", menuName = "Inventory/New Inventory")]
public class Inventory : ScriptableObject
{
public List<Item> itemList = new List<Item>();
}
格子类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Slot : MonoBehaviour
{
public int SlotID;//空格ID 等于 物品ID
public Image slotImage;
public Text slotNum;
public string slotInfo;
public GameObject itemInSlot;
public void ItemOnClicked()
{
InventoryManager.UpdateItemInfo(slotInfo);
}
public void SetupSlot(Item item)
{
if (item == null)
{
itemInSlot.SetActive(false);
return;
}
slotImage.sprite = item.itemSprite;
slotNum.text = item.itemHeld.ToString();
slotInfo = item.itemInfo;
}
}
库存管理类
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;
//public Slot slotPrefab;
public Text itemInformation;
public GameObject EmptySlot;
public List<GameObject> slots = new List<GameObject>();
private void Awake()
{
if (instance != null)
Destroy(this);
instance = this;
}
private void OnEnable()
{
RefreshItem();
instance.itemInformation.text = "";
}
public static void UpdateItemInfo(string itemDescription)
{
instance.itemInformation.text = itemDescription;
}
//public static void CreateNewItem(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.itemSprite;
// newItem.slotNum.text = item.itemHeld.ToString();
//}
public static void RefreshItem()
{
//循环删除slotGrid下的子集物体
for (int i = 0; i < instance.slotGrid.transform.childCount; i++)
{
if (instance.slotGrid.transform.childCount == 0) break;
Destroy(instance.slotGrid.transform.GetChild(i).gameObject);
instance.slots.Clear();
}
//重新生成对应myBag里面的物体的slot
for (int i = 0; i < instance.myBag.itemList.Count; i++)
{
//CreateNewItem(instance.myBag.itemList[i]);
instance.slots.Add(Instantiate(instance.EmptySlot));
instance.slots[i].transform.SetParent(instance.slotGrid.transform);
instance.slots[i].GetComponent<Slot>().SlotID = i;
instance.slots[i].GetComponent<Slot>().SetupSlot(instance.myBag.itemList[i]);
}
}
}
游戏世界物品管理类
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemOnWorld : MonoBehaviour
{
public Item thisItem;
public Inventory playerInventory;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
AddNewItem();
Destroy(gameObject);
}
}
private void AddNewItem()
{
if (!playerInventory.itemList.Contains(thisItem))
{
//playerInventory.itemList.Add(thisItem);
//InventoryManager.CreateNewItem(thisItem);
for (int i = 0; i < playerInventory.itemList.Count; i++)
{
if (playerInventory.itemList[i] == null)
{
playerInventory.itemList[i] = thisItem;
break;
}
}
}
else
{
thisItem.itemHeld += 1;
}
InventoryManager.RefreshItem();
}
}
背包内物体管理类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class ItemOnDrag : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
public Transform originalParent;
public Inventory myBag;
private int currentItemID;//当前物品ID
public void OnBeginDrag(PointerEventData eventData)
{
originalParent = transform.parent;
currentItemID = originalParent.GetComponent<Slot>().SlotID;
transform.SetParent(transform.parent.parent);
transform.position = eventData.position;
GetComponent<CanvasGroup>().blocksRaycasts = false;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData)
{
if (eventData.pointerCurrentRaycast.gameObject != null)
{
if (eventData.pointerCurrentRaycast.gameObject.name == "ItemImage")//判断下面物体名字是:ItemImage 那么互换位置
{
transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform.parent.parent);
transform.position = eventData.pointerCurrentRaycast.gameObject.transform.parent.parent.position;
//itemList的物品存储位置改变
var temp = myBag.itemList[currentItemID];
myBag.itemList[currentItemID] = myBag.itemList[eventData.pointerCurrentRaycast.gameObject.GetComponentInParent<Slot>().SlotID];
myBag.itemList[eventData.pointerCurrentRaycast.gameObject.GetComponentInParent<Slot>().SlotID] = temp;
eventData.pointerCurrentRaycast.gameObject.transform.parent.position = originalParent.position;
eventData.pointerCurrentRaycast.gameObject.transform.parent.SetParent(originalParent);
GetComponent<CanvasGroup>().blocksRaycasts = true;//射线阻挡开启,不然无法再次选中移动的物体
return;
}
if (eventData.pointerCurrentRaycast.gameObject.name == "Slot(Clone)")
{
//否则直接挂载检测到Slot下面
transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);
transform.position = eventData.pointerCurrentRaycast.gameObject.transform.position;
//itemLIst的物品存储位置改变
myBag.itemList[eventData.pointerCurrentRaycast.gameObject.GetComponentInParent<Slot>().SlotID] = myBag.itemList[currentItemID];
//解决自己放在自己位置的问题
if (eventData.pointerCurrentRaycast.gameObject.GetComponent<Slot>().SlotID != currentItemID)
{
myBag.itemList[currentItemID] = null;
}
GetComponent<CanvasGroup>().blocksRaycasts = true;
return;
}
}
//其他任何位置都归位物品
transform.SetParent(originalParent);
transform.position = originalParent.position;
GetComponent<CanvasGroup>().blocksRaycasts = true;
}
}
移动背包类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class MoveBag : MonoBehaviour, IDragHandler
{
public Canvas canvas;
RectTransform currentRect;
private void Awake()
{
currentRect = GetComponent<RectTransform>();
}
public void OnDrag(PointerEventData eventData)
{
currentRect.anchoredPosition += eventData.delta;
}
}