Создание простого Drag&Drop инвентаря в Unity на C#. Часть 2. Сундук с лутом
Всем привет, продолжаем создавать наш инвентарь. В Предыдущем уроке мы создали рабочий прототип инвентаря. В этой части, мы будем делать сундук с лутом и возможность брать из этого сундука предметы. Давайте добавим модельку сундука на сцену и приступим к коду.
Создадим скрипт с именем LootController. Что мы будем делать. Во – первых предметы в сундуке будут генерироваться в случайном порядке и нам необходимо создать список где они будут храниться. Во – вторых создадим вспомогательные переменные, отвечающие за количество предметов в инвентаре.
Код
using UnityEngine; using System.Collections; using System.Collections.Generic;
public class LootController : MonoBehaviour {
public List<Item> LootItem = new List<Item>(); //список с нашим предметами public int MaxSlots; //максимальное кол-во ячеек с предметами
bool used = false; //используется ли инвентарь int slots; //количество ячеек с предметами }
Создаем скрипт с именем InventoryLoot. В этом скрипте мы будем выводить интерфейс сундука. Для начала нам нужно обьявить необходимые. переменные.
Код
using UnityEngine; using System.Collections;
public class InventoryLoot : MonoBehaviour {
const int LOOT_WINDOW_ID = 2; //идентификатор окна public float ButtonSize = 40; //размер ячейки public float CloseWindowAize = 20; //размер кнопки закрытия
bool displayLootWindow = false; //видно ли окно int lootRows = 2; //количество колонок int lootColumns = 6; //количество столбцов public Rect lootRect = new Rect(10, 10, 170, 150); //область окна
void OnGUI() { } }
Обратите внимание на константу LOOT_WINDOW_ID она равна 2. Так, как в предыдущем уроке мы создали 2 окна. Это будет уже третье окно и соответственно его id должен равняться 2. Будьте внимательны если на экране будут одновременно 2 окна с одинаковыми id, в лучшем случае выдаст ошибку, а в худшем Unity зависнет. Далее создаем само окно и кнопки. У нас в сундуке будет 2 строки по 6 столбцов. Так же сделаем так, что бы при нажатии ЛКМ по предмету в сундуке он перемещался в инвентарь. Для начало нужно кое что изменить в скрипте Inventory. Изменяем доступ у словаря InventoryPlayer на public static Dictionary<int, Item> InventoryPlayer = new Dictionary<int, Item>(); Создаем кнопки:
public static LootController _Chest; public static InventoryLoot _Loot;
public float ButtonSize = 40; //размер ячейки public float CloseWindowAize = 20; //размер кнопки закрытия
public bool displayLootWindow = false; //видно ли окно int lootRows = 2; //количество колонок int lootColumns = 6; //количество столбцов Rect lootRect = new Rect(10, 10, 280, 140); //область окна
void Start() { _Loot = this; }
void OnGUI() { if (displayLootWindow) { //создание окна лута в сундуке lootRect = GUI.Window(LOOT_WIN_ID, lootRect, lootChest, "Сундук"); } }
void lootChest(int id) {
//если в сундук не занесено значение выходим из метода
//кнопка закрытия инвентаря if (GUI.Button(new Rect(lootRect.width - 20, 0, CloseWindowAize, CloseWindowAize), "x")) { //запускаем метод очищающий значения ячеек в сундуке clearLoot(); } int pnt = 0; for (int y = 0; y < lootRows; y++) { for (int x = 0; x < lootColumns; x++) { if (pnt < _Chest.LootItem.Count) { //по нажатию мышки предмет перемещается в инвентарь if (GUI.Button(new Rect((10 + (x * ButtonSize)) * 1.09f, 10 + (y * ButtonSize) * 1.09f, ButtonSize, ButtonSize), new GUIContent( _Chest.LootItem[pnt].Textura))) { if (Inventory.InventoryPlayer.Count < 24)//24 это кол-во ячеек в инвентаре { for (int i = 0; i < 24; i++) { if (!Inventory.InventoryPlayer.ContainsKey(i)) { Inventory.InventoryPlayer.Add(i, _Chest.LootItem[pnt]); _Chest.LootItem.RemoveAt(pnt); break; } } } else { } } } else { GUI.Label(new Rect((10 + (x * ButtonSize)) * 1.09f,10 + (y * ButtonSize) * 1.09f, ButtonSize, ButtonSize), (x + y * lootColumns).ToString(), "box"); } pnt++; } } GUI.DragWindow(); }
/// метод отвечающий за видимость инвенторя в сундуке public void displayLoot() { displayLootWindow = true; }
/// Очищаем наш список от предметов void clearLoot() { displayLootWindow = false; _Chest.OnMouseDown(); }
Возвращаемся обратно к скрипту LootController. Сделаем так, что бы при нажатии на сундук открывалался инвентарь с предметами Все необходимые манипуляции мы будем проводить в OnMouseDown().
Код
using UnityEngine; using System.Collections; using System.Collections.Generic;
public class LootController : MonoBehaviour {
public List<Item> LootItem = new List<Item>(); //список с нашим предметами public int MaxSlots; //максимальное кол-во ячеек с предметами
bool used = false; //используется ли инвентарь int slots; //количество ячеек с предметами
public void OnMouseDown() { InventoryLoot._Chest = this; slots = Random.Range(1, MaxSlots); if (Input.GetKey(KeyCode.Mouse0)) { //сохраняем ячейки при первом открытиии и проверяем использовался ли сундук if (!used) populate(slots); InventoryLoot._Loot.displayLoot(); } }
/// запускаем метод который создает слоты в сундуке void populate(int cnt) { for (int x = 0; x < cnt; x++) { LootItem.Add(ItemData._ItemData.ItemGen(Random.Range(0, ItemData._ItemData.Items.Count)));//добавляем в список предметы ItenGenerator._CreateItem() } used = true; }
}
Вот в принципе и все. Вешаем скрипт InventoryLoot на камеру, а LootController на сам сундук в инспекторе задаем значение переменной MaxSlots(Значение не должно превышать 12, т. к. у нас 12 ячеек). Запускаем игру, и пробуем нажать по сундуку(на сундуке должен быть обязательно collider). Вот, что должно получится:
При нажатии ЛКМ по предмету в сундуке он перемещается в инвентарь. Всем пока, в следующем уроке мы будем делать всплывающую подсказку с описанием предмета. Надеюсь все было понятно, так как передать все в тексте очень тяжело(поэтому вскоре будут видео уроки). Если, что спрашивайте или говорите, что хотели бы увидеть Если, что не понятно смотрим исходник.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Создание простого Drag&Drop инвентаря в Unity на C#. Часть 2. Сундук с лутом», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.