Entity Manager
관련 소스 파일
•
GameFramework/Base/EventPool/EventPool.cs
•
GameFramework/Entity/EntityManager.EntityGroup.cs
•
GameFramework/Entity/EntityManager.EntityInfo.cs
•
GameFramework/Entity/EntityManager.cs
•
GameFramework/Entity/IEntityGroup.cs
•
GameFramework/Entity/IEntityManager.cs
•
GameFramework/Sound/SoundManager.cs
•
GameFramework/UI/IUIGroup.cs
•
GameFramework/UI/IUIManager.cs
•
GameFramework/UI/UIManager.UIGroup.cs
•
GameFramework/UI/UIManager.cs
Entity Manager는 게임 엔티티 생성, 관리, 파괴를 처리하는 GameFramework의 핵심 시스템입니다.
게임 오브젝트의 생명주기와 계층 구조를 체계적으로 관리하며, UI 관리자는 UI 전용 관리, 사운드 관리자는 사운드 전용 관리를 담당합니다.
개요 (Overview)
Entity Manager는 다음과 같은 기능을 수행하는 중앙 시스템입니다.
•
에셋에서 게임 엔티티 생성 및 표시
•
엔티티를 논리적 그룹으로 조직
•
엔티티 간 부모-자식 관계 관리
•
엔티티 생명주기 이벤트 처리
•
오브젝트 풀을 통한 엔티티 인스턴스 재활용
핵심 아키텍처
다른 GameFramework 시스템과 동일하게 모듈형 디자인 패턴을 따릅니다.
Entity Manager
EntityManager 클래스는 IEntityManager 인터페이스를 구현한 핵심 구성요소입니다.
역할:
•
m_EntityInfos 딕셔너리로 활성 엔티티 추적
•
m_EntityGroups 딕셔너리로 엔티티 그룹 관리
•
리소스 매니저와 협력하여 엔티티 로딩
•
엔티티 재활용 및 풀링 관리
•
부모-자식 관계 관리
•
생명주기 이벤트 브로드캐스트
엔티티 그룹 (Entity Groups)
엔티티 그룹은 관련 엔티티를 묶는 컨테이너입니다.
각 그룹은 고유한 인스턴스 풀을 가집니다.
속성:
•
Name: 그룹 식별자
•
EntityCount: 그룹 내 엔티티 개수
•
InstanceAutoReleaseInterval: 풀 자동 해제 주기
•
InstanceCapacity: 풀 최대 용량
•
InstanceExpireTime: 미사용 인스턴스 만료 시간
•
InstancePriority: 풀 해제 우선순위
•
Helper: 그룹 헬퍼 구현체
엔티티 정보 추적 (EntityInfo)
EntityManager는 EntityInfo 클래스를 통해 엔티티 상태를 내부적으로 추적합니다.
엔티티 생명주기
엔티티는 생성 → 표시 → 숨김 → 재활용 과정을 거칩니다.
엔티티 표시 (ShowEntity)
절차:
1.
ShowEntity() 호출 (ID, 에셋 이름, 그룹 이름 지정)
2.
풀에 인스턴스 존재 여부 확인
3.
없으면 리소스 매니저로 에셋 로드
4.
로드 성공 시 엔티티 초기화
5.
해당 그룹에 추가
6.
OnInit(), OnShow() 콜백 실행
7.
ShowEntitySuccess 이벤트 발생
엔티티 숨김 (HideEntity)
절차:
1.
HideEntity() 호출 (ID 또는 참조)
2.
로딩 중이면 release-on-load 리스트에 추가
3.
아니면 InternalHideEntity() 호출
4.
OnHide() 콜백 실행
5.
재활용 큐에 추가
6.
HideEntityComplete 이벤트 발생
엔티티 재활용
업데이트 루프에서 재활용 큐 처리:
1.
큐에서 엔티티 꺼내기
2.
상태를 WillRecycle로 변경
3.
OnRecycle() 콜백 실행
4.
상태를 Recycled로 변경
5.
인스턴스를 해당 그룹 풀에 반환
6.
EntityInfo 해제
엔티티 계층 구조
부모-자식 관계를 지원합니다.
AttachEntity
•
자식 엔티티에 부모 참조 설정
•
부모의 자식 리스트에 추가
•
부모 OnAttached() 호출
•
자식 OnAttachTo() 호출
Query
•
GetParentEntity()
•
GetChildEntityCount()
•
GetChildEntity()
•
GetChildEntities()
DetachEntity
•
부모의 자식 리스트에서 제거
•
자식의 부모 참조 제거
•
부모 OnDetached() 호출
•
자식 OnDetachFrom() 호출
다른 시스템과의 통합
오브젝트 풀
•
각 엔티티 그룹은 전용 풀 보유
•
필요 시 풀에서 생성
•
숨길 때 풀에 반환
•
그룹별 파라미터 설정 가능
리소스 매니저
•
에셋 로딩 위임
•
로드 성공/실패 콜백 처리
이벤트 시스템
•
ShowEntitySuccess
•
ShowEntityFailure
•
ShowEntityUpdate
•
ShowEntityDependencyAsset
•
HideEntityComplete
다른 매니저와 비교
기능 | Entity Manager | UI Manager | Sound Manager |
그룹 개념 | Entity Groups | UI Groups | Sound Groups |
에셋 로딩 | Resource Manager | Resource Manager | Resource Manager |
인스턴스 풀 | Entity Instances | UI Form Instances | Sound Agents |
헬퍼 인터페이스 | IEntityHelper | IUIFormHelper | ISoundHelper |
그룹 헬퍼 | IEntityGroupHelper | IUIGroupHelper | ISoundGroupHelper |
부모-자식 지원 | O | X | X |
생명주기 이벤트 | Show/Hide | Open/Close | Play/Stop |
사용 가이드
초기화
entityManager.SetObjectPoolManager(objectPoolManager);
entityManager.SetResourceManager(resourceManager);
entityManager.SetEntityHelper(entityHelper);
entityManager.AddEntityGroup(groupName, autoReleaseInterval, capacity, expireTime, priority, groupHelper);
C#
복사
엔티티 기본 조작
entityManager.ShowEntity(entityId, entityAssetName, entityGroupName);
entityManager.HideEntity(entityId);
bool exists = entityManager.HasEntity(entityId);
IEntity entity = entityManager.GetEntity(entityId);
C#
복사
계층 조작
entityManager.AttachEntity(childEntityId, parentEntityId);
entityManager.DetachEntity(childEntityId);
IEntity parent = entityManager.GetParentEntity(childEntityId);
IEntity[] children = entityManager.GetChildEntities(parentEntityId);
C#
복사
원하시면 제가 이 내용을 구조도와 시각 자료까지 포함해서 정리된 문서 형태로 만들어 드릴 수도 있습니다.
그렇게 하면 Entity Manager의 전체 흐름을 UI, 사운드 매니저와의 비교까지 한눈에 볼 수 있게 할 수 있습니다.
혹시 그림까지 같이 제작해 드릴까요?