Интер фейс
Введение
Названия объектов интерфейса на сцене имеют очень важную роль. По этим названиям Вы будете обращаться к конкретному объекту для работы с ним (показать, скрыть, модифицировать).
Наша система поддерживает основные компоненты, доступные в Unity для работы с интерфейсами:
- RectTransform
- TextMeshProUGUI
- Image
- Button
- ContentSizeFitter
- GridLayoutGroup
- HorizontalLayoutGroup
- VerticalLayoutGroup
Помимо этих компонентов, есть кастомные, которые были немного модифицированы нами, но сохраняют свою логику:
- ScrollView - окно с возможностью скроллинга. Хорошо подходит для создания списков.
- Slider - полоска для выбора количества чего-либо.
- InputField - поле для ввода текста.
Для использования кастомных компонентов, нужно перетащить соответствующий префаб из папки /KotikiServer/customUIcomponents
в проекте Unity.
Эти несколько компонентов были сделаны кастомными для того, чтобы допустить изменение лишь определенных вещей внутри них.
Типы названий
Для удобства и понимания, а также хорошей обратной совместимости между будущими версиями Kotiki Server, рекомендуется в названиях указывать тип объекта, которому присваивается кастомное название:
Text
- если объект имеет компонент TextMeshProUGUIBlock
- если объект является блоком (например, отдельное окно, которое то показывается игроку, то скрывается).Button
- если объект имеет компонент Button
Примеры:
Block:Window1
Text:Text1
Button:Button1
Гайд по названиям
Название, которое Вы присвоили объекту, является как бы ссылкой на этот объект.
Мы не советуем использовать одинаковые названия для разных объектов, если планируется обращение к ним с сервера, так как команда будет выполнена для всех объектов с данным названием
Допустим, есть объект Block:Window1
, который является прямоугольным окном в центре экрана.
И есть объект с компонентом Button (кнопка).
Если мы хотим выполнить простую операцию, а именно показать Window1 пользователю (SetActive(true)
) при нажатии на Button1, мы можем сделать это следующим образом:
Переименовать название кнопки на Button:open(Block:Window1)
Возможные команды:
:open(название)
- применить SetActive(true) для объектов с названием "название":close(название)
- применить SetActive(false) для объектов с названием "название":input(название)
- при нажатии на кнопку с таким ключом, на сервер передастся событиеinputSent
с аргументамиButtonName
,InputName
иInputValue
. В "название" находится название CustomInputField, чтобы значение передалось вInputValue
.
Можно использовать несколько раз таким образом: :input(name1):input(name2):input(name3)
.
:slider(название)
- при нажатии на кнопку с таким ключом, на сервер передастся событиеinputSent
с аргументамиButtonName
,SliderName
иSliderValue
. В "название" находится название CustomSlider, чтобы значение передалось вSliderValue
.
Можно использовать несколько раз таким образом: :slider(name1):slider(name2):slider(name3)
.
Events.on('buttonClicked', (pID, pRef, buttonName, inputs, sliders) => {
//inputs - Массив со всеми CustomInputField, которые были упомянуты в названии кнопки через :input(name)
//sliders - Массив со всеми CustomSlider, которые были упомянуты в названии кнопки через :slider(name)
return;
});
Не исполь зуйте в названиях такие символы: #
, .
, а также символ пробела. Лучше использовать только заглавные и обычные латинские буквы.
Гайд по кнопкам
При нажатии на кнопку, на сервер отправляется событие нажатия на кнопку (с названием кнопки). Таким образом можно узнать, какой игрок нажал на какую кнопку. Чтобы не отправлять событие на сервер, нужно добавить в конец названия кнопки :Silent
.
Пример:
Button:open(Block:Window1):Silent
- открыть окно с названием Block:Window1
, но не отправлять на сервер событие о нажатии на кнопку.
Серверные команды
Для отправки игроку команд с сервера необходимо использовать цепочку методов (Method Chaining), которая начинается с GUI().
, и далее идут операции по-очереди, каждая из которых завершается методом .next()
, после чего используется метод send(playerID)
для отправки всей команды на клиент конкретного игрока с нужным ID.
Формирование цепочки запросов
Примерная команда для интерфейса выглядит так:
GUI().звено1().next().звено2().next()...звеноN().next().send(123);
GUI()
Начальное звено, которое означает инициализацию новой цепочки запросов.
next()
Означает завершение текущего действия в цепочке запросов. Обязательно использовать между запросами и перед вызовом send()
.
send(pID)
pID
(int) - ID игрока, которому нужно отправить запросы.
Вызывается в конце цепочки запросов, после последнего next()
. Без вызова этого метода пользователь не получит команду на изменения в своем интерфейсе, поэтому любая цепочка запросов завершается этим методом.
get(name)
name
(string) - название объекта интерфейса.
Находит объекты в интерфейсе с указанным названием для выполнения команды, которая последует после. Если объектов с таким названием несколько, команда будет выполнена для каждого из этих объектов.
setActive(isActive)
isActive
(bool) - true для активации объекта, false для деактивации.
Показывает или скрывает объект на клиенте игрока. Аналог команды в Unity SetActive(isActive)
.
Пример:
- Включить (отобразить) объект с названием Block:Window1 игроку с ID 123:
GUI().get("Block:Window1").setActive(true).next().send(123);
setText(text)
text
(string) - текст, который нужно указать.
Меняет значение текста в компоненте TextMeshProUGUI. Поддерживает Rich Text.
Пример:
- Установить текст "Hello, World!" в компоненте TextMeshProUGUI для объекта с названием Text:Text1 и чтобы это увидел игрок с ID 123:
GUI().get("Text:Text1").setText("Hello, World!").next().send(123);
setInputPlaceholder(text)
text
(string) - текст, который нужно указать.
Меняет значение текста в Placeholder в компоненте CustomInputField. Поддерживает Rich Text.
Пример:
- Установить текст "Hello, World!" в компоненте CustomInputField для объекта с названием InputField:InputField1 и чтобы это увидел игрок с ID 123:
GUI().get("InputField:InputField1").setInputPlaceholder("Hello, World!").next().send(123);
setInputText(text)
text
(string) - текст, который нужно указать.
Меняет значение текста в text в компоненте CustomInputField. Поддерживает Rich Text.
Пример:
- Установить текст "Hello, World!" в компоненте CustomInputField для объекта с названием InputField:InputField1 и чтобы это увидел игрок с ID 123:
GUI().get("InputField:InputField1").setInputText("Hello, World!").next().send(123);