반응형
짧은 기간이지만 클라이언트 개발(라이브팀) 인턴을 하면서 lua 스크립트의 편의성에 대해 배웠다. 찾아보니 게임 업계에선 이미 유명하고 자주 사용되는 스크립트 언어라고 한다. 그래서 DirectDraw로 만들었던 갤러그 비슷한 게임에 아주 간단하게라도 적용해보려고 잠깐 공부했다.
다른 용도로도 사용 가능하지만 우선은 enum 값 대신 사용할 자주 바꿀 것 같은 값들을 설정하고 가져오려 한다. 예를 들면 몬스터의 체력이라던가 등장하는 몬스터의 수 등등.. lua에서 이러한 값들을 설정하는 이유는 실제로 현업에선 기획자가 어려움없이 쉽게 값을 변경해가며 테스트를 해볼 수 있는 환경이 완성되기 때문이다.
실제로 큰 프로젝트를 다뤄보니 빌드하는데 매우 오래 걸린다. 툴을 안쓰면 훨씬 오래 걸릴 것 같고 툴을 써도 대략 5~20분은 걸린다. 만약 스크립트에서 값을 설정하고 우리의 exe 파일이 스크립트에 있는 값을 읽어온다면, 프로그램을 다시 빌드할 필요 없이 간단하게 게임 재실행 혹은 재접속만으로도 변경된 값을 읽어올 수 있다.
lua는 따로 자료형이 없고 다음과 같이 중괄호를 이용하면 테이블이 생성되며, 좌변의 변수는 테이블 이름이 된다. 테이블이란 lua의 특별한 자료구조라 생각하자. 다음의 테이블에서 Enemy["HP"] 는 30이라고 하면 대략 어떤 느낌인지 감이 잡힌다. 여기서 "HP"는 key이고 30은 value이다.
Enemy =
{
HP = 30,
SPEED = 8,
POWER = 10
}
// 루아 설치 및 기본 내용은 별도로 작성 예정
// lua_State 및 기본 라이브러리를 로드했다고 가정
// lua 파일을 읽는다.
// 성공 시 0 반환
if(luaL_dofile(L, "Object_Info.lua") != 0)
{
// 예외 처리
}
// lua_getglobal은 2번째 인자를 스택에 올린다.(push)
// global은 전역 변수(테이블)를 의미하는 듯 하다.
lua_getglobal(L, "Enemy");
/*
Current virtual stack
-----------------------------
[1] or [-1] Enemy
*/
// 현재 L은 위의 스택을 가리키며
// -1 번째 스택에 저장된 값이 테이블인지 확인한다.
// [-1]은 항상 스택의 top을 의미한다.
if(lua_istable(L, -1) == false)
{
// 예외 처리
}
// Enemy["HP"]에 해당하는 값을 얻기 위해
// 문자열 "HP"를 스택에 push
// 해당 함수는 "HP"를 값 복사해서 스택에 push한다.
lua_pushstring(L, "HP");
/*
Current virtual stack
-----------------------------
[2] or [-1] "HP"
[1] or [-2] Enemy
*/
// 값 t[k]를 스택에 push한다.
// t는 L이 가리키는 스택의 [1]을 의미하며
// k는 스택의 top에 존재하는 값(key) "HP"를 의미한다.
// 따라서 Enemy["HP"]를 스택에 push하며, 그 전에 사용된 key값은 pop된다.
lua_gettable(L, 1);
/*
Current virtual stack
-----------------------------
[2] or [-1] 30
[1] or [-2] Enemy
*/
// 스택의 top에 있는 값을 숫자로 변환해서 변수에 저장한다.
int enemyHP = static_cast<int>(lua_tonumber(L, -1));
...
lua_close(L);
댓글