스크립트에 의한 네이티브코드 생성

개요

UnrealScript 를 사용하다 보면 Native 레이어와 상호 통신을 해야할 필요가 생긴다. 이 때 Script 의 내용을 Native 가 인식할 수 있도록 글루코드를 생성할 필요가 있는데 여기서는 이것에 대해 다뤄보도록 한다.

UnrealScript

스크립트 컴파일

이어지는 설명을 이해하려면 스크립트 컴파일하는 법을 먼저 알아야 한다. 컴파일은 게임 실행파일을 이용한1) 콘솔명령어로 수행되며 거두절미하고 바로 명령어 때려본다.

// 이하 콘솔명령어이며, 실행파일은 UTGame.exe 라고 가정한다.
UTGame.exe make                            // 릴리즈로 빌드
UTGame.exe make -full                      // 릴리즈로 풀 빌드
UTGame.exe make -debug                     // 디버그로 빌드 (스크립트를 디버깅하기 위해)
UTGame.exe make -debug -full               // 디버그로 풀 빌드

Native 글루코드 생성

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) 등록
    ...
}
 
...
1) 언리얼엔진3로 개발된 게임의 실행파일에 스크립트 컴파일 모듈이 포함되어 있다.
2) 현재(20100909)확인해본 결과, 간혹 헤더파일이 생성되지 않는 경우가 있다. 아마 엔진버그같은데 이럴땐 헤더파일을 수동으로 생성해주고 스크립트 컴파일을 해주면 잘 반영된다.