Перейти к основному содержимому

Методы

Список доступных функций и объектов для работы с игроками и объектами на сервере.

Объект игрока

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.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) - путь в иерархии до GameObject
  • component (string) - ключ компонента или метода
  • command (string) - новые значение для компонента или метода

Этот метод позволяет модифицировать игровые объекты на сцене, созданные из префабов (через API.createObject).

Что такое path?

В 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.

Возможные команды:

color:

Устанавливает цвет (Color32) для SpriteRenderer.color. В качестве значения используется строка "r:g:b:a".

Пример: color>255:0:0:255 - устанавливает красный цвет.

sprite:

Устанавливает другой спрайт (Sprite) в SpriteRenderer.sprite. В качестве значения используется хэш спрайта. Узнать хэш конкретного спрайта пока что нельзя в удобном виде.

A:

Применяет .setActive(bool) выбранному GameObject.

Возможные команды:

  • 1 - .setActive(true)
  • 0 - .setActive(false)

TMP:

Обращается к компоненту TextMeshPro.

Возможные команды:

t:

Устанавливает текст в TextMeshPro.text

Пример: t>Текст

s:

Устанавливает размер текста в TextMeshPro.fontSize

Пример: s>18

SAS:

setActive Switcher (переключатель).

Применяет .setActive(false) ко всем дочерним объектам в path, после чего применяет .setActive(true) к одному дочернему объекту по его индексу.

В качестве command используется индекс объекта GameObject в своей иерархии (в Unity это был бы .GetChild(index) для получения этого GameObject, а здесь это будет "index").

Пример использования SAS:

alt text

Допустим, у нас есть префаб 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.

Возможные команды:

p:

Устанавливает position для Transform.localPosition

В качестве значения используется строка "x:y:z".

Пример:

p>1:1:1

s:

Устанавливает scale для Transform.localScale

В качестве значения используется строка "x:y:z".

Пример:

s>1:1:1

r:

Устанавливает 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; // Останавливаем обработку всех следующих игроков, так как это больше не имеет смысла
}

});

API.getEachObjectAround(x, y, (oID, oRef) => {})

  • x (float number) - позиция координаты x на локации.
  • y (float number) - позиция координаты y на локации.

Метод вызывает колбек (oID, oRef) => {} с ID и референсом каждого объекта, который находится рядом с позицией (x, y).

Можно остановить получение следующих колбеков, вызвав в текущем return false;.

По сути это тот же метод, что и API.getEachPlayerAround, но для остальных объектов, а не игроков.

API.getObjectsAround(x, y, type) : object

Не самый эффективный метод

Этот метод составляет два списка из ID игроков и объектов, после чего с этими списками можно работать. Но с помощью предыдущих методов можно сразу приступить к работе с игроками и объектами в более читаемом виде.

Этот метод не рекомендуется использовать на этапе освоения KotikiServer.

Метод возвращает объект вида {"p": [], "o": []}, состоящий из двух массивов: список IDs близких объектов и игроков к координатам x и y.

  • x (float number) - позиция координаты x на локации.
  • y (float number) - позиция координаты y на локации.
  • type (string) - можно выбрать, какие списки получить:
Варианты type
  • "p" для игнорирования объектов.
  • "o" для игнорирования игроков.
  • "any" или любое другое значение - получить списки и игроков и объектов.

Пример получения ближайших к объекту игроков и перебор их массивом:

let objectReference = API.objects[1]; // Получаем объект с ID 1.
let _list = API.getObjectsAround(objectReference.x, objectReference.y, "p");
for (let o = 0; o < _list.p.length; o++){
let pID = _list.p[o];
let pRef = API.players[pID];
if (pRef === undefined){
continue;
}

// Здесь Ваш код для дальнейшей работы с pRef - референсом текущего близкого игрока к объекту objectReference.


}

Пример получения ближайших к объекту объектов (включая сам объект, так как он очевидно рядом) и перебор их массивом:

let objectID = 1;
let objectReference = API.objects[objectID]; // Получаем объект с ID 1.
let _list = API.getObjectsAround(objectReference.x, objectReference.y, "o");
for (let o = 0; o < _list.o.length; o++){
let oID = _list.o[o];
let oRef = API.objects[oID];
if (oRef === undefined){
continue;
}
if (oID == objectID){
continue; // Игнорируем сам объект, "вокруг" которого мы получаем ближайшие объекты
}

// Здесь Ваш код для дальнейшей работы с oRef - референсом текущего близкого объекта к объекту objectReference.


}

