No post anterior, pudemos ver um resumo geral sobre ECS. Desta vez, veremos como “instanciar” entidades e definir seus componentes em tempo de execução a partir de um MonoBehaviour.

Em jogos reais é comum termos sistemas de Spawn, o exemplo abaixo é baseado nas amostras da Unity no GitHub e ilustra este caso de uso com ECS.

Se você acompanhou a postagem anterior a essa, já deve ter seu componente e sistema criados.

Crie um script chamado SpawnFromMonoBehaviour.cs com o seguinte conteúdo:

using UnityEngine;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;

public class SpawnFromMonoBehaviour : MonoBehaviour
{
    #region Variables
    //Prefab a ser instanciado e convertido.
    public GameObject Prefab;
    #endregion

    #region Main Methods
    private void Start()
    {
        //GameObjectConversionSettings é a ferramenta de conversão de entidades.
        //Dizemos à ferramenta de conversão que ela utilizará o mundo padrão no ECS.
        GameObjectConversionSettings settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null);
        //Nosso EntityManager.
        EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
        //Criamos uma entidade de referência ao prefab que será instanciado.
        Entity entityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(Prefab, settings);
        //Nomeamos o prefab de REFERÊNCIA para melhor compreensão no EntityDebugger.
        entityManager.SetName(entityPrefab, "ReferenceEntityPrefab");

        //Posição inicial.
        float3 position = float3.zero;
        //Rotação Inicial.
        quaternion rotation = quaternion.identity;

        //Instanciamos nosso objeto algumas vezes em um laço simples.
        for (int i = 0; i < 10; i++)
        {
            Entity entityInstance = entityManager.Instantiate(entityPrefab);
            //Setamos os valores dos componentes Translation e Rotation que são adicionados automaticamente durante a conversão.
            entityManager.SetComponentData(entityInstance, new Translation { Value = position });
            entityManager.SetComponentData(entityInstance, new Rotation { Value = rotation });
            //Nomeamos nossa entidade para melhorar a compreensão no EntityDebugger.
            entityManager.SetName(entityInstance, "InstantiatedEntity["+i+"]");

            //Adicionamos algum espaço no eixo X entre os objetos instanciados.
            position.x += 1.25f;
        }

    }
    #endregion
}

O código está comentado e é auto-explicativo.

Adicione o script a um GameObject vazio na cena e adicione nosso script a ele. Também defina o prefab a ser instanciado.

O script ConvertToEntity não é necessário aqui. Apenas o Script de autoração, caso deseje usar algum componente.

Unity ECS - Instanciando entidades a partir de um MonoBehaviour.

Observações:

Devo reforçar que a variável entityPrefab é uma entidade de referência criada na memória. Assim o instanciamento se torna muito mais rápido se precisarmos instanciar este prefab mais de uma vez.

Em um cenário com diversas entidades a serem instanciados, você pode criar sua própria lógica como por exemplo criar entidades de referência de todos os prefabs disponíveis, armazenar estas referências em uma lista ou dicionário e instanciá-los a partir de seu id / key.

Lembre-se:

Este código será executado apenas no thread principal, então use com moderação.
artplayer

Author artplayer

More posts by artplayer

Deixe uma resposta

Receber notícias

Digite seu endereço de e-mail para receber notificações de novas publicações por e-mail.
%d blogueiros gostam disto: