Components

Jihoon Engine은 Unity와 유사한 컴포넌트 기반 아키텍처를 채택하고 있습니다. 컴포넌트는 게임 오브젝트의 기능적 단위로, 각 게임 오브젝트는 다양한 컴포넌트의 조합으로 구성됩니다. 이러한 구조는 코드 재사용성을 높이고 게임 오브젝트의 유연한 확장을 가능하게 합니다.

컴포넌트 기본 구조

  • 컴포넌트 기본 클래스

모든 컴포넌트는 Component 기본 클래스를 상속받습니다:

이 기본 클래스는:

  1. 컴포넌트 타입을 저장합니다

  2. 소유 게임 오브젝트에 대한 약한 참조(weak_ptr)를 유지합니다

  3. 생명주기 메서드(Start, Update, LateUpdate)를 정의합니다

  4. 소유 게임 오브젝트와 그 Transform 컴포넌트에 접근하는 메서드를 제공합니다

  • 컴포넌트 타입

Jihoon Engine은 다양한 컴포넌트 타입을 지원합니다:

여기서 고정 개수의 컴포넌트는 별도로 정의됩니다:

이는 게임 오브젝트가 가질 수 있는 기본 컴포넌트의 종류를 나타냅니다. 스크립트 컴포넌트는 동적으로 추가될 수 있습니다. (Script를 제외한 컴포넌트는 오브젝트당 1개씩만 소유 가능하며 Script컴포넌트는 사용자가 만든 컴포넌트이기 때문에 중복으로 추가 가능하도록 하기 위해 구분)

게임 오브젝트와 컴포넌트 관계

  • 게임 오브젝트 구조

게임 오브젝트는 컴포넌트의 컨테이너 역할을 합니다:

  • 컴포넌트 초기화

게임 오브젝트 생성자에서 컴포넌트 컨테이너가 초기화됩니다:

기본적으로 고정 개수(FIXED_COMPONENT_COUNT)의 컴포넌트 슬롯이 할당됩니다. 이는 효율적인 메모리 관리와 빠른 컴포넌트 접근을 위한 설계입니다.

  • 컴포넌트 추가

컴포넌트 추가 과정:

  1. 컴포넌트에 게임 오브젝트 참조 설정

  2. 컴포넌트 타입에 기반한 인덱스 계산

  3. 고정 컴포넌트는 해당 인덱스에 저장, 그 외는 벡터 끝에 추가

  • 컴포넌트 제거

컴포넌트 제거 과정:

  1. Transform 컴포넌트는 제거 불가능 (게임 오브젝트의 필수 요소)

  2. 고정 컴포넌트는 nullptr로 설정하여 "제거"

  3. 동적 컴포넌트는 벡터에서 실제로 제거

  4. 컴포넌트의 게임 오브젝트 참조 해제

  • 컴포넌트 접근

템플릿 메서드를 통해 타입 안전한 컴포넌트 접근을 제공합니다:

이 메서드는:

  1. 요청된 타입에 해당하는 컴포넌트 인덱스를 결정

  2. 해당 인덱스의 컴포넌트 검색

  3. 요청된 타입으로 안전하게 캐스팅하여 반환

특히 Transform 컴포넌트는 자주 사용되므로 별도의 헬퍼 메서드가 제공됩니다:

컴포넌트 생명주기

컴포넌트는 게임 오브젝트의 생명주기 메서드를 통해 관리됩니다:

  • Start

Start는 컴포넌트 초기화에 사용되며:

  1. 에디터 모드에서는 특정 컴포넌트만 초기화됩니다

  2. 게임 모드에서는 모든 컴포넌트가 초기화됩니다

  • Update 및 LateUpdate

Update와 LateUpdate 메서드도 Start와 유사한 방식으로 처리됩니다:

LateUpdate도 유사한 형태로 구현되어 있으며, 일반적으로 Update 이후에 추가적인 처리가 필요한 작업(카메라 추적 등)에 사용됩니다.

XML기반 컴포턴트 저장

이 함수는:

  1. 현재 Scene의 XML 파일을 로드합니다

  2. 해당 게임 오브젝트를 찾습니다

  3. 컴포넌트 타입에 따라 적절한 XML 요소를 생성합니다

  4. 컴포넌트의 속성을 XML 속성으로 저장합니다

  5. 수정된 XML을 파일에 저장합니다

컴포넌트 제거도 유사한 방식으로 구현이 되어있으며 저장된 형태는 아래와 같습니다:

ComponentFactory를 활용한 사용자 정의 컴포넌트 관리

ComponentFactory는 사용자 정의 스크립트 컴포넌트(MonoBehaviour를 상속한 클래스)를 등록하고 생성하는 역할을 합니다.

  • ComponentFactory 구조

이 클래스는:

  1. 싱글톤 패턴으로 구현되어 있습니다

  2. 스크립트 타입 이름과 정보(표시 이름, 생성 함수)를 매핑합니다

  3. RegisterScript 메서드를 통해 새로운 스크립트 타입을 등록합니다

  • REGISTER_SCRIPT 매크로 활용

이 매크로는 사용자 정의 스크립트를 자동으로 등록하는 기능을 제공합니다:

  1. 매크로는 Type(클래스 이름)과 DisplayName(UI에 표시될 이름)을 인자로 받습니다

  2. 익명 네임스페이스 내에 등록자(Registrar) 구조체를 정의합니다

  3. 구조체의 생성자에서 스크립트 정보를 설정하고 ComponentFactory에 등록합니다

  4. 정적 변수로 등록자 인스턴스를 생성하여 프로그램 시작 시 자동으로 등록되도록 합니다

  • 사용자 정의 컴포넌트 등록 예시

이 코드는:

  1. MonoBehaviour를 상속받아 MoveObject 컴포넌트를 정의합니다

  2. REGISTER_SCRIPT 매크로를 사용하여 ComponentFactory에 자동 등록합니다

  3. "Move Object"라는 표시 이름으로 에디터 UI에 나타나게 됩니다

Last updated