Четверг, 25 Апреля 2024, 18:15

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [355]
Статьи об общих понятиях связанных с созданием игр.
Программирование [82]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [145]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [16]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [161]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [129]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Как часто вы играете?
Всего ответов: 1064
Главная » Статьи » Создание игр

Создание простого 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>();
Создаем кнопки:

Код

using UnityEngine;
using System.Collections;

public class InventoryLoot : MonoBehaviour {

  const int LOOT_WIN_ID = 2; //идентефикатор окна
  const float OFFSET = 10;

  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). Вот, что должно получится:

При нажатии ЛКМ по предмету в сундуке он перемещается в инвентарь.
Всем пока, в следующем уроке мы будем делать всплывающую подсказку с описанием предмета.
Надеюсь все было понятно, так как передать все в тексте очень тяжело(поэтому вскоре будут видео уроки). Если, что спрашивайте или говорите, что хотели бы увидеть
Если, что не понятно смотрим исходник.
Категория: Создание игр | Добавил: beril (14 Мая 2014)
Просмотров: 17168 | Комментарии: 1 | Рейтинг: 3.7/15 |
Теги: Unity, Урок, юнити уроки, инвентарь, Разработка игр, RPG, юнити, Drag&Drop, C#, U3D
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Создание простого Drag&Drop инвентаря в Unity на C#. Часть 2. Сундук с лутом», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 1
+3-
1 Gefak   (21 Мая 2014 03:23) [Материал]
Супер

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • BlitzPlus
  • RPG Maker Unite
  • Eternity
  • Godot
  • Scroller Game Creator
  • Fyrox
  • Platfinity
  • Chocolate Doom
  • LawMaker Game Engine
  • Proton
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг