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는 동일한 값만 입력해도 되는 것으로 보입니다. (이 부분 좀 더 정확한 정보를 알고계시다면 댓글로 남겨주세요.)

 

 

https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/EntitiesSamples/Docs/entity-command-buffers.md

 

GitHub - Unity-Technologies/EntityComponentSystemSamples

Contribute to Unity-Technologies/EntityComponentSystemSamples development by creating an account on GitHub.

github.com