added basic inventory system

This commit is contained in:
Janis
2023-02-20 20:26:55 +01:00
parent b92e575f71
commit 0b5f3d445f
15 changed files with 273 additions and 21 deletions

View File

@@ -1,34 +1,84 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Inventory : MonoBehaviour
{
[SerializeField] private int slots = 10;
[SerializeField] private int stackSize = 100;
[SerializeField] private List<Item> items = new List<Item>();
public int maxSlots = 20; // maximum number of slots in the inventory
public List<InventoryItem> items = new List<InventoryItem>(); // list of items in the inventory
public Item Add(Item item)
// adds an item to the inventory, returns the quantity of items which could not be added
public int Add(Item item, int count)
{
foreach (Item i in items)
int remainingCount = count;
// check if the item is stackable
if (item.stackable)
{
if (i.uuid == item.uuid) // item already is in list
// look for an existing stack of the same item in the inventory
foreach (InventoryItem invItem in items)
{
if (i.quantity + item.quantity <= stackSize)
{// enough space
i.quantity += item.quantity;
item.quantity = 0;
}
else
{// Not enough space
i.quantity = stackSize;
item.quantity = Mathf.Max(0, i.quantity - item.quantity);
if (invItem.item == item && invItem.count < item.maxStackSize)
{
// add as many items as possible to the stack
int space = item.maxStackSize - invItem.count;
int toAdd = Mathf.Min(space, remainingCount);
invItem.count += toAdd;
remainingCount -= toAdd;
// exit the loop if all items have been added
if (remainingCount == 0)
{
return 0;
}
}
}
}
return item;
// if there is still remaining count, add new stacks of the item
while (remainingCount > 0 && items.Count < maxSlots)
{
int toAdd = Mathf.Min(item.maxStackSize, remainingCount);
items.Add(new InventoryItem(item, toAdd));
remainingCount -= toAdd;
}
// return the quantity of items which could not be added
return remainingCount;
}
// removes an item from the inventory, returns the quantity of items which could not be removed
public int Remove(Item item, int count)
{
int remainingCount = count;
// look for an existing stack of the item in the inventory
for (int i = 0; i < items.Count; i++)
{
InventoryItem invItem = items[i];
if (invItem.item == item)
{
// remove as many items as possible from the stack
int toRemove = Mathf.Min(invItem.count, remainingCount);
invItem.count -= toRemove;
remainingCount -= toRemove;
// remove the stack if it's now empty
if (invItem.count == 0)
{
items.RemoveAt(i);
}
// exit the loop if all items have been removed
if (remainingCount == 0)
{
return 0;
}
}
}
// return the quantity of items which could not be removed
return remainingCount;
}
}

View File

@@ -0,0 +1,18 @@
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
// represents an item in the inventory and its count
[System.Serializable]
public class InventoryItem
{
public Item item;
public int count;
public InventoryItem(Item item, int count)
{
this.item = item;
this.count = count;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 352cc16dc45cea64b92b7fd088daff22
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -8,5 +8,15 @@ public class Item : ScriptableObject
public string uuid;
public string itemName;
public int quantity = 1;
public bool stackable = true;
public int maxStackSize = 100;
private void OnEnable()
{
if (!stackable)
{
maxStackSize = 1;
}
}
}

View File

@@ -0,0 +1,60 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public Item testItem1;
public Item testItem2;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Inventory inventory = GetComponent<Inventory>();
if (Input.GetKeyDown(KeyCode.U))
{
// add 5 apples
int remainingCount = inventory.Add(testItem1, 5);
Debug.Log("Added " + (5 - remainingCount) + " apples to inventory.");
}
if (Input.GetKeyDown(KeyCode.I))
{ // add 15 more apples
int remainingCount = inventory.Add(testItem1, 15);
Debug.Log("Added " + (15 - remainingCount) + " apples to inventory.");
}
if (Input.GetKeyDown(KeyCode.O))
{
// add 10 bananas
int remainingCount = inventory.Add(testItem2, 10);
Debug.Log("Added " + (10 - remainingCount) + " bananas to inventory.");
}
if (Input.GetKeyDown(KeyCode.J))
{
int count = 3;
int applesRemaining = inventory.Remove(testItem1, count);
Debug.Log("Removed " + (count - applesRemaining) + " apples.");
}
if (Input.GetKeyDown(KeyCode.K))
{
int count = 5;
int bananasRemaining = inventory.Remove(testItem2, count);
Debug.Log("Removed " + (count - bananasRemaining) + " bananas.");
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fd29210254821be4dab438ab0312df18
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: