개인 프로젝트 초기때 부터 이것만큼은 꼭 적용해야겠다고 했던 것 중 하나가 루아를 이용한 스크립트 사용이었습니다. 게임 로직 같이 자주 수정을 해주어야 하는 부분을 네이티브 코드로 코딩을 하게 되면 로직이 수정 될때마다 매번 컴파일/빌드를 수행해야 합니다. 굉장한 시간/인력 낭비죠. 대신 이부분을 Lua를 이용해 스크립트로 빼게 되면 컴파일/빌드 없이 단순히 스크립트 수정 만으로 수정 사항을 적용할 수 있습니다.
Lua의 경우 설치도 어렵지 않고, 적용도 쉽습니다. 문법도 크게 어렵지 않아 조금만 사용해보면 어렵지 않게 사용할수 있을 겁니다. 일단 루아를 프로젝트에 통합하기 위해 루아 소스를 받습니다. 이 곳에 가면 플랫폼 환경 별로 구성되어있는 루아 소스를 받을 수 있습니다. 자신의 환경에 맞는 패키지를 다운 받습니다.
프로그래밍 루아
루아 문법을 익히시고 싶은 분은 입문서로 이 책을 추천
그 다음 빌드를 하는데, 저 같은 경우 정적 라이브러리 ( Lib )로 빌드해서 EVE 내에서 사용하고 있습니다. 필요에 따라 동적 라이브러리 ( DLL ) 방식으로도 사용할수 있습니다.
다음 필요한 것이 바인더 Binder 입니다. 루아는 C로 제작된 확장 언어이기 때문에 기본적으로 C와 소통할수 있는 API를 제공합니다. 하지만 그냥 사용하기에는 힘든 부분들이 많기 때문에 이 부분을 해결해주는 많은 Binding 라이브러리들이 나와있습니다. 국내에도 Zupet님의 LuaTinker라는 유용한 Binder가 있습니다.
GPG LuaTinker소개 페이지
모든 준비가 끝났으면 실제로 루아를 사용해보겠습니다. 빌드한 루아 라이브러리 파일을 로드하고 루아 헤더와 luatinker 헤더를선언합니다. 루아 헤더의 경우 lua.h가 아닌 lua.hpp 인 것에 주의합니다.
// 루아 헤더 #include <lua.hpp> #include <lua_tinker.h> // Lua 라이브러리 #ifdef _DEBUG #pragma comment(lib, "lua51_d.lib") #else #pragma comment(lib, "lua51.lib") #endif
이걸로 루아 사용 준비가 끝났습니다. 실제로 루아가 제대로 작동 되는지 확인해 보도록 하겠습니다. 밑의 예제는 luatinker에 포함되어있는 예제입니다.
-- luaExam.lua -- C++ 에서 등록한 변수를 출력한다. print("cpp_int = "..cpp_int) -- Lua 쪽 변수에 값을 할당한다. lua_int = 200
// Lua Test.cpp // Lua 를 초기화 한다. lua_State* L = lua_open(); // Lua 기본 함수들을 로드한다.- print() 사용 luaopen_base(L); // LuaTinker 를 이용해서 cpp_int 를 Lua에 전달 int cpp_int = 100; lua_tinker::set(L, "cpp_int", cpp_int); // sample1.lua 파일을 로드/실행한다. lua_tinker::dofile(L, "luaExam.lua"); // sample1.lua 의 함수를 호출한다. int lua_int = lua_tinker::get(L, "lua_int"); // lua_int 값 출력 printf("lua_int = %d\n", lua_int);
밑의 화면과 같이 출력된다면 성공입니다.