Unity Dots Rendering Issues

487 Views Asked by At

My entities dosen't seen in the scene and game window. But they are in the entites hierarchy

private void Start()
{
    EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
    EntityArchetype entityArchetype = entityManager.CreateArchetype(
        typeof(HealtComponent),
        typeof(LocalTransform), 
        typeof(RenderMesh),
        typeof(LocalToWorld)
        );
    NativeArray<Entity> entityArray = new NativeArray<Entity>(200000, Allocator.TempJob);
    entityManager.CreateEntity(entityArchetype, entityArray);

    for (int i = 0; i < entityArray.Length; i++)
    {
        Entity entity = entityArray[i];
        entityManager.SetComponentData(entity, new HealtComponent { MaxHealth = 3, CurrentHealth = 3 });
        entityManager.SetSharedComponentManaged(entity, new RenderMesh
        {
            material = _Material,
            mesh = _Mesh
        });
    }
    
    entityArray.Dispose();
}
2

There are 2 best solutions below

2
Andrew Łukasik On

This is how you create a renderable mesh in entities 1.0 with RenderMeshUtility:

InstantiateRenderableEntity.cs

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

public class InstantiateRenderableEntity : MonoBehaviour
{
    [SerializeField] Material material;
    [SerializeField] Mesh mesh;
    void Start()
    {
        var world = World.DefaultGameObjectInjectionWorld;
        var entityManager = world.EntityManager;

        Entity entity = entityManager.CreateEntity();
        var desc = new RenderMeshDescription(
            shadowCastingMode: ShadowCastingMode.On ,
            receiveShadows: true ,
            renderingLayerMask: 1
        );
        var renderMeshArray = new RenderMeshArray(
            new Material[]{ material },
            new Mesh[]{ mesh }
        );
        RenderMeshUtility.AddComponents(
            entity, entityManager,
            desc,
            renderMeshArray,
            MaterialMeshInfo.FromRenderMeshArrayIndices(0,0)
        );
        entityManager.SetComponentData( entity , new LocalToWorld{
            Value = transform.localToWorldMatrix
        } );
    }
}

But to render hundreds/thousands of entities at once - use Prefab pattern instead:

InstantiateALofOfRenderableEntities.cs

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

public class InstantiateALofOfRenderableEntities : MonoBehaviour
{
    [SerializeField] Material material;
    [SerializeField] Mesh mesh;

    void Start()
    {
        var world = World.DefaultGameObjectInjectionWorld;
        var entityManager = world.EntityManager;

        Entity prefab = entityManager.CreateEntity(
            typeof(HealthComponent) ,
            typeof(Prefab)
        );
        {
            var desc = new RenderMeshDescription(
                shadowCastingMode: ShadowCastingMode.On ,
                receiveShadows: true ,
                renderingLayerMask: 1
            );
            var renderMeshArray = new RenderMeshArray(
                new Material[]{ material },
                new Mesh[]{ mesh }
            );
            RenderMeshUtility.AddComponents(
                prefab, entityManager,
                desc,
                renderMeshArray,
                MaterialMeshInfo.FromRenderMeshArrayIndices(0,0)
            );
            entityManager.SetComponentData(prefab , new LocalToWorld{
                Value = float4x4.identity
            });
            entityManager.SetComponentData( prefab , new HealthComponent{
                MaxHealth = 3 ,
                CurrentHealth = 3
            } );
        }

        NativeArray<Entity> instances = new ( 100 , Allocator.Temp );
        entityManager.Instantiate( prefab , instances );
        var rnd = new Unity.Mathematics.Random( (uint) this.GetHashCode() );
        float3 pos = transform.position;
        for( int i=0 ; i<instances.Length ; i++ )
        {
            Entity entity = instances[i];
            entityManager.SetComponentData( entity , new LocalToWorld{
                Value = float4x4.Translate( pos + rnd.NextFloat3Direction() )
            } );
        }
    }

    public struct HealthComponent : IComponentData { public int MaxHealth; public int CurrentHealth; }
}

0
Poritosh David On

You need to install some of the Packages:

  1. Universal RP
  2. Hybrid renderer
  3. Entities