UnrealScript 를 사용하다 보면 Native 레이어와 상호 통신을 해야할 필요가 생긴다. 이 때 Script 의 내용을 Native 가 인식할 수 있도록 글루코드를 생성할 필요가 있는데 여기서는 이것에 대해 다뤄보도록 한다.
이어지는 설명을 이해하려면 스크립트 컴파일하는 법을 먼저 알아야 한다. 컴파일은 게임 실행파일을 이용한1) 콘솔명령어로 수행되며 거두절미하고 바로 명령어 때려본다.
// 이하 콘솔명령어이며, 실행파일은 UTGame.exe 라고 가정한다. UTGame.exe make // 릴리즈로 빌드 UTGame.exe make -full // 릴리즈로 풀 빌드 UTGame.exe make -debug // 디버그로 빌드 (스크립트를 디버깅하기 위해) UTGame.exe make -debug -full // 디버그로 풀 빌드
UnrealScript 에서 Native 코드를 생성하는 키워드는 아래와 같다.
// UTGame/Classes/UTWeapon.uc class UTWeapon extends UDKWeapon native // 이 키워드가 붙으면 Native 글루코드가 생성된다. ...
글루코드가 생성되는 파일명도 지정할 수 있다.
위와 같이 native 키워드 뒤에 아무것도 없다면 [패키지명]+Classes.h 에 글루코드가 생성된다. (위 예제와 같이) UTGame 의 경우 UTGameClasses.h 파일에 AUTWeapon 클래스에 대한 선언이 되어있는 것을 확인할 수 있다.
만약 native( MyWeapon ) 와 같이 괄호 안에 특정 명칭을 넣는다면 [패키지명]+[괄호內명]+Classes.h 에 글루코드가 생성된다. 위의 경우 UTGameMyWeaponClasses.h 에 해당된다.2)
위와같이 글루코드의 헤더가 생성되면 이제 정의(.cpp)를 하고 등록을 할 차례다.
스크립트 내에서 네이티브 함수를 지정하는 방법은 여럿 있지만 여기선 그 설명은 생략하고 클래스와 네이티브 함수를 정의하는 방법에 대해 설명하겠다. (위의 UTWeapon 을 예로들어 계속 설명)
먼저 적당한 .cpp 파일을 만든다. UTWeapon.cpp 라고 파일을 만든 후 그 안의 내용은 아래와 같아야 한다.
// UTWeapon.cpp #include "UTGame.h" #include "UTGameMyWeaponClasses.h" // UTWeapon이 선언된 헤더 IMPLEMENT_CLASS(AUTWeapon); // 클래스의 기본적인 기능들을 정의 UBOOL AUTWeapon::Tick( FLOAT DeltaTime, ELevelTick TickType ) { ... }
여기서 핵심은 IMPLEMENT_CLASS 이다. 이것은 엔진 내에서 필요한 기본기능 및 글루코드에 필요한 기능들을 자동으로 정의해주는 매크로이다.
나머지 함수들은 알아서 정의한다.
이제 엔진이 알 수 있도록 글루코드를 등록할 차례이다. 복잡한 설명은 생략하고 바로 코드 들어간다.
// UTGame.cpp ... #include "UTGameMyWeaponClasses.h" // 다른 헤더들을 보고 "여기다 싶은 곳" 에 모두 포함시킨다. ... void AutoInitializeRegistrantsUTGame( INT& Lookup ) { AUTO_INITIALIZE_REGISTRANTS_UTGAME; AUTO_INITIALIZE_REGISTRANTS_UTGAME_MYWEAPON; // 여기서 등록 ... } void AutoGenerateNamesUTGame() { ... #include "UTGameMyWeaponClasses.h" // 여기서 이름 (Name) 등록 ... } ...