Инвентарь – это набор объектов, содержащих в себе информацию, которую можно использовать в разных местах. Например – название вещи, ссылка на текстуру для отображения в инвентаре, ссылку на префаб для выброса в сцену, ссылку на префаб для одевания и т.д. Все возможные данные, которые необходимы в игре я охватить не могу, так что ограничимся вышеперечисленными.

И начнем мы сразу с кода:
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) префаб, описывающий объект инвентаря, он в сцене не появляется, а используется по ссылке для создания двух других префабов.
Настройки этих префабов на следующих трех скриншотах в том же порядке.

Собственно сделать из этого рабочий вариант Вам придется самостоятельно, удачи ;)

VN:F [1.9.3_1094]
Rating: 8.0/10 (30 votes cast)
VN:F [1.9.3_1094]
Rating: +14 (from 18 votes)
Инвентарь, 8.0 out of 10 based on 30 ratings

15 комментариев на «Инвентарь»

  1. BlackGray
    BlackGray пишет:

    Мне очень интересно как это все у вас заработало, если List должен быть однозначно типизирован?)

    VN:F [1.9.3_1094]
    Rating: 4.2/5 (6 votes cast)
    VN:F [1.9.3_1094]
    Rating: +4 (from 8 votes)
  2. Lord_F
    Lord_F пишет:

    Необязательно List должен быть типизированным.

    VN:F [1.9.3_1094]
    Rating: 5.0/5 (3 votes cast)
    VN:F [1.9.3_1094]
    Rating: +2 (from 4 votes)
  3. shadow
    shadow пишет:

    сделайте проект, пожалуйска, у меня не работает
    что-то с List

    VN:F [1.9.3_1094]
    Rating: 5.0/5 (4 votes cast)
    VN:F [1.9.3_1094]
    Rating: 0 (from 2 votes)
  4. shadow
    shadow пишет:

    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?

    Вот ошибка. Что делать?

    VN:F [1.9.3_1094]
    Rating: 5.0/5 (3 votes cast)
    VN:F [1.9.3_1094]
    Rating: +4 (from 6 votes)
  5. malish1990
    malish1990 пишет:

    to shadow:
    а ты подключил System.Collections.Generic ?

    VN:F [1.9.3_1094]
    Rating: 4.0/5 (4 votes cast)
    VN:F [1.9.3_1094]
    Rating: +3 (from 5 votes)
  6. shadow
    shadow пишет:

    подключил и в этой строке ошибка
    public List items = new List();

    нашел пример записи
    public List items = new List();
    но что вместо Transform написать?

    VN:F [1.9.3_1094]
    Rating: 4.0/5 (4 votes cast)
    VN:F [1.9.3_1094]
    Rating: +1 (from 3 votes)
  7. Spasesity
    Spasesity пишет:

    Нужно писать
    private List items = new List();

    VN:F [1.9.3_1094]
    Rating: 1.0/5 (1 vote cast)
    VN:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  8. Spasesity
    Spasesity пишет:

    Нужно писать
    private List (знак меньше) items = new List (знак меньше)();
    странно, тут эти знаки и содержимое в них не отображается.

    VN:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  9. Spasesity
    Spasesity пишет:

    private List (знак меньше) InventoryItem(знак больше) items = new List (знак меньше) InventoryItem(знак больше) ();
    странно, это только у меня или у всех?

    VN:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  10. Tipo_KoT
    Tipo_KoT пишет:

    У меня тоже ругается на List , что делать :? ???

    VN:F [1.9.3_1094]
    Rating: 5.0/5 (1 vote cast)
    VN:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  11. kozirandrey
    kozirandrey пишет:

    public List Items = new List();
    у меня заработало…

    VN:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  12. kozirandrey
    kozirandrey пишет:

    public List( знак меньше)InventoryItem(знак больше) Items = new List(знак меньше)InventoryItem(знак больше)();

    VN:F [1.9.3_1094]
    Rating: 1.0/5 (1 vote cast)
    VN:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  13. Armando

    lewisohn@dora.progandist” rel=”nofollow”>.…

    спс….

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  14. Max

    doric@mel.hessian” rel=”nofollow”>.…

    сэнкс за инфу!!…

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  15. allen

    ometer@erosion.ludmilla” rel=”nofollow”>.…

    сэнкс за инфу….

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)

Ваш отзыв

Вы должны войти, чтобы оставлять комментарии.



Страница 1 of 0