Программное создание Entity
Обычно вы будете создавать Entity с помощью редактора PlayCanvas, создавая наборы компонентов и скриптов для создания различных частей вашей игры. Однако в некоторых случаях удобно создавать Entity в ваших скриптах. В этом уроке показано, как это сделать.
Создание Entity
var entity = new pc.Entity(); // Создать Entity
// Добавить его в иерархию Entity
this.app.root.addChild(entity);
Сначала вам нужно создать Entity. Это просто, но важно добавить Entity в основную иерархию Entity. Только Entity в иерархии будут обновлять свои
трансформации, компоненты и скрипты. В своих скриптах вы можете получить доступ к корню иерархии Entity из объекта Application
,
который передается в ваш скрипт. По соглашению, это обычно называется app
, и корень иерархии доступен как
this.app.root
.
Добавление компонентов
// Создать новый Entity
var entity = new pc.Entity();
// Добавить новый компонент камеры со значениями по умолчанию
entity.addComponent("camera");
// Добавить новый компонент модели и добавить его в Entity.
entity.addComponent("render", {
type: 'box',
});
// Добавить его в иерархию Entity
this.app.root.addChild(entity);
Сущность (Entity) сама по себе не делает многое, поэтому вам нужно добавить компоненты, чтобы добавить функциональность вашей сущности. Вы можете
использовать метод addComponent
сущности для создания и добавления нового компонента к сущности.
У каждого типа компонента есть разные свойства, которые могут быть переданы в объекте данных, см. документацию по компонентам для более подробной информации о доступных свойствах. Аргумент
data
можно опустить, и будут использованы значения по умолчанию.
Удаление компонентов
var entity = new pc.Entity();
// Добавить компонент камеры со значениями по умолчанию
entity.addComponent("camera");
// Удалить компонент камеры
entity.removeComponent("camera");
Компоненты можно удалять по отдельности из Entity, вызвав метод removeComponent
на Entity.
Удаление Entities
// Создать новый Entity
var entity = new pc.Entity();
// Создать новый компонент камеры со значениями по умолчанию
entity.addComponent("camera");
// Создать новый компонент модели и добавить его в Entity.
entity.addComponent("render", {
type: 'box',
});
// Добавить его в иерархию Entity
this.app.root.addChild(entity);
// Удалить Entity и удалить его из иерархии
entity.destroy();
Когда вы закончили работу с Entity, вызовите метод destroy
на Entity. Это удалит все компоненты и удалит Entity из иерархии. Также
будут удалены все дочерние объекты Entity аналогичным образом.
В действии
var EntityCreator = pc.createScript('entityCreator');
EntityCreator.attributes.add('material', {
type: 'asset',
assetType: 'material'
});
EntityCreator.attributes.add('boxDimensions', {
type: 'number',
default: 10
});
EntityCreator.attributes.add('lifetime', {
type: 'number',
default: 5
});
EntityCreator.attributes.add('maxCubes', {
type: 'number',
default: 10
});
// инициализация кода, вызываемая один раз для каждой сущности
EntityCreator.prototype.initialize = function() {
this.entities = [];
};
// код обновления, вызываемый каждый кадр
EntityCreator.prototype.update = function(dt) {
// Создаем новые кубы, если их меньше, чем maxCubes
while (this.entities.length < this.maxCubes) {
this.spawnCube();
}
// Проходимся по сущностям и удаляем их, когда их время истекает
for (i = 0; i < this.entities.length; i++) {
this.entities[i].timer -= dt;
if (this.entities[i].timer < 0) {
// entity.destroy() удаляет все компоненты и удаляет сущность из иерархии
this.entities[i].entity.destroy();
// Удаляем из локального списка
this.entities.splice(i, 1);
}
}
};
EntityCreator.prototype.spawnCube = function () {
var entity = new pc.Entity();
// Добавляем новый компонент модели и добавляем его к сущности.
entity.addComponent("render", {
type: 'box'
});
// устанавливаем материал
entity.render.material = this.material.resource;
// Перемещаем на случайную позицию
entity.setLocalPosition(
pc.math.random(-this.boxDimensions, this.boxDimensions),
pc.math.random(-this.boxDimensions, this.boxDimensions),
pc.math.random(-this.boxDimensions, this.boxDimensions)
);
// Добавляем в иерархию
this.app.root.addChild(entity);
// Сохраняем в списке на случайную продолжительность перед удалением
this.entities.push({
entity: entity,
timer: pc.math.random(0, this.lifetime)
});
};
Это полный сценарий Entity, который вы можете увидеть в действии в верхней части учебника. Он постоянно создает и уничтожает новые Entity с прикрепленным компонентом Model.
Посмотрите полную сцену здесь.