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 Entity
agrega ComponentData
para completar las funciones anteriores.
- Según mi entendimiento
Entity≠GameObject,而 GameObject = (Entity + Component(data) +System)
- Ciertamente quiero mostrar objetos en la escena
Mesh(形状)
yMaterial(材质)
lo que tenemos que hacer esEntity
agregar estosComponent(数据)
- Este caso no esta escrito
System(行为)
2. Configurar el entorno
- Mi versión de Unity: Unity2019.4.7LTS
- Use Window-> PackageManage para buscar Entidades, haga clic en Instalar, recuerde verificar
show preview packages
- De manera similar, instale Jobs, Mathematics, Hybrid Render
- 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 GameObject
convertir 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 Debugger
podemos ver que Entity
sí 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 Debugger
no puede verlo en la escena, significa que hay un problema con el conjunto de datos para él.
- Crea uno nuevo en la escena
Cube
y agrega unConvertToEntity
guión - Ejecute y abra
Entity Debugger
, verifique losEntity
datos convertidos y descubra que hay algunos datos más, y que todos los tipos de datos estánrender bounds
relacionados - Para
Entity
agregarRenderBounds
datos
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