Инвентарь – это набор объектов, содержащих в себе информацию, которую можно использовать в разных местах. Например – название вещи, ссылка на текстуру для отображения в инвентаре, ссылку на префаб для выброса в сцену, ссылку на префаб для одевания и т.д. Все возможные данные, которые необходимы в игре я охватить не могу, так что ограничимся вышеперечисленными.
И начнем мы сразу с кода:
InventoryItem.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using UnityEngine; // элемент инвентаря public class InventoryItem : MonoBehaviour { // название вещи public string itemName; // текстура для инвентаря public Texture2D inventoryTexture; // префаб для сброса вещи public GameObject prefabToDrop; // префаб для одевания public GameObject prefabToEquip; } |
SceneItem.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using UnityEngine; // объект сцены, который можно подобрать public class SceneItem : MonoBehaviour { // префаб для инвентаря public InventoryItem prefab; // если кто-то вошел в триггер, то просим его поднять вещь public void OnTriggerEnter(Collider other) { other.gameObject.SendMessage("Equip", this); } } |
Inventory.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | using System.Collections.Generic; using UnityEngine; // инвентарь public class Inventory : MonoBehaviour { // вещи инвентаря public List items = new List(); // надетые вещи public List equipped = new List(); // отображать ли инвентарь 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) префаб, описывающий объект инвентаря, он в сцене не появляется, а используется по ссылке для создания двух других префабов.
Настройки этих префабов на следующих трех скриншотах в том же порядке.
Собственно сделать из этого рабочий вариант Вам придется самостоятельно, удачи
15 комментариев на «Инвентарь»
Ваш отзыв
Вы должны войти, чтобы оставлять комментарии.
03 марта 2011 в 14:14
Мне очень интересно как это все у вас заработало, если List должен быть однозначно типизирован?)
02 мая 2011 в 9:55
Необязательно List должен быть типизированным.
16 июня 2011 в 15:46
сделайте проект, пожалуйска, у меня не работает
что-то с List
16 июня 2011 в 16:06
Assets/Script/Inventory.cs(9,12): error CS0246: The type or namespace name `List’ could not be found. Are you missing a using directive or an assembly reference?
Вот ошибка. Что делать?
20 июня 2011 в 18:49
to shadow:
а ты подключил System.Collections.Generic ?
24 июня 2011 в 16:33
подключил и в этой строке ошибка
public List items = new List();
нашел пример записи
public List items = new List();
но что вместо Transform написать?
02 Окт 2012 в 22:20
Нужно писать
private List items = new List();
02 Окт 2012 в 22:22
Нужно писать
private List (знак меньше) items = new List (знак меньше)();
странно, тут эти знаки и содержимое в них не отображается.
02 Окт 2012 в 22:24
private List (знак меньше) InventoryItem(знак больше) items = new List (знак меньше) InventoryItem(знак больше) ();
странно, это только у меня или у всех?
04 Ноя 2012 в 11:02
У меня тоже ругается на List , что делать
???
24 Апр 2013 в 8:33
public List Items = new List();
у меня заработало…
24 Апр 2013 в 8:35
public List( знак меньше)InventoryItem(знак больше) Items = new List(знак меньше)InventoryItem(знак больше)();
23 Дек 2013 в 13:31
lewisohn@dora.progandist” rel=”nofollow”>.…
спс….
23 Авг 2014 в 1:49
doric@mel.hessian” rel=”nofollow”>.…
сэнкс за инфу!!…
24 Авг 2014 в 7:31
ometer@erosion.ludmilla” rel=”nofollow”>.…
сэнкс за инфу….