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

Префабы

После создания объекта из префаба с помощью API.createObject, создается копия этого префаба, привязанная к созданному объекту. Компоненты этой копии можно свободно редактировать.

API.modifyPrefab

API.modifyPrefab(oID) — Позволяет модифицировать игровые объекты созданные из префаба.


Инициализация

let builder = API.modifyPrefab(oID);
  • oID (number) — ID игрового объекта, к которому будут применяться изменения.

Навигация по иерархии объектов

child(index: number): builder

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

Пример:

API.modifyPrefab(oID)
.child(0) // первый дочерний объект
.child(1) // второй внутри первого
.text("Пример")
.apply();

После .apply() путь сбрасывается автоматически.


Команды изменения Unity компонентов

color(r: number, g: number, b: number, a: number = 255): builder

Устанавливает цвет в формате RGBA для SpriteRenderer.color.

.color(255, 0, 0) // красный

sprite(hash: string): builder

Меняет спрайт (SpriteRenderer.sprite) на другой по хэшу. В данный момент узнать хэши спрайтов нельзя. Появится в будущем.

.sprite("abc123def")

text(text: string): builder

Устанавливает текст для компонента TextMeshPro.text.

.text("Привет, Мир!")

textSize(size: number): builder

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

.textSize(24)

Методы трансформации

move(x: number, y: number, z: number): builder

Устанавливает позицию (Transform.localPosition).

.move(1, 2, 3)

scale(x: number, y: number, z: number): builder

Устанавливает масштаб (Transform.localScale).

.scale(1, 1, 1)

rotate(x: number, y: number, z: number): builder

Устанавливает поворот (Transform.localRotation).

.rotate(0, 180, 0)

Управление состоянием

activate(state: boolean): builder

Включает или выключает объект (GameObject.setActive()).

.activate(true)  // включить
.activate(false) // выключить

switchTo(index: number): builder

Выключает все дочерние объекты, и включает один дочерний объект по его индексу.

.switchTo(1)

Завершение цепочки

apply(): void

Применяет все накопленные команды. Обязательно к вызову для завершения всей операции по модификации объекта.

.apply();

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

API.modifyPrefab(42)      // oID: 42
.child(0) // path: "0"
.child(1) // path: "0>1"
.text("Новая надпись") // TMP.text
.textSize(18) // TMP.fontSize
.move(0, 1, 0) // Transform.localPosition
.rotate(0, 180, 0) // Transform.localRotation
.activate(true) // GameObject.setActive
.apply(); // применить всё

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

alt text

Допустим, у нас есть префаб Monster с анимациями Idle и Run. Анимации мы поместили в дочерний объект Animations (индекс дочернего объекта 0, так как он первый внутри объекта Monster). Внутри этого дочернего объекта Animations находятся два объекта: Idle (индекс 0) и Run (индекс 1).

Следующий код включит второй элемент (индекс 1, то есть Run) у первого дочернего объекта (индекс 0, то есть Animations) у созданного из префаба объекта с id oID:

API.modifyPrefab(oID)
.child(0) // GetChild(0)
.switchTo(1) // Выключить все дочерние объекты, включить один объект с индексом 1.
.apply(); // применить всё

И наоборот:

API.modifyPrefab(oID)
.child(0) // GetChild(0)
.switchTo(0) // Выключить все дочерние объекты, включить один объект с индексом 0.
.apply(); // применить всё

Примечание

Путь child(...) всегда начинается заново при новом вызове API.modifyPrefab() и сбрасывается после apply().

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

Чтобы перестать применять к объекту изменения, нужно сбросить все команды на изменение этого объекта. Допустим, референс к объекту это oRef. Тогда, для сброса всех команд на изменения объета можно вызвать код oRef.customComponents = {}

Учтите, что это лишь отменит постоянное применение команд на изменения в объекте, а не вернет его изначальное состояние, в котором объект был при создании.