Методы
Список доступных функций и объектов для работы с игроками и объектами на сервере.
Объект игрока
API.movePlayer (pRef, x, y)
Перемещает объект игрока на сервере в указанные координаты.
pRef
(object) - ссылка на объект игрока (API.players[ID])x
(float number) - позиция координаты x на локации.y
(float number) - позиция координаты y на локации.
Пример создания и перемещения объекта:
let ID = 1; // player ID
let playerReference = API.players[ID];
API.movePlayer(playerReference, 105, 105);
Мы рекомендуем изучить информацию о следующем методе (API.forcePlayerPosition), чтобы определиться, какой метод подойдет в Вашей конкретной ситуации.
Если игрок перемещается с помощью метода API.movePlayer не очень далеко от текущего места, на клиенте игрока визуально ничего не изменится, так как такое перемещение посчитается клиентом игры за возможные лаги сервера, из-за которых игрок не успел добежать до того места, где он сейчас стоит у себя на клиенте. Иными словами, клиент игрока продолжит посылать серверу команды на перемещение игрока в текущую точку, где стоит клиент.
Со стороны для других игроков это будет выглядеть так: игрок резко переместился недалеко от прошлой позиции, а зачем резко начал бежать обратно на свою позицию.
Чтобы этого не происходило, для таких ситуаций нужно почти всегда использовать метод API.forcePlayerPosition.
API.forcePlayerPosition (pRef, x, y)
Перемещает игрока в нужное место, и сообщает клиенту игрока, что он резко переместился в указанные координаты. Метод используется для того, чтобы мгновенно телепортировать игрока в указанные координаты.
pRef
(object) - ссылка на объект игрока (API.players[ID])x
(float number) - позиция координаты x на локации.y
(float number) - позиция координаты y на локации.
Пример создания и перемещения объекта:
let ID = 1; // player ID
let playerReference = API.players[ID];
API.forcePlayerPosition(playerReference, 105, 105);
API.movePlayer рекомендуется использовать не для игроков, управляемых игроками, а для игроков-ботов, создаваемых логикой игры через метод API.createBot. Потому что боты не управляются клиентом (игроком), а значит не нуждаются в том, чтобы им сообщали об их собственных перемещениях.
API.kickPlayer (ID)
Выкидывает игрока из комнаты, сохраняя его прогресс (свойство .objs) и удаляя его из API.players.
ID
(number) - ID игрока.
Пример:
API.kickPlayer(ID);
API.createBot (x, y) : number
x
(float number) - позиция координаты x на локации.y
(float number) - позиция координаты y на локации.
Создает игрока-бота, который никем не управляется. К такому игроку-боту можно применять любые методы, применимые и к обычным игрокам, кроме API.kickPlayer и API.forcePlayerPosition.
ID бота является отрицательным числом, чтобы не пересекаться с потенциальными ID игроков.
Метод возвращает ID cозданного бота, чтобы можно было получить референс его объекта:
let botID = API.createBot(100, 100); // создаем бота и получаем его ID
let botReference = API.players[botID]; // получаем референс на объект бота
console.log("Bot has been created. Bot's ID:", botID);
API.deleteBot (ID)
ID
(number) - ID бота, которого нужно удалить.
Удаляет бота с указанным ID.
let botID = API.createBot(100, 100); // создаем бота и получаем его ID
let botReference = API.players[botID]; // получаем референс на объект бота
console.log("Bot has been created. Bot's ID:", botID);
API.deleteBot(botID);
console.log("Bot has been deleted. Bot's ID was:", botID);
Объекты
API.createObject (prefabName, owner, x, y): number
Создает объект из префаба в указанной позиции.
prefabName
(string) - название префаба, копию которого нужно создать.creator
(object) - владелец объекта (базовое значение: "server").x
(float number) - позиция координаты x на локации.y
(float number) - позиция координаты y на локации.
Возвращает ID созданного объекта
.
Пример владельца игрока: {"p": pID}
. Если игрок с указанным ID отключается, то объект будет автоматически удален.
Помимо просто ID, можно указать еще и свойство объекта игрока с определенным значением в виде массива playerConditions. Если значение поменяется, или свойство будет удалено, объект также будет удален.
Пример:
// Если pRef.name1 не существует, или он не равен "value1", созданный ниже объект будет сразу удален.
let _objectID = API.createObject("Object", {"p": pRef.id, "playerConditions": [{"property": "name1", "value": "value1"}]}, _x, _y);
Пример создания объекта из префаба Prefab1 без владельца и находящийся на координатах x:100 y:100
:
let objectID = API.createObject("Prefab1", "server", 100, 100);
API.moveObject (objectReference, x, y)
Перемещает объект в нужное место.
objectReference
(reference) - ссылка на объект (objects[ID])x
(float number) - позиция координаты x на локации.y
(float number) - позиция координаты y на локации.
Пример создания и перемещения объекта:
let objectID = API.createObject("Prefab1", "server", 100, 100);
let objectReference = API.objects[objectID];
API.moveObject(objectReference, 105, 105);
API.changeObjectAttr (oID, path, component, value)
oID
(number) - ID объекта (objects[oID]).path
(string) - путь в иерархии до GameObjectcomponent
(string) - ключ компонента или методаcommand
(string) - новые значение для компонента или метода
Этот метод позволяет модифицировать игровые объекты на сцене, созданные из префабов (через API.createObject).
В path
указывается "путь" до нужного GameObject, разделенного символом >
.
Например, если бы в Unity путь до GameObject внутри префаба являлся бы вторым дочерним объектом, в Unity этот объект можно было бы получить с помощью метода .GetChild(1)
(второй дочерний объект).
В случае с path, этот же путь описывается вот так: "1"
.
Если же нужный GameObject является первым дочерним объектом второго дочернего объекта, для Unity этот путь представляется как:
.GetChild(1).GetChild(0)
.
В случае с path, этот же путь описывается вот так: "1>0"
.
Таким образом, .GetChild(a).GetChild(b)....GetChild(z)
в path описывается как "a>b>...>z"
.
Команда command
чаще всего представляется подобным образом: "тип>значение", но бывают исключения.
Пример использования можно посмотреть для SAS.
Список возможных ключей component
в связке с командой command
:
SR:
Обращается к компоненту SpriteRenderer.
Возможные команды:
Устанавливает цвет (Color32) для SpriteRenderer.color. В качестве значения используется строка "r:g:b:a"
.
Пример: color>255:0:0:255
- устанавливает красный цвет.
Устанавливает другой спрайт (Sprite) в SpriteRenderer.sprite. В качестве значения используется хэш спрайта. Узнать хэш конкретного спрайта пока что нельзя в удобном виде.
A:
Применяет .setActive(bool) выбранному GameObject.
Возможные команды:
1
- .setActive(true)0
- .setActive(false)
TMP:
Обращается к компоненту TextMeshPro.
Возможные команды:
Устанавливает текст в TextMeshPro.text
Пример: t>Текст
Устанавливает размер текста в TextMeshPro.fontSize
Пример: s>18
SAS:
setActive Switcher (переключатель).
Применяет .setActive(false) ко всем дочерним объектам в path, после чего применяет .setActive(true) к одному дочернему объекту по его индексу.
В качестве command
используется индекс объекта GameObject в своей иерархии (в Unity это был бы .GetChild(index) для получения этого GameObject, а здесь это будет "index").
Пример использования SAS:
Допустим, у нас есть префаб Monster с анимациями Idle и Run. Анимации мы поместили в дочерний объект Animations (индекс дочернего объекта "0", так как он первый внутри объекта Monster). Внутри этого дочернего объекта Animations находятся два объекта: Idle (индекс "0") и Run (индекс "1").
Следующий код включит второй элемент (индекс "1", то есть Run) у первого дочернего объекта (индекс "0", то есть Animations) у созданного из префаба объекта с id oID:
API.changeObjectAttr(oID, "0", "SAS", "1"); // Включили анимацию Run ("1"), выключили остальные анимации
И наоборот:
API.changeObjectAttr(oID, "0", "SAS", "0"); // Включили анимацию Idle ("0"), выключили остальные анимации
Общий синтаксис:
API.changeObjectAttr(id, path, "SAS", index);
T:
Обращается в компоненту Transform.
Возможные команды:
Устанавливает position для Transform.localPosition
В качестве значения используется строка "x:y:z"
.
Пример:
p>1:1:1
Устанавливает scale для Transform.localScale
В качестве значения используется строка "x:y:z"
.
Пример:
s>1:1:1
Устанавливает rotation для Transform.localRotation
В качестве значения используется строка "x:y:z"
.
Пример:
r>0:0:0
Общий пример:
API.changeObjectAttr(oID, "0>0", "T", "p>");
Применив API.changeObjectAttr к объекту, обновленные component + command сохранятся в этом объекте.
Вернуться в изначальный вариант созданного объекта из префаба в данный момент невозможно. Для этого нужно удалить текущий объект и создать новый.
Чтобы перестать применять к объекту изменения, нужно сбросить все команды изменение этого объекта. Допустим, референс к объекту это oRef
. Тогда, для сброса всех команд на изменения объета можно вызвать код oRef.customComponents = {}
.
Учтите, что это лишь отменит постоянное применение команд на изменения в объекте, а не вернет его изначальное состояние, в котором объект был при создании.
Мы понимаем, что использование метода в текущем виде очень неудобное. В будущем этот метод получит более удобную обертку по аналогии с цепочкой запросов GUI().
API.deleteObject (ID)
Удаляет объект.
ID
(number) - ID объекта.
Пример создания и удаления объекта:
let objectID = API.createObject("Prefab1", "server", 100, 100);
API.deleteObject(objectID);
Доступ к игрокам и объектам
API.players : object
Объект, содержащий в себе референсы на всех игроков онлайн на сервере.
Доступ по ID игрока: API.players[ID]
.
API.objects : object
Объект, содержащий в себе референсы на все объекты на сервере.
Доступ по ID объекта: API.objects[ID]
.
Расстояние
API.isWithinDistance(x1, x2, y1, y2, distance) : bool
Метод сравнивает расстояние между двумя точками: (x1, y1)
и (x2, y2)
и если оно меньше чем distance
, то возвращает значение true
. Если расстояние между точками больше чем distance
, возвращает значение false
.
API.isWithinSquares(x1, x2, y1, y2, distance) : bool
Метод сравнивает квадрат расстояния между двумя точками: (x1, y1)
и (x2, y2)
и если оно меньше чем distance
, то возвращает значение true
. Если расстояние между точками больше чем distance
, возвращает значение false
.
Таким образом, в случае с isWithinSquares
, distance
является квадратом того distance
, который использовался бы в isWithinDistance
.
Сравнивая квадраты расстояний, не нужно вычислять корни (sqrt). Таким образом, если нужно найти ближайший объект среди объектов, лучше сравнивать расстояния с помощью isWithinSquares
, ведь так можно избежать лишней "дорогой" операции извлечения корня (sqrt).
API.distance(x1, x2, y1, y2) : float
Метод возвращает расстояние между двумя точками: (x1, y1)
и (x2, y2)
.
API.squares(x1, x2, y1, y2) : float
Метод возвращает квадрат расстояния между двумя точками: (x1, y1)
и (x2, y2)
.
Пример получения ближайшего объекта к определенной координате.
let list = API.getObjectsAround(x, y, "any");
let closestObject = {"id": -1, "distance": Number.POSITIVE_INFINITY};
let nearObjects = list.o;
for (let o = 0; o < nearObjects.length; o++){
let oID = nearObjects[o];
let oRef = API.objects[oID];
if (oRef === undefined){
continue;
}
let _distance = API.squares(x, oRef.x, y, oRef.y);
if (closestObject.distance > _distance){
closestObject.id = oID;
closestObject.distance = _distance;
}
}
console.log("Closest objectID:", closestObject.id, "Distance:", closestObject.distance);
// В переменной closestObject содержится объект с .id ближайшего к (x, y) объекта.
// Если ни одного объекта нет, .id = -1.
API.getDistance(obj1, obj2) : float
obj1
(object) - референс на объект игрока или объекта (из API.players или API.objects).obj2
(object) - референс на объект игрока или объекта (из API.playerplayerssObjects или API.objects).
Метод возвращает расстояние между двумя объектами: (obj1.x, obj1.y)
и (obj2.x, obj2.y)
.
Подходят любые объекты для сравнения, в которых есть свойства .x
и .y
.
API.getSquares(obj1, obj2) : float
obj1
(object) - референс на объект игрока или объекта (из API.players или API.objects).obj2
(object) - референс на объект игрока или объекта (из API.players или API.objects).
Метод возвращает квадрат расстояния между двумя объектами: (obj1.x, obj1.y)
и (obj2.x, obj2.y)
.
Подходят любые объекты для сравнения, в которых есть свойства .x
и .y
.
Ближайшие объекты
API.getEachPlayerAround(x, y, (pID, pRef) => {})
x
(float number) - позиция координаты x на локации.y
(float number) - позиция координаты y на локации.
Метод вызывает колбек (pID, pRef) => {}
с ID и референсом каждого игрока, который находится рядом с позицией (x, y)
.
Можно остановить получение следующих колбеков, вызвав в текущем return false;
.
Пример получения каждого игрока рядом с объектом с ID 1
, а если какой-то игрок ближе к этому объекту чем 3 условные единицы расстояния, то объект будет уничтожен:
let objectID = 1;
let objRef = API.objects[objectID];
API.getEachPlayerAround(objRef.x, objRef.y, (pID, pRef) => {
if (API.getDistance(objRef, pRef) < 3){
API.deleteObject(objectID);
}
});
В примере выше может произойти ситуация, что какой-то игрок оказался рядом с объектом, и это вызвало команду на удаление объекта. Но тогда уже не нужно дальше проверять остальных игроков на близость к объекту, ведь он уже удален.
Чтобы решить эту проблему, нужно вернуть значение false
изнутри колбека:
API.getEachPlayerAround(objRef.x, objRef.y, (pID, pRef) => {
if (API.getDistance(objRef, pRef) < 3){
API.deleteObject(objectID);
return false; // Останавливаем обработку всех следующих игроков, так как это больше не имеет смысла
}
});