Полезные методы

API.getEachPlayer((pID, pRef) => {})

Метод вызывает колбек (pID, pRef) => {} с ID и референсом каждого игрока на сервере.

Можно остановить получение следующих колбеков, вызвав в текущем return false;.

По своей сути работает как API.getEachPlayerAround(), только без ограничений на ближайших к координате игроков.

API.getEachObject((oID, oRef) => {})

Метод вызывает колбек (oID, oRef) => {} с ID и референсом каждого объекта на сервере.

Можно остановить получение следующих колбеков, вызвав в текущем return false;.

По своей сути работает как API.getEachObjectAround(), только без ограничений на ближайших к координате объектов.

API.randomX() : float

Метод возвращает случайную координату от minX до maxX (случайная координата на оси X в пределах размера локации).

Пример создания объекта со случайными координатами:

let _objectID = API.createObject("DemoPrefab", "server", API.randomX(), API.randomY());

API.randomY() : float

Метод возвращает случайную координату от minY до maxY (случайная координата на оси Y в пределах размера локации).

Пример создания объекта со случайными координатами:

let _objectID = API.createObject("DemoPrefab", "server", API.randomX(), API.randomY());

API.cooldown(key1, key2, timeout) : bool

  • key1 (string) - Один из ключей для индексации, например ID игрока
  • key2 (string) - Один из ключей для индексации, например тип действия
  • timeout (int) - Время для перезарядки в миллисекундах (пример: 1000 - это 1 секунда).

Этот метод используется для временного ограничения какого-либо действия. Если вызвать метод два раза с одинаковыми аргументами, в первом вызове метод вернет true (ограничение зарегистрировано), а во второй раз вернет false (ограничение все еще действует и новое не было зарегистрировано).

Иными словами, этот метод используется, чтобы позволять выполнять какое-то действие только 1 раз за время timeout.

Поместим внутрь события 'tick' такой код:

if (API.cooldown("key1", "key2", 5000) == true){
console.log("First cooldown.");
}

Получится нечто подобное:

Events.on('tick', (currentTick) => {

if (API.cooldown("first", "cooldown", 5000) == true){
console.log("First cooldown.");
}

});

Сообщение First cooldown. будет выводиться в консоль только раз в 5 секунд (то есть раз в 5,000 мс).

Два аргумента key (key1 и key2) нужны для более удобного понимания логики кулдауна, если он привязан к действию конкретного игрока или объекта.

Например, чтобы разрешить игроку или объекту совершать какое-то действие не чаще одного раза в какой-то промежуток времени:

// Допустим, у нас есть переменная pID с ID игрока:

if (API.cooldown("player" + pID, "actionName", 3000) == true){

// Некоторый код для совершения действия actionName,
// который не получится выполнить чаще чем раз в 3 секунды.

}

API.playMoneySound(pRef)

  • pRef (object) - ссылка на объект игрока (API.players[ID])

Метод проигрывает звук "подобранной монетки" на стороне пользователя.

API.showLangErrorText(pRef, key)

  • pRef (object) - ссылка на объект игрока (API.players[ID])
  • key (string) - индекс элемента языкового файла.

Метод отображает указанному пользователю всплывающее окно об ошибке. Текст ошибки должен находиться в языковом файле.

API.moveTowards(fromRef, toRef, distanceStep)

  • fromRef (object) - ссылка на первый объект
  • toRef (object) - ссылка на второй объект
  • distanceStep (number) - расстояние

Метод двигает первый объект (fromRef) ко второму объекту (toRef). distanceStep определяет, на какое расстояние приблизить объект. Если distanceStep меньше, чем расстояние между двумя объектами, первый объект сразу переместится на координаты второго объекта.

API.askTopPlayers(path, total, sort = 1, cooldown = 1000)

  • path (string) - путь до значения (подробности далее).
  • total (number) - количество игроков.
  • sort (number) - тип сортировки: -1 для списка по возрастанию, 1 для списка по убыванию.
  • cooldown (number) - задержка в миллисекундах до следующей возможности сгенерировать список.

Метод отправляет системе запрос на генерацию списка из определенного количества игроков, лучших или худших по определенному узначению.

Метод используется для формирования топа (рейтинга) игроков по определенному значению.

Что такое path?

Объясним на примере:

