Instancia de entrada de Unity2019 ECS: crear una entidad

Ejemplo de introducción a Unity2019 ECS: crear una entidad

I. Introducción

Benpian para lograr la creación de una entidad, y esta Entidad se muestra en la escena, con ECS框架explicar es crear una Entity, y esta se Entityagrega ComponentDatapara completar las funciones anteriores.

  1. Según mi entendimientoEntity≠GameObject,而 GameObject = (Entity + Component(data) +System)
  2. Ciertamente quiero mostrar objetos en la escena Mesh(形状)y Material(材质)lo que tenemos que hacer es Entityagregar estosComponent(数据)
  3. Este caso no esta escritoSystem(行为)

2. Configurar el entorno

  1. Mi versión de Unity: Unity2019.4.7LTS
  2. Use Window-> PackageManage para buscar Entidades, haga clic en Instalar, recuerde verificar show preview packages
  3. De manera similar, instale Jobs, Mathematics, Hybrid Render
  4. Una vez completada la instalación, puede comenzar a codificar. Si hay algún problema con los pasos anteriores, puede buscar el problema correspondiente o dejar un mensaje.

3. Codificación para crear una entidad y mostrarla en la escena

En Unity, hay muchas formas de crear o GameObjectconvertir Entity, aquí usamos principalmente la forma de creación, en el proyecto recién creado, creamos un scriptCreateEntity.cs

CreateEntity.cs

using Unity.Entities;
using Unity.Rendering;
using Unity.Transforms;
using UnityEngine;

public class CreateEntity : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        manager = World.DefaultGameObjectInjectionWorld.EntityManager;//获取默认世界的实体管理器
        CreateEntityObj();
    }

    // Update is called once per frame
    void Update()
    {
        
    }


    private EntityManager manager;
    private void CreateEntityObj()
    {
        //在EntityManager中提供了public Entity CreateEntity(EntityArchetype archetype);方法
        //在此之前,我们需要一个
        //同样在EntityManager中,有一个 CreateArchetype(params ComponentType[] types);方法
        var archeType = manager.CreateArchetype
        (
            //以下等于规定了Entity中一系列数据类型
            ComponentType.ReadWrite<LocalToWorld>(),
            ComponentType.ReadWrite<Translation>(),
            ComponentType.ReadOnly<RenderMesh>()
        );

        var entity = manager.CreateEntity(archeType);//到此我们就创建了一个entity
        manager.SetName(entity, "cube");//设置一个名字方便观察

        //需要为Entity设置位置,形状,材质等信息,这里的信息可以使用公有变量在检视面板中设置
        //此处直接使用一个标准的数据
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

        //为实体设置数据
        manager.SetComponentData<LocalToWorld>(entity, new LocalToWorld() { Value = Unity.Mathematics.float4x4.zero });
        manager.SetComponentData<Translation>(entity, new Translation() { Value = new Unity.Mathematics.float3(0, 0, 0) });
        manager.SetSharedComponentData<RenderMesh>(entity, new RenderMesh()
        {
            material = cube.GetComponent<MeshRenderer>().material,
            mesh = cube.GetComponent<MeshFilter>().sharedMesh,
            subMesh = 0,
            castShadows = UnityEngine.Rendering.ShadowCastingMode.On,
            receiveShadows = true,
            needMotionVectorPass = true
        });

        Destroy(cube);//临时使用的cube进行销毁
    }
}

¡pero! Después de montar y ejecutar, no encontré el que queríamos en la escena Cube, pero Entity Debuggerpodemos ver que Entitysí existe en la escena, lo que significa que debería haber algunos en la escena, pero solo podemos decir que no lo encontramos.

4. Resolución de problemas

Si Entity Debuggerno puede verlo en la escena, significa que hay un problema con el conjunto de datos para él.

  1. Crea uno nuevo en la escena Cubey agrega un ConvertToEntityguión
  2. Ejecute y abra Entity Debugger, verifique los Entitydatos convertidos y descubra que hay algunos datos más, y que todos los tipos de datos están render boundsrelacionados
  3. Para Entityagregar RenderBoundsdatos

La primera ejecución, información de la entidad
Después de agregar Renderbounds

después de editarCreateEntity.cs

using Unity.Entities;
using Unity.Rendering;
using Unity.Transforms;
using UnityEngine;

public class CreateEntity : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        manager = World.DefaultGameObjectInjectionWorld.EntityManager;//获取默认世界的实体管理器
        CreateEntityObj();
    }

    // Update is called once per frame
    void Update()
    {
        
    }


    private EntityManager manager;
    private void CreateEntityObj()
    {
        //在EntityManager中提供了public Entity CreateEntity(EntityArchetype archetype);方法
        //在此之前,我们需要一个
        //同样在EntityManager中,有一个 CreateArchetype(params ComponentType[] types);方法
        var archeType = manager.CreateArchetype
        (
            //以下等于规定了Entity中一系列数据类型
            ComponentType.ReadWrite<LocalToWorld>(),
            ComponentType.ReadWrite<Translation>(),
            ComponentType.ReadOnly<RenderMesh>(),
            ComponentType.ReadWrite<RenderBounds>()
        );

        var entity = manager.CreateEntity(archeType);//到此我们就创建了一个entity
        manager.SetName(entity, "cube");//设置一个名字方便观察

        //需要为Entity设置位置,形状,材质等信息,这里的信息可以使用公有变量在检视面板中设置
        //此处直接使用一个标准的数据
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

        //为实体设置数据
        RenderBounds rb = new RenderBounds()
        {
            Value = new Unity.Mathematics.AABB()
            {
                Center = new Unity.Mathematics.float3(0, 0, 0),
                Extents = new Unity.Mathematics.float3(0.5f,0.5f,0.5f)
            }
        };
        manager.SetComponentData<RenderBounds>(entity,rb)//只需添加archerType即可,不需要手动设置数据
        manager.SetComponentData<LocalToWorld>(entity, new LocalToWorld() { Value = Unity.Mathematics.float4x4.zero });
        manager.SetComponentData<Translation>(entity, new Translation() { Value = new Unity.Mathematics.float3(0, 0, 0) });
        manager.SetSharedComponentData<RenderMesh>(entity, new RenderMesh()
        {
            material = cube.GetComponent<MeshRenderer>().material,
            mesh = cube.GetComponent<MeshFilter>().sharedMesh,
            subMesh = 0,
            castShadows = UnityEngine.Rendering.ShadowCastingMode.On,
            receiveShadows = true,
            needMotionVectorPass = true
        });

        Destroy(cube);//临时使用的cube进行销毁
    }
}

Bienvenido a mi blog personal Blog de Snail

Supongo que te gusta

Origin blog.csdn.net/weixin_36382492/article/details/109266676
Recomendado
Clasificación