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);
});
}
}