Ссылки на сущности и компоненты из скрипта

В библиотеке PlayCanvas работа с сущностями и их компонентами является важной частью разработки приложений и игр. Сущности (Entities) в PlayCanvas — это основные объекты, с которыми взаимодействует игровой движок, будь то персонажи, камеры, или другие элементы сцены. Компоненты (Components) — это блоки, которые определяют поведение или свойства сущностей. Для взаимодействия с этими элементами из скриптов необходимо правильно устанавливать ссылки на сущности и их компоненты, что позволит эффективно управлять и изменять их поведение.

Сущности и их компоненты

Сущности в PlayCanvas — это объекты, которые содержат набор компонентов. Каждый компонент отвечает за определённые характеристики или функциональность, такие как геометрия, физика, свет, звук, и другие. Например, сущность может содержать компонент model, который отвечает за визуализацию объекта в 3D-пространстве, или компонент rigidbody, который определяет физические свойства объекта.

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

Получение ссылки на сущность

Для того чтобы взаимодействовать с сущностью из скрипта, нужно получить на неё ссылку. Это можно сделать несколькими способами.

Доступ через объект this.entity

Каждый скрипт в PlayCanvas привязывается к сущности, и доступ к самой сущности можно получить через объект this.entity. Это позволяет ссылаться на текущую сущность, с которой связан скрипт.

var MyScript = pc.createScript('myScript');

MyScript.prototype.initialize = function() {
    // Получаем ссылку на сущность
    var entity = this.entity;
};

В этом примере this.entity указывает на сущность, к которой привязан скрипт. Это особенно полезно для базовых операций, когда скрипт выполняет действия с самой сущностью.

Получение ссылки на сущности в иерархии

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

MyScript.prototype.initialize = function() {
    var player = this.app.root.findByName('Player'); // Находим сущность по имени
    var enemy = this.app.root.findByName('Enemy');
};

Этот код позволяет найти сущности с именем Player и Enemy в корне сцены. Также можно использовать более сложные методы для поиска дочерних сущностей.

Получение ссылки на компоненты сущности

Каждая сущность может содержать несколько компонентов, и для того чтобы работать с ними, нужно получить ссылки на соответствующие компоненты. Это можно сделать через метод entity.findComponent.

Доступ к компонентам через entity.script, entity.model, entity.rigidbody и другие

Каждый компонент в PlayCanvas имеет собственное свойство, которое может быть доступно напрямую. Например, для компонента model можно использовать entity.model, а для компонента rigidbodyentity.rigidbody. Для компонентов, привязанных к скрипту, доступ осуществляется через объект entity.script.

MyScript.prototype.initialize = function() {
    var model = this.entity.model;  // Получаем компонент model
    var rigidbody = this.entity.rigidbody;  // Получаем компонент rigidbody
};

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

Доступ через findComponent

Если требуется получить компонент не по заранее определённому свойству, а по имени компонента, то можно использовать метод findComponent. Это полезно, если необходимо найти компонент среди множества других.

MyScript.prototype.initialize = function() {
    var cameraComponent = this.entity.findComponent('camera');
};

В данном примере метод findComponent используется для поиска компонента camera в сущности.

Пример взаимодействия с компонентами и сущностями

Рассмотрим пример, где необходимо изменить позицию сущности и её компонент rigidbody, чтобы объект мог двигаться.

var MyScript = pc.createScript('myScript');

MyScript.prototype.initialize = function() {
    // Получаем компоненты сущности
    var rigidbody = this.entity.rigidbody;
    
    // Изменяем позицию сущности
    this.entity.setPosition(10, 0, 0);
    
    // Изменяем скорость Rigidbody
    rigidbody.linearVelocity.set(5, 0, 0);
};

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

Взаимодействие с дочерними сущностями

Для работы с дочерними сущностями можно использовать методы для поиска дочерних объектов в иерархии. В PlayCanvas иерархия сущностей позволяет создавать объекты, которые являются дочерними для других объектов. Для доступа к дочерним сущностям можно использовать метод findByName или find для поиска по имени.

MyScript.prototype.initialize = function() {
    var parentEntity = this.entity; // Родительская сущность
    var childEntity = parentEntity.findByName('ChildEntity'); // Дочерняя сущность
};

Кроме того, можно получить все дочерние сущности с помощью метода getChildren.

MyScript.prototype.initialize = function() {
    var children = this.entity.getChildren();  // Получаем все дочерние сущности
    for (var i = 0; i < children.length; i++) {
        console.log(children[i].name);  // Выводим имя каждой дочерней сущности
    }
};

Изменение ссылок на компоненты

Иногда возникает необходимость изменить компоненты сущности в ходе работы. Для этого можно не только получать ссылки на компоненты, но и устанавливать их. В PlayCanvas это делается с помощью метода addComponent, который позволяет добавлять новые компоненты, и метода removeComponent, чтобы удалять ненужные компоненты.

MyScript.prototype.initialize = function() {
    if (!this.entity.hasComponent('rigidbody')) {
        this.entity.addComponent('rigidbody');  // Добавляем компонент rigidbody
    }
    if (this.entity.hasComponent('light')) {
        this.entity.removeComponent('light');  // Убираем компонент light
    }
};

В данном примере проверяется, есть ли у сущности компонент rigidbody. Если его нет, то он добавляется. Также проверяется наличие компонента light и при необходимости он удаляется.

Работа с компонентами скриптов

Если сущность содержит несколько скриптов, то можно взаимодействовать с ними через объект entity.script. Для этого используется метод script.create и script.get.

MyScript.prototype.initialize = function() {
    var otherScript = this.entity.script.create('otherScript');
    otherScript.someMethod();  // Вызов метода другого скрипта
};

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

Заключение

Работа с сущностями и компонентами в PlayCanvas основывается на принципах объектно-ориентированного подхода. Получение ссылок на компоненты и сущности даёт программисту полный контроль над объектами в сцене, позволяя изменять их свойства и поведение в процессе выполнения игры или приложения. Важно уметь правильно ссылаться на нужные объекты и эффективно работать с компонентами, чтобы управление сценой и игровыми объектами было максимально гибким и удобным.