У меня нет много времени, чтобы собрать демку, но одну из возможных реализаций инвентаря я смогу показать.
Инвентарь - это набор объектов, содержащих в себе информацию, которую можно использовать в разных местах. Например - название вещи, ссылка на текстуру для отображения в инвентаре, ссылку на префаб для выброса в сцену, ссылку на префаб для одевания и т.д. Все возможные данные, которые необходимы в игре я охватить не могу, так что ограничимся вышеперечисленными.
И начнем мы сразу с кода:
InventoryItem.cs
using UnityEngine;
// элемент инвентаря
public class InventoryItem : MonoBehaviour
{
// название вещи
public string itemName;
// текстура для инвентаря
public Texture2D inventoryTexture;
// префаб для сброса вещи
public GameObject prefabToDrop;
// префаб для одевания
public GameObject prefabToEquip;
}
SceneItem.cs
using UnityEngine;
// объект сцены, который можно подобрать
public class SceneItem : MonoBehaviour
{
// префаб для инвентаря
public InventoryItem prefab;
// если кто-то вошел в триггер, то просим его поднять вещь
public void OnTriggerEnter(Collider other)
{
other.gameObject.SendMessage("Equip", this);
}
}
Inventory.cs
using System.Collections.Generic;
using UnityEngine;
// инвентарь
public class Inventory : MonoBehaviour
{
// вещи инвентаря
public List<InventoryItem> items = new List<InventoryItem>();
// надетые вещи
public List<InventoryItem> equipped = new List<InventoryItem>();
// отображать ли инвентарь
public bool showInventory;
// вспомогательные переменные
private Vector2 _inventoryScroll;
private InventoryItem _itemToDrop = null;
private InventoryItem _itemToEquip = null;
public void Update()
{
// если нужно выбросить вещь
if(_itemToDrop!=null)
{
// удаляем вещь из инвентаря
items.Remove(_itemToDrop);
// создаем в сцене эту вещь на месте, где стоит игрок
Instantiate(_itemToDrop.prefabToDrop, transform.position, transform.rotation);
_itemToDrop = null;
}
// если нужно одеть
if (_itemToEquip != null)
{
// удаляем вещь из инвентаря
items.Remove(_itemToEquip);
// добавляем ее к одетым вещам
equipped.Add(_itemToEquip);
// создаем у игрока эту вещь
GameObject itemGameObject= (GameObject)Instantiate(_itemToEquip.prefabToEquip);
// так как игрок одел вещь, то она является его чайлдом
itemGameObject.transform.parent = transform;
_itemToEquip = null;
}
}
// отображение инвентаря
public void OnGUI()
{
if (showInventory)
{
if(GUI.Button(new Rect(10, 10, 150, 25), "Hide Inventory"))
{
showInventory = !showInventory;
}
GUILayout.BeginArea(new Rect(Screen.width-200, 10, 190, Screen.height-20), GUI.skin.box);
{
_inventoryScroll = GUILayout.BeginScrollView(_inventoryScroll, GUILayout.ExpandHeight(true),GUILayout.ExpandWidth(true));
// рисуем каждую вещь инвентаря
foreach (InventoryItem item in items)
{
GUILayout.BeginVertical(GUI.skin.box);
GUILayout.Label(item.itemName); // Название
GUILayout.BeginHorizontal();
GUILayout.Label(item.inventoryTexture); // Иконка
GUILayout.BeginVertical();
if (GUILayout.Button("Equip")) // Кнопка "надеть"
{
_itemToEquip = item;
}
if (GUILayout.Button("Drop")) // Кнопка "бросить"
{
_itemToDrop = item;
}
GUILayout.EndVertical();
GUILayout.EndHorizontal();
GUILayout.EndVertical();
}
GUILayout.EndScrollView();
}
GUILayout.EndArea();
}
else
{
if (GUI.Button(new Rect(10, 10, 150, 25), "Show Inventory"))
{
showInventory = !showInventory;
}
}
}
// подбор вещи
public void Equip(object item)
{
SceneItem sceneItem = (SceneItem) item;
if (sceneItem!= null)
{
// добавляем вещь в инвентарь
items.Add(sceneItem.prefab);
// уничтожаем объект сцены
Destroy(sceneItem.gameObject);
}
}
}
Итак: Первый скрипт представляет собой описание элемента инвентаря. Второй - описание объекта сцены, на котором должен быть коллайдер в режиме триггера, при входе физического объекта в триггер - объект сцены говорит ему "возьми меня". Третий скрипт представляет собой сам инвентарь и GUI для его отображения. Примерный вид на первом скриншоте.
Каждый элемент инвентаря должен состоять из трех префабов (это в моем примере, у вас может быть меньше или больше): 1) префаб объекта, выбрасываемого в сцену; 2) префаб одеваемого объекта; 3) префаб, описывающий объект инвентаря, он в сцене не появляется, а используется по ссылке для создания двух других префабов.
Настройки этих префабов на следующих трех скриншотах в том же порядке.
Собственно сделать из этого рабочий вариант Вам придется самостоятельно, удачи
Прилагаю дополнительно пакадж со скриптами и префабами, если конечно это вам поможет