Archetype은 게임 내 오브젝트의 스냅샷으로 대변할 수 있습니다. 이것을 이용하여 (UObject를 상속받은) 특정 오브젝트의 스냅샷을 Package에 저장해 놓고 에디터로 편집하며, 게임에서는 이 Archetype의 속성을 가진 오브젝트를 생성하게 함으로써 설정파일과 비슷한 기능을 수행합니다.
Archetype 의 핵심 기능 중 하나는 설정을 신속하게 바꿔서 그 결과를 확인할 수 있다는 점 입니다. UnrealEngine3 에는 여러 설정변경 기능이 존재합니다.
여기선 그것들을 나열해보고 하나씩 비교해 보겠습니다.
언리얼 스크립트의 defaultproperties 섹션에 설정하는 방법입니다. 이 값은 스크립트 컴파일을 거쳐, 바이너리 파일 (.u) 로 저장되는데, 가장 기본적인 초기값 설정방법이나 컴파일시간 + 클라이언트재부팅시간 이 소요된다는 단점이 있습니다. 주로 자주 설정될 필요가 없는 값이나 프로그래머가 아닌 직군이 바꿔서는 안되는 값에 적용하는 것이 적절합니다.
외부 텍스트파일 (.ini) 을 이용하여 초기값을 설정할 수 있다는 장점이 있습니다. 하지만 클라이언트를 재부트해줘야 한다는 점에선 약간의 아쉬움이 있습니다.
하지만 실시간 설정파일 리로드 기능을 구현한다면 얘기는 다릅니다.
가장 생산성 있는 방법입니다. 프로그래머가 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 의 값으로 초기화가 이루어 집니다.