ECS의 World와 SubScene의 관계

⭐ 개념 정리

✅ World

ECS에서 WorldEntitySystem 등을 관리하는 Container 역할

World특정 씬(Scene)에 종속되지 않고, 모든 ECS 데이터를 포함하여 관리한다.

World가 관리하는 핵심 구성 요소 4가지

  • EntityManagerEntityComponent관리
  • Systems → ECS 시스템 실행 및 업데이트
  • ArchetypesEntity 구조 저장 및 관리
  • Queries → 특정 조건을 만족하는 Entity 검색

✅ SubScene

SubScene은 씬(Scene) 내부에서 특정 ECS 데이터(Entity)를 포함하는 컨테이너 역할을 한다.

SubScene이 로드되면, 그 안의 GameObject들이 자동으로 Entity로 변환(Entity Conversion)되어 World에 등록

➡️ SubScene의 로드 과정

  1. SubScene 로드SceneSystemSubSceneWorld에 추가
  2. GameObject Entity 변환
  3. EntityManager가 모든 Entity 관리
  4. ECS 시스템이 해당 Entity 를 처리

✅ World와 SubScene의 관계

WorldMainSceneSubScene을 구분하지 않고, 모든 ECS 데이터를 포함하여 관리

SubScene이 로드되면 해당 오브젝트들이 ECS Entity로 변환되어 World에 등록됨

World 자체는 씬(Scene)을 직접적으로 관리하지 않지만, World가 관리하는 SceneSystem을 사용해 SubScene을 동적으로 로드/언로드할 수는 있음

즉, World 는 씬(Scene) 개념과 독립적이지만, SubScene과는 밀접한 관계를 가짐


❓ World는 SubScene을 포함하는 상위 컨테이너인가?

Yes, 하지만 직접적인 포함 관계는 아님

WorldECS 데이터를 관리하는 컨테이너이므로, SubScene에서 생성된 ECS 데이터(Entity, Component, System 등)는 결국 World에 포함됨.

하지만, Unity의 SubScene자체가 World의 일부는 아니다. (SubScene씬(Scene)의 일부, World는 ECS의 컨테이너)


❓ 서로 다른 World에서 같은 SubScene을 공유할 수 있을까?

일반적으로 Unity ECS에서는 SubScene은 하나의 World에 속하는 것이 원칙

특정한 방식으로 다른 World에서 동일한 SubScene을 공유하는 것도 가능할 수 있음

➡️ 서로 다른 World에서 같은 SubScene을 공유하는 방법

1. 각 World에서 같은 SubScene을 개별적으로 로드
  • World가 동일한 SubScene을 독립적으로 로드하여 각각의 ECS 데이터를 가질 수 있음
  • 서로 다른 World에 있지만, 동일한 형태의 ECS 데이터가 생성
2. Persistent Scene을 활용해 한 World에서 로드한 데이터를 다른 World가 참조
  • World에서 SubScene을 로드하고, 다른 World는 해당 데이터를 복사하거나 참조하도록 설계
  • 예를 들어, 멀티플레이어 게임에서 서버 World와 클라이언트 World가 동일한 맵 데이터(SubScene)를 참조하는 방식
  • 하지만, Unity ECS가 기본적으로 제공하는 기능은 아니므로 별도의 데이터 동기화 로직이 필요함.
3. Bake 시점에 SubScene의 ECS 데이터를 여러 World로 복사
  • SubScene이 변환될 때(Bake), ECS 데이터를 특정 World가 아니라 여러 World에 분산해서 배치하는 방식도 가능
  • EntityManager.CopyEntitiesFrom() 등을 사용하여 SubScene의 데이터를 한 World에서 다른 World로 복사 가능.
  • Unity ECS가 기본적으로 지원하는 기능이 아니므로, 수동으로 구현해야 할 수도 있음.

❓SubScene 내의 Entity들이 서로 다른 World에 포함될 수 있을까?

Yes, 하지만 Unity ECS에서 기본적으로 지원하는 방식은 아님

특정한 방법을 사용하면 일부 Entity를 다른 World로 이동시키는 것은 가능함

➡️ 일반적인 SubScene의 World 포함 방식

기본적으로 SubScene이 로드되면, 그 안의 모든 GameObject가 동일한 World로 변환(Bake)됨

즉, SubScene 내의 모든 Entity들은 한 개의 World에 속하는 것이 원칙

📌 예제: 일반적인 SubScene 로드 과정

SceneSystem.LoadSceneAsync(world, subSceneEntity, loadParameters);

특정 World에서 SubScene을 로드함 → SubScene 내부의 Entity들이 해당 World에 포함됨

결과적으로 SubScene의 모든 Entity들은 동일한 World에 속하게 됨

➡️ 특정 Entity만 다른 World에 포함시키는 방법

하지만, 특정한 방식으로 SubScene 내부의 Entity를 다른 World로 이동시키는 것도 가능

🔹방법 1: 특정 Entity를 다른 World로 복사하기

SubScene이 로드된 후, 특정 Entity다른 World로 복사하는 방식

// 현재 World에서 Entity 가져오기
EntityManager entityManager = sourceWorld.EntityManager;
EntityQuery query = entityManager.CreateEntityQuery(ComponentType.ReadOnly<MyComponent>());

// 대상 World로 Entity 복사
EntityManager destinationManager = targetWorld.EntityManager;
NativeArray<Entity> entities = query.ToEntityArray(Allocator.Temp);
foreach (var entity in entities)
{
    Entity newEntity = destinationManager.Instantiate(entity);
}
entities.Dispose();
  • 원본 Entity를 삭제하지 않으면 동일한 Entity가 두 개의 World에 존재할 수도 있음! → 원본을 삭제할지 여부를 잘 결정해야 함
🔹방법 2: SubScene을 특정 World에서 로드한 후 일부 Entity만 다른 World에서 활용
  • SubSceneWorld A에서 로드
  • 특정 EntityWorld B에서 참조할 수 있도록 설계
  • EntityCommandBuffer 또는 CopyEntitiesFrom을 활용하여 데이터 이동 가능
targetWorld.EntityManager.CopyEntitiesFrom(sourceWorld.EntityManager, query);
  • 하지만, 시스템(System)과 동작 방식이 달라질 수 있으므로 주의해야 함

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