Если объект игрока это pRef, а баланс игрока хранится в pRef.objs.balance, то path для получения баланса это objs.balance

Таким образом, path это перечисление через точку (.) всего пути до нужного свойства (ключа) в объекте игрока.

Пример запроса списка 10 лучших игроков по балансу. Этот код можно разместить в конце файла game.js

function askTopBalance(){

// Устанавливаем задержку в 60 секунд, потому что нет смысла очень часто обновлять рейтинг по балансу
API.askTopPlayers("objs.balance", 10, -1, 1000 * 60);

// Раз в 5 минут эта функция будет вызываться вновь
setTimeout(askTopBalance, 1000 * 60 * 5);
return;
}
setTimeout(askTopBalance, 1000);

После вызова API.askTopPlayers, сформированный список закэшируется, и будет доступен через метод API.getTopPlayers

API.getTopPlayers(path, total, sort)

  • path (string) - путь до значения (подробности далее).
  • total (number) - количество игроков.
  • sort (number) - тип сортировки: -1 для списка по возрастанию, 1 для списка по убыванию.

Метод возвращает список игроков, если он был сформирован через API.askTopPlayers.

Перед вызовом API.getTopPlayers, нужно вызвать команду API.askTopPlayers для формирования списка игроков.

Внимание!

Учитывайте, что сервер может не успеть сформировать список рейтинга, так как API.askTopPlayers отправляет команду на формирование рейтинга к специальному процессу.

Всегда рассматривайте вероятность, что возвращенный список после вызова API.getTopPlayers может быть пустым ([]).

Аргументы path, total и sort должны совпадать с этими же аргументами, которые были использованы при вызове метода API.askTopPlayers

Каждый элемент полученного списка будет иметь вид массива с тремя элементами:

  1. Никнейм игрока.
  2. Значение, которое использовалось для определения позиции игрока в списке. В случае с примером из API.askTopPlayers, этим значением является баланс игрока.
  3. ID игрока.

Полный пример получения списка из 10 лучших игроков по балансу, а также вывод этого списка в консоль каждые 10 секунд:

function askTopBalance(){
API.askTopPlayers("objs.balance", 10, -1, 1000 * 60);
setTimeout(askTopBalance, 1000 * 60 * 5);
return;
}
setTimeout(askTopBalance, 1000);

function showTopBalance(){

let topPlayers = API.getTopPlayers("objs.balance", 10, -1);

for (let i = 0; i < topPlayers.length; i++){
let _elem = topPlayers[i];
console.log(`#${i + 1} ID: ${_elem[2]} Name: ${_elem[0]} Balance: ${_elem[1]}`);
}

setTimeout(showTopBalance, 1000 * 10);
return;
}
setTimeout(showTopBalance, 1000 * 5);

Физика (p2.js)

KotikiServer.js поддерживает возможность работы с физикой с помощью модуля p2.js

В данный момент поддерживается очень мало методов физики, что делает поддержку физики экспериментальным нестабильным функционалом.

Чтобы включить поддержку физики:

  1. Установите модуль с помощью команды npm install p2.js
  2. В файле конфигурации config.js установите значение "physicsEnabled": true

Подразумевается, что физика будет только у объектов, а игроки смогут проходить сквозь объекты. Чтобы игроки не могли проходить сквозь объекты, нужно в префаб, из которого создается объект, добавить один из компонентов физики Unity: PolygonCollider2D, CircleCollider2D, BoxCollider2D или CapsuleCollider2D.

API.addPhysics_p2(oRef, mass, radius)

  • oRef (object) - ссылка на объект, которому нужно добавить физику.
  • mass (number) - физическая масса объекта
  • radius (number) - физический радиус объекта

Метод добавляет объекту физику. Скорее всего, значения mass и radius надо подбирать случайным образом, пока не будут подобраны подходящие варианты.

API.setPhysicsType_p2(oRef, type)

  • oRef (object) - ссылка на объект, которому нужно добавить физику.
  • type (string) - один из 3 типов физического объекта:
STATIC - статический объект
KINEMATIC - кинематический объект
DYNAMIC - динамический объект

Метод меняет поведение физического объекта.

API.pushObject_p2(oRef, vectorX, vectorY)

  • oRef (reference) - ссылка на объект.
  • vectorX (float number) - расстояние сдвига по оси X.
  • vectorY (float number) - расстояние сдвига по оси Y.

Метод сдвигает объект в определенную сторону.