Unity Dots的入门基础

Unity Dots的入门基础

一,实例化Entity的方法

以下方法公用代码块

 private EntityManager em;
    void Start()
    {
        em = World.DefaultGameObjectInjectionWorld.EntityManager;
        CreatEntity();
    }
1.使用EntityArchetype。
        EntityArchetype ea = em.CreateArchetype(
            typeof(Translation),
            typeof(RenderMesh),
            typeof(RenderBounds),
            typeof(LocalToWorld)
        );
         //生成一个entity的方法
        Entity mEntity = em.CreateEntity(ea);
        //给单个entity添加mesh和material
        em.AddSharedComponentData(mEntity, new RenderMesh
        {
            mesh = this.mesh,
            material = this.ma
        });
        //生成多个entity的方法:
        //1
        NativeArray<Entity> nativeEntity1=new NativeArray<Entity>(10,Allocator.Temp);
        em.CreateEntity(ea, nativeEntity);
        //2
        NativeArray<Entity> nativeEntity2 = em.CreateEntity(ea, 10, Allocator.Temp);
2.使用ComponentType数组。
        ComponentType[] ct=new ComponentType[]
        {
            typeof(Translation),
            typeof(RenderMesh),
            typeof(RenderBounds),
            typeof(LocalToWorld)
        };
        Entity mEntity = em.CreateEntity(ct);
        em.AddSharedComponentData(mEntity, new RenderMesh
        {
            mesh = this.mesh,
            material = this.ma
        });
3.使用Instantiate。
	    BlobAssetStore blobassetStore=new BlobAssetStore();
        GameObjectConversionSettings setting=GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld,blobassetStore);
        Entity entityPrefabe = GameObjectConversionUtility.ConvertGameObjectHierarchy(gameObjectPrefabe, setting);
        //生成一个
        Entity mEntity = em.Instantiate(entityPrefabe);
        em.AddSharedComponentData(mEntity, new RenderMesh
        {
            mesh = this.mesh,
            material = this.ma
        });
        //生成多个
        //1.
        NativeArray<Entity> nativeEntity1=new NativeArray<Entity>(10,Allocator.Temp);
        em.Instantiate(entityPrefabe, nativeEntity);
        //2.
        NativeArray < Entity > nativeEntity2 = em.Instantiate(entityPrefabe, 10, Allocator.Temp);
4.使用ComponentType和EntityArchetype创建。
 		ComponentType translation=new ComponentType(typeof(Translation),ComponentType.AccessMode.ReadWrite);
        ComponentType renderMesh=new ComponentType(typeof(RenderMesh),ComponentType.AccessMode.ReadWrite);
        ComponentType renderBounds=new ComponentType(typeof(RenderBounds),ComponentType.AccessMode.ReadWrite);
        ComponentType localToWorld=new ComponentType(typeof(LocalToWorld),ComponentType.AccessMode.ReadWrite);
        EntityArchetype ea = em.CreateArchetype(translation, renderMesh, renderBounds, localToWorld);
        //生成一个
        Entity mEntity = em.CreateEntity(ea);
        em.AddSharedComponentData(mEntity, new RenderMesh
        {
            mesh = this.mesh,
            material = this.ma
        });
5.先创建一个空的Entity,然后加入ComponentData。
 		Entity mEntity = em.CreateEntity();
        em.AddComponentData(mEntity, new Translation());
        em.AddComponentData(mEntity, new RenderBounds());
        em.AddComponentData(mEntity, new LocalToWorld());
        em.AddSharedComponentData(mEntity, new RenderMesh
        {
            mesh = this.mesh,
            material = this.ma
        });

二,GameObject转Entity的方法

1.使用Convert To Entity。

使用方法:直接在gameobject上挂载Convert To Entity脚本。运行即可自动转为Entity。
在这里插入图片描述

2.使用IConvertGameObjectToEntity和IDeclareReferencedPrefabs接口。
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
public class PrefabToEntity : MonoBehaviour,IConvertGameObjectToEntity,IDeclareReferencedPrefabs
{
    [SerializeField]
    private GameObject prefab_Conver;
    public static  Entity prefabEntity;
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        Entity mentity = conversionSystem.GetPrimaryEntity(prefab_Conver);
        prefabEntity = mentity;
    }

    public void DeclareReferencedPrefabs(List<GameObject> referencedPrefabs)
    {
        referencedPrefabs.Add(prefab_Conver);
    }
}
3.使用GameObjectConversionUtility.ConvertGameObjectHierarchy()方法。
using UnityEngine;
using Unity.Entities;

public class PrefabToEntity : MonoBehaviour, IConvertGameObjectToEntity
{
    [SerializeField] private GameObject prefab_Conver;
    public static Entity prefabEntity;

    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        BlobAssetStore bas = new BlobAssetStore();
        GameObjectConversionSettings gcs =
            GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, bas);
        Entity mentity = GameObjectConversionUtility.ConvertGameObjectHierarchy(prefab_Conver, gcs);
        prefabEntity = mentity;
    }
}

三,删除Entity的方法

1.使用EntityCommandBuffer的DestroyEntity
public class DeleteBulletComponentSystem : ComponentSystem
{
    protected override void OnUpdate()
    {
        EntityCommandBuffer entitycommandBuffer = new EntityCommandBuffer(Allocator.Temp);
        Entities.ForEach((Entity entity, ref MoveComponentData mv) =>
        {
            entitycommandBuffer.DestroyEntity(entity);
        });
        entitycommandBuffer.Playback(EntityManager);
        entitycommandBuffer.Dispose();
    }
}

MoveComponentData 是我自己声明的一个IcomponentData结构体:代码在下方

2.使用PostUpdateCommands.DestroyEntity
public class DeleteBulletComponentSystem : ComponentSystem
{
    protected override void OnUpdate()
    {
        Entities.ForEach((Entity entity, ref MoveComponentData mv) =>
        {
            PostUpdateCommands.DestroyEntity(entity);
        });
    }
}

MoveComponentData 是我自己声明的一个IcomponentData结构体:代码在下方

[GenerateAuthoringComponent]
public struct MoveComponentData :IComponentData
{
    public int speed;
}
3.使用EntityManager.DestroyEntity
public class DeleteBulletComponentSystem : ComponentSystem
{
    protected override void OnUpdate()
    {
        Entities.ForEach((Entity entity, ref MoveComponentData mv) =>
        {
              EntityManager.DestroyEntity(entity);
        });
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值