HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#Руководства</a></p>
1 <p><a>#Руководства</a></p>
2 <ul><li>31 июл 2019</li>
2 <ul><li>31 июл 2019</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Инвентарь - одна из важнейших деталей игр многих жанров. Однако создать его может быть не так просто, как кажется на первый взгляд.</p>
4 </ul><p>Инвентарь - одна из важнейших деталей игр многих жанров. Однако создать его может быть не так просто, как кажется на первый взгляд.</p>
5 <p> vlada_maestro / shutterstock</p>
5 <p> vlada_maestro / shutterstock</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7 <p>В компоненте<em>Canvas Scaller</em>укажите в <em>UI Scale Mode</em>вариант<em>Scale With Screen</em>. Так размер инвентаря будет зависеть от разрешения экрана. Внутри<em>Panel</em>создайте еще одну панель и назовите ее <em>Items</em>:</p>
7 <p>В компоненте<em>Canvas Scaller</em>укажите в <em>UI Scale Mode</em>вариант<em>Scale With Screen</em>. Так размер инвентаря будет зависеть от разрешения экрана. Внутри<em>Panel</em>создайте еще одну панель и назовите ее <em>Items</em>:</p>
8 <p>Поменяйте цвет и добавьте компонент<em>Grid Layout Group</em> - он позволит расположить компоненты по сетке. Можно указать отступы и размер клеток. Затем добавьте название окна - это еще одна панель с текстом.</p>
8 <p>Поменяйте цвет и добавьте компонент<em>Grid Layout Group</em> - он позволит расположить компоненты по сетке. Можно указать отступы и размер клеток. Затем добавьте название окна - это еще одна панель с текстом.</p>
9 <p>Теперь пора приступить к созданию ячеек. Внутри панели<em>Items</em>создайте кнопку и назовите ее <em>Slot</em>. Внутрь кнопки добавьте<em>Image</em>и назовите этот элемент<em>Icon</em> - в нем будет отображаться спрайт предмета. Также создайте пустой скрипт<em>Slot.cs</em>, а потом сохраните слот как префаб.</p>
9 <p>Теперь пора приступить к созданию ячеек. Внутри панели<em>Items</em>создайте кнопку и назовите ее <em>Slot</em>. Внутрь кнопки добавьте<em>Image</em>и назовите этот элемент<em>Icon</em> - в нем будет отображаться спрайт предмета. Также создайте пустой скрипт<em>Slot.cs</em>, а потом сохраните слот как префаб.</p>
10 <p>После этого можно создать несколько копий ячейки, которые автоматически расположатся по сетке.</p>
10 <p>После этого можно создать несколько копий ячейки, которые автоматически расположатся по сетке.</p>
11 <p>Теперь нужен скрипт, который будет отвечать за открытие и закрытие инвентаря и другой функционал, -<em>Inventory.cs.</em>Прикрепите его к <em>InventoryCanvas.</em></p>
11 <p>Теперь нужен скрипт, который будет отвечать за открытие и закрытие инвентаря и другой функционал, -<em>Inventory.cs.</em>Прикрепите его к <em>InventoryCanvas.</em></p>
12 public class Inventory : MonoBehaviour { private Canvas canvas; void Start() { canvas = GetComponent&lt;Canvas&gt;(); //Получение компонента Canvas canvas.enabled = false; //Отключение инвентаря при старте } void Update() { if (Input.GetKeyDown(KeyCode.I)) { canvas.enabled = !canvas.enabled; //При нажатии на кнопку I окно будет отображаться или скрываться } } }<p>Вот как это выглядит:</p>
12 public class Inventory : MonoBehaviour { private Canvas canvas; void Start() { canvas = GetComponent&lt;Canvas&gt;(); //Получение компонента Canvas canvas.enabled = false; //Отключение инвентаря при старте } void Update() { if (Input.GetKeyDown(KeyCode.I)) { canvas.enabled = !canvas.enabled; //При нажатии на кнопку I окно будет отображаться или скрываться } } }<p>Вот как это выглядит:</p>
13 <p>Рассмотреть создание предметов можно на примере брони для танка. Она будет выглядеть так:</p>
13 <p>Рассмотреть создание предметов можно на примере брони для танка. Она будет выглядеть так:</p>
14 <p>А на танке крепится так:</p>
14 <p>А на танке крепится так:</p>
15 <p>Для начала перетащите спрайт на карту и добавьте ему коллайдер с триггером:</p>
15 <p>Для начала перетащите спрайт на карту и добавьте ему коллайдер с триггером:</p>
16 <p>Триггер нужен, чтобы его объект можно было "подбирать", наезжая на него. Добавьте скрипт<em>Item.cs</em>:</p>
16 <p>Триггер нужен, чтобы его объект можно было "подбирать", наезжая на него. Добавьте скрипт<em>Item.cs</em>:</p>
17 public class Item : MonoBehaviour { public int index = 0; //Номер предмета, в этой игре будет всего 3 типа брони, поэтому писать более сложный скрипт нет смысла void OnTriggerEnter2D(Collider2D obj) //"Наезд" на объект { if (obj.transform.tag == "Player") { obj.GetComponent&lt;Items&gt;().AddItem(index);//Если наехал игрок, то он сможет подобрать предмет Destroy(gameObject); //Удаление объекта с карты } } }<p>Вот как будет выглядеть подбор предмета:</p>
17 public class Item : MonoBehaviour { public int index = 0; //Номер предмета, в этой игре будет всего 3 типа брони, поэтому писать более сложный скрипт нет смысла void OnTriggerEnter2D(Collider2D obj) //"Наезд" на объект { if (obj.transform.tag == "Player") { obj.GetComponent&lt;Items&gt;().AddItem(index);//Если наехал игрок, то он сможет подобрать предмет Destroy(gameObject); //Удаление объекта с карты } } }<p>Вот как будет выглядеть подбор предмета:</p>
18 <p>Пока скрипт<em>Items.cs</em>не создан, поэтому попытка его вызова может привести к ошибке - закомментируйте строку<em>obj.GetComponent&lt;Items&gt;().AddItem (index);</em></p>
18 <p>Пока скрипт<em>Items.cs</em>не создан, поэтому попытка его вызова может привести к ошибке - закомментируйте строку<em>obj.GetComponent&lt;Items&gt;().AddItem (index);</em></p>
19 <p>Создайте скрипт<em>Items.cs</em>и добавьте его персонажу:</p>
19 <p>Создайте скрипт<em>Items.cs</em>и добавьте его персонажу:</p>
20 public class Items : MonoBehaviour { public int[] items = new int[] { 0, 5, 10, 15, 20, 25 }; public bool[] hasItems = new bool[] { true, true, false, false, false, false }; private int currItem = 0; public int defence = 0; public GameObject armorObject; public Sprite[] sprites; public void Equip(int index) { if (hasItems[index]) { currItem = index; defence = items[currItem]; armorObject.GetComponent&lt;SpriteRenderer&gt;().sprite = sprites[currItem]; } } public void AddItem(int index) { hasItems[index] = true; } }<p>Перед запуском игры нужно немного изменить персонажа. Создайте пустой объект и перетащите ему все компоненты персонажа. Сам же спрайт поместите внутрь этого объекта. Также нужно создать объект<em>Armor</em> - ему будет задаваться спрайт текущей брони:</p>
20 public class Items : MonoBehaviour { public int[] items = new int[] { 0, 5, 10, 15, 20, 25 }; public bool[] hasItems = new bool[] { true, true, false, false, false, false }; private int currItem = 0; public int defence = 0; public GameObject armorObject; public Sprite[] sprites; public void Equip(int index) { if (hasItems[index]) { currItem = index; defence = items[currItem]; armorObject.GetComponent&lt;SpriteRenderer&gt;().sprite = sprites[currItem]; } } public void AddItem(int index) { hasItems[index] = true; } }<p>Перед запуском игры нужно немного изменить персонажа. Создайте пустой объект и перетащите ему все компоненты персонажа. Сам же спрайт поместите внутрь этого объекта. Также нужно создать объект<em>Armor</em> - ему будет задаваться спрайт текущей брони:</p>
21 <p>Теперь нужно сделать так, чтобы подобранные предметы отображались в инвентаре. Для этого добавьте вот такой код в скрипт<em>Slot.cs</em>:</p>
21 <p>Теперь нужно сделать так, чтобы подобранные предметы отображались в инвентаре. Для этого добавьте вот такой код в скрипт<em>Slot.cs</em>:</p>
22 public class Slot : MonoBehaviour { public Sprite sprite; //Спрайт брони для этого слота public Image icon; //Иконка, куда будет прикрепляться спрайт public void UpdateSlot(bool active) //Обновление слота { if (active) { icon.sprite = sprite; } else { icon.sprite = null; } } }<p>Чтобы новый скрипт работал, нужно добавить новый функционал в <em>Inventory.cs:</em></p>
22 public class Slot : MonoBehaviour { public Sprite sprite; //Спрайт брони для этого слота public Image icon; //Иконка, куда будет прикрепляться спрайт public void UpdateSlot(bool active) //Обновление слота { if (active) { icon.sprite = sprite; } else { icon.sprite = null; } } }<p>Чтобы новый скрипт работал, нужно добавить новый функционал в <em>Inventory.cs:</em></p>
23 public class Inventory : MonoBehaviour { private Canvas canvas; public GameObject player; private Items items; public Transform inventorySlots; private Slot[] slots; void Start() { canvas = GetComponent&lt;Canvas&gt;(); canvas.enabled = false; items = player.GetComponent&lt;Items&gt;(); slots = inventorySlots.GetComponentsInChildren&lt;Slot&gt;(); //Получение всех ячеек } void Update() { if (Input.GetKeyDown(KeyCode.I)) { UpdateUI(); //Обновление интерфейса canvas.enabled = !canvas.enabled; } } void UpdateUI() { for (int i = 0; i &lt; slots.Length; i++) //Проверка всех предметов { bool active = false; if (items.hasItems[i]) //Если такой предмет есть у пользователя, то он будет отображаться в слоте { active = true; } slots[i].UpdateSlot(active); } } }<p>Вот как выглядит инвентарь с предметами:</p>
23 public class Inventory : MonoBehaviour { private Canvas canvas; public GameObject player; private Items items; public Transform inventorySlots; private Slot[] slots; void Start() { canvas = GetComponent&lt;Canvas&gt;(); canvas.enabled = false; items = player.GetComponent&lt;Items&gt;(); slots = inventorySlots.GetComponentsInChildren&lt;Slot&gt;(); //Получение всех ячеек } void Update() { if (Input.GetKeyDown(KeyCode.I)) { UpdateUI(); //Обновление интерфейса canvas.enabled = !canvas.enabled; } } void UpdateUI() { for (int i = 0; i &lt; slots.Length; i++) //Проверка всех предметов { bool active = false; if (items.hasItems[i]) //Если такой предмет есть у пользователя, то он будет отображаться в слоте { active = true; } slots[i].UpdateSlot(active); } } }<p>Вот как выглядит инвентарь с предметами:</p>
24 <p>За надевание предмета будет отвечать скрипт<em>Items:</em></p>
24 <p>За надевание предмета будет отвечать скрипт<em>Items:</em></p>
25 public class Items : MonoBehaviour { public int[] items = new int[] { 0, 5, 10, 15, 20, 25 }; //Список характеристик предметов public bool[] hasItems = new bool[] { true, true, false, false, false, false }; //Наличие предметов private int currItem = 0; //Текущий предмет public int defence = 0; //Защита public GameObject armorObject; public Sprite[] sprites; public void Equip(int index) //Метод надевания предмета { if (hasItems[index]) //Если такой предмет есть { currItem = index; defence = items[currItem]; armorObject.GetComponent&lt;SpriteRenderer&gt;().sprite = sprites[currItem]; //Изменение спрайта } } public void AddItem(int index) { hasItems[index] = true; //Добавление предмета при подборе } }<p>Теперь метод<em>Equip ()</em>нужно прикрепить к слоту и указать его номер. Первая ячейка должна идти под номером 0, вторая - под 1 и так далее:</p>
25 public class Items : MonoBehaviour { public int[] items = new int[] { 0, 5, 10, 15, 20, 25 }; //Список характеристик предметов public bool[] hasItems = new bool[] { true, true, false, false, false, false }; //Наличие предметов private int currItem = 0; //Текущий предмет public int defence = 0; //Защита public GameObject armorObject; public Sprite[] sprites; public void Equip(int index) //Метод надевания предмета { if (hasItems[index]) //Если такой предмет есть { currItem = index; defence = items[currItem]; armorObject.GetComponent&lt;SpriteRenderer&gt;().sprite = sprites[currItem]; //Изменение спрайта } } public void AddItem(int index) { hasItems[index] = true; //Добавление предмета при подборе } }<p>Теперь метод<em>Equip ()</em>нужно прикрепить к слоту и указать его номер. Первая ячейка должна идти под номером 0, вторая - под 1 и так далее:</p>
26 <p>Теперь пора проверить, как всё это работает:</p>
26 <p>Теперь пора проверить, как всё это работает:</p>
27 <p>Инвентарь - достаточно сложный игровой компонент. В этой статье был разобран лишь минимальный функционал. Кроме него, можно реализовать еще много всего интересного: влияние предметов на характеристики персонажа, выкидывание предметов, передачу их другим игрокам, лут и многое другое.</p>
27 <p>Инвентарь - достаточно сложный игровой компонент. В этой статье был разобран лишь минимальный функционал. Кроме него, можно реализовать еще много всего интересного: влияние предметов на характеристики персонажа, выкидывание предметов, передачу их другим игрокам, лут и многое другое.</p>
28 <p>Если вы хотите лучше изучить работу с Unity, записывайтесь на курс "<a>Профессия разработчик игр на Unity</a>". Вы научитесь создавать все основные компоненты для игры и сможете работать над крупными проектами.</p>
28 <p>Если вы хотите лучше изучить работу с Unity, записывайтесь на курс "<a>Профессия разработчик игр на Unity</a>". Вы научитесь создавать все основные компоненты для игры и сможете работать над крупными проектами.</p>
29 <a>Научитесь: Профессия Разработчик игр на Unity с нуля Узнать больше</a>
29 <a>Научитесь: Профессия Разработчик игр на Unity с нуля Узнать больше</a>