Unity Tips
Unity Entities - Job에서 EntityManager, EntityCommandBuffer 사용 방법
종잇장
2023. 7. 4. 23:48
Unity 2022.3.2f
Entities 1.0.11
public void OnUpdate(ref SystemState state)
{
var ecbSingleton = SystemAPI.GetSingleton<BeginSimulationEntityCommandBufferSystem.Singleton>();
var ecb = ecbSingleton.CreateCommandBuffer(state.WorldUnmanaged).AsParallelWriter();
new CaracterUpdateJob()
{
ecb = ecb,
deltaTime = SystemAPI.Time.DeltaTime,
}.ScheduleParallel();
}
EntityManager나 EntityCommandBuffer를 그대로 Job에 넘길 수 없어서 EntityCommandBuffer.ParallelWriter로 바꿔서 Job으로 넘겨줍니다.
private partial struct CaracterUpdateJob : IJobEntity
{
public EntityCommandBuffer.ParallelWriter ecb;
public float deltaTime;
private void Execute([ChunkIndexInQuery] int sortKey, in Entity refEntity, ref ECSCharacterData refCharacterData, in LocalTransform refTransform)
{
// ... 생략 ... //
if (refCharacterData.isDead == true)
{
if (refCharacterData.deadEffect != Entity.Null)
{
var deadEffectEntity = ecb.Instantiate(sortKey, refCharacterData.deadEffect);
var deadEffectTransform = new LocalTransform()
{
Position = refTransform.Position,
Rotation = refTransform.Rotation,
Scale = refTransform.Scale,
};
ecb.SetComponent(sortKey, deadEffectEntity, deadEffectTransform);
}
if (refCharacterData.dropItem != Entity.Null)
{
var dropItemEntity = ecb.Instantiate(sortKey, refCharacterData.dropItem);
var dropItemTransform = new LocalTransform()
{
Position = refTransform.Position,
Rotation = refTransform.Rotation,
Scale = refTransform.Scale,
};
ecb.SetComponent(sortKey, dropItemEntity, dropItemTransform);
}
ecb.DestroyEntity(sortKey, refEntity);
}
}
}
EntityCommandBuffer.ParallelWriter를 EntityManager처럼 사용하면 됩니다.
메인쓰레드에서 사용하던 EntityManager나 EntityCommandBuffer와 차이점은 sortKey를 받는다는건데, 이미 생성된 Entity의 경우에는 ChunkIndexInQuery 값을 입력하고 새로 생성 할 Entity는 동일한 값만 입력해도 되는 것으로 보입니다. (이 부분 좀 더 정확한 정보를 알고계시다면 댓글로 남겨주세요.)
GitHub - Unity-Technologies/EntityComponentSystemSamples
Contribute to Unity-Technologies/EntityComponentSystemSamples development by creating an account on GitHub.
github.com