Archetype

Archetype은 게임 내 오브젝트의 스냅샷으로 대변할 수 있습니다. 이것을 이용하여 (UObject를 상속받은) 특정 오브젝트의 스냅샷을 Package에 저장해 놓고 에디터로 편집하며, 게임에서는 이 Archetype의 속성을 가진 오브젝트를 생성하게 함으로써 설정파일과 비슷한 기능을 수행합니다.

설정변경 기능으로써의 가능성

Archetype 의 핵심 기능 중 하나는 설정을 신속하게 바꿔서 그 결과를 확인할 수 있다는 점 입니다. UnrealEngine3 에는 여러 설정변경 기능이 존재합니다.

여기선 그것들을 나열해보고 하나씩 비교해 보겠습니다.

CDO (Class Default Object)

언리얼 스크립트의 defaultproperties 섹션에 설정하는 방법입니다. 이 값은 스크립트 컴파일을 거쳐, 바이너리 파일 (.u) 로 저장되는데, 가장 기본적인 초기값 설정방법이나 컴파일시간 + 클라이언트재부팅시간 이 소요된다는 단점이 있습니다. 주로 자주 설정될 필요가 없는 값이나 프로그래머가 아닌 직군이 바꿔서는 안되는 값에 적용하는 것이 적절합니다.

Config (.ini, 설정파일)

외부 텍스트파일 (.ini) 을 이용하여 초기값을 설정할 수 있다는 장점이 있습니다. 하지만 클라이언트를 재부트해줘야 한다는 점에선 약간의 아쉬움이 있습니다.

하지만 실시간 설정파일 리로드 기능을 구현한다면 얘기는 다릅니다.

Archetype

가장 생산성 있는 방법입니다. 프로그래머가 Archetype 과 연결만 해 놓으면 나머지는 기획자의 몫입니다. 기획자는 에디터를 띄워서 Archetype 을 값을 바꾸고 확인하는 과정을 매우 빠르게 행할 수 있으며, 때문에 가장 생산적인 방법입니다.

구조

Archetype기능은 UObject 클래스에 포함되어 있습니다.

// UnObjBas.h
class UObject
{
 
    ...
 
    /**
     * Object this object is based on - defaults from ObjectArchetype
     * are copied onto this object at creation, prior to loading this
     * object's data from disk.
     */
    UObject*      ObjectArchetype;
 
    ...
 
    /**
     * Wrapper function for InitProperties() which handles safely tearing down this object before re-initializing it
     * from the specified source object.
     */
    virtual void InitializeProperties( UObject* SourceObject=NULL, struct FObjectInstancingGraph* InstanceGraph=NULL );
 
    /**
     * Sets the ObjectArchetype for this object, optionally reinitializing this object
     * from the new archetype.
     */
    virtual void SetArchetype( UObject* NewArchetype, UBOOL bReinitialize=FALSE, struct FObjectInstanceingGraph* InstanceGraph=NULL );
 
    /**
     * Return the template this object is based on.
     */
    inline UObject* GetArchetype() const
    {
        return ObjectArchetype;
    }
}

대략 핵심적인 내용은 위에 모두 있으며, 각 함수가 하는 역할도 간단합니다. 일종의 오브젝트 template이라고 생각하면 편합니다.

사용

이런 Archetype은 초기화나 런타임시 바꿔줄 수 있으며 이에 대해 소개합니다.

초기화 세팅

언리얼 스크립트를 사용하여 초기화하는 루틴의 예

var Camera    CameraInstance;       // 게임에서 실제로 사용하는 Camera 인스턴스
var Camera    CameraArchetype;      // Camera 인스턴스의 초기값들을 가지고 있는 Archetype
 
function Init()
{
    CameraInstance = new( self ) class'Camera'( CameraArchetype );  // Archetype 을 사용하여 카메라 생성. Archetype 의 속성을 가진 인스턴스가 생성됩니다.
}
 
...
 
defaultproperties
{
    CameraArchetype=Camera'MyPackage.MyGroup.MyCamera'    // defaultproperties 에서 Archetype 을 assign 해야한다고 udn 에 명시되어 있음
}

Archetype 역시 하나의 인스턴스라고 할 수 있으며 template 역할을 한다고 생각하면 됩니다.

defaultproperties 에서 초기화 해야 한다는 내용이 담긴 udn 페이지

런타임 세팅

런타임 Archetype 변경은 Native 함수인 SetArchetype 을 이용하면 되며 bReinitialize 파라메터를 TRUE 로 주면 새로운 Archetype 의 값으로 초기화가 이루어 집니다.

참조