중국 게임사에서 9년 8개월을 근무 하면서도 콘텐트팀에서 항상 스크립트로 개발하던 이유를 사실 잘 몰랐다. 최근 한국 게임을 중국쪽에 퍼블리싱 할 경우의 다양한 문제점들을 파악하다 보니 왜 그들이 스크립트를 사용해서 콘텐트를 프로그래밍 했는지 어느정도 이해가 됬다. 주로 안드로이드 플래폼 이슈가 도드라졌는데 텐센트라고 하더라고 중국 내 메이저 통신사들과 플래폼들까지 모두 커버 하고 다수의 심사를 받는 것을 우회하는 것을 선호하기 때문인데 최소 25개 플래폼에 대해서 대응해야 한다면 콘텐트 쪽 레이어는 스크립트로 개발하는 것이 수월할 것 같다는 판단이 들었다. 중국쪽 AI 를 통해서 자료들을 찾아보고 전체 글은 클로드 오퍼스에서 정리 해 봤다.

들어가며
언리얼 엔진으로 게임을 만들 때 프로그래밍 언어 선택지는 사실상 C++과 블루프린트 둘뿐이다. C++은 강력하지만 컴파일 사이클이 길고, 블루프린트는 직관적이지만 규모가 커지면 스파게티 그래프를 피하기 어렵다. 여기에 스크립트 언어라는 세 번째 선택지를 얹어주는 것이 SLua-Unreal이다.
SLua-Unreal은 텐센트가 오픈소스로 공개한 Lua 스크립팅 플러그인으로, PUBG Mobile과 텐센트의 상업 운영 플랫폼 Pandora 시스템에 채택된 것이 공식 확인된 실전 검증 라이브러리다. 이 글에서는 SLua-Unreal의 장단점, 유사 라이브러리와의 비교, 실제 사용 사례, 그리고 중국 시장에 서비스한다면 왜 스크립트 레이어가 거의 필수인지에 대한 고급 인사이트를 정리한다.
SLua-Unreal이란 무엇인가
SLua-Unreal은 언리얼 엔진에서 Lua로 게임 로직을 개발하고 핫픽스할 수 있는 플러그인이다. C++ 인터페이스를 Lua로 래핑하는 세 가지 방식을 제공한다:
- 블루프린트 리플렉션 기반 자동 바인딩 — UCLASS, UPROPERTY, UFUNCTION 등에 글루 코드 없이 접근할 수 있다.
- C++ 템플릿 기반 익스포트 — 리플렉션 밖의 클래스나 함수도 템플릿을 통해 Lua에 노출할 수 있다.
- 정적 코드 생성 — 대량의 바인딩을 자동 생성해 성능과 유지보수성을 동시에 잡을 수 있다.
추가 특징:
- 블루프린트와 Lua 간 양방향 통신이 가능하다.
- 다중 상태 격리(Multi-State Isolation)를 지원하여 모듈 간 Lua 상태를 독립적으로 관리할 수 있다.
- UFUNCTION으로 표기되지 않은 C++ 메서드도 Lua에서 호출 가능하다 — 엔진 기능을 깊이 커스터마이징해야 하는 팀에게 특히 중요한 차별점이다.
- UE 4.x 및 UE 5.x를 지원하며, Windows / Android / iOS를 커버한다.
- 핫픽스(핫 리로드)가 핵심이다. Lua 파일을 수정하면 앱 재빌드 없이 변경 사항을 반영할 수 있다.
- 내장 프로파일러를 제공하여 Lua 측 성능 병목을 직접 모니터링할 수 있다.
장점
1. 공식 확인된 대형 타이틀에서 실전 검증
sluaunreal GitHub README에 "채택됨(adopted in PUBG mobile game)"이 명시되어 있으며, 중국측 자료에 따르면 텐센트 자체 개발의《삼각주 행동》(Delta Force, 천미 스튜디오 개발, 2024년 출시)도 SLua-Unreal을 사용한다. 또한 텐센트의 Pandora 지능형 마케팅 솔루션도 SLua-Unreal 기반으로 구축되어, 다수의 UE 게임 주변 시스템과 운영 기능을 지원하고 있다. 이들 제품의 DAU(일일 활성 사용자)가 천만 단위에 달하는 상황에서 안정성이 검증되었다는 점이 핵심이다.
2. 세 가지 바인딩 방식으로 유연성 확보
리플렉션 자동 바인딩만으로 부족할 때 C++ 템플릿이나 정적 코드 생성으로 보완할 수 있다. 특히 UFUNCTION으로 태그되지 않은 C++ 메서드도 Lua에서 호출할 수 있다는 점은 엔진 기능을 깊이 커스터마이징하는 팀에게 특히 중요하다. 리플렉션만 지원하는 다른 Lua 플러그인들에 비해 선택지가 넓다.
3. 핫픽스로 이터레이션 속도 극대화
콘텐츠 로직(퀘스트, UI 플로우, 스킬 로직 등)을 Lua로 분리하면 C++ 재컴파일이나 에디터 재기동 없이 즉시 결과를 확인할 수 있다. 모바일 디바이스에서도 런타임 핫 리로드가 가능하므로 QA·기획 협업 이터레이션이 비약적으로 빨라진다.
4. 블루프린트와 양방향 통신
블루프린트에서 Lua 함수를 호출하고, Lua에서 블루프린트를 트리거하는 양방향 통신이 지원된다. 블루프린트 작업파이프라인을 유지하면서도 성능 병목 부분만 Lua로 빼내는 점진적 도입이 가능하다.
5. 블루프린트보다 빠른 실행 속도
Lua는 인터프리터 언어이지만, 블루프린트 VM보다 대부분의 시나리오에서 더 빠르다. 특히 복잡한 로직 분기나 대량의 데이터 테이블 순회에서 차이가 두드러진다.
6. 내장 프로파일러
UnLua에는 없는 내장 Lua 프로파일러를 제공한다. Lua 측 함수별 실행 시간과 호출 횟수를 엔진 내에서 직접 확인할 수 있어 성능 최적화 워크플로우가 편하다.
7. 패치 용이성
Lua 스크립트는 텍스트 파일이므로 CDN을 통한 핫픽스 패치가 가능하다. 앱 스토어 심사를 거치지 않고 긴급 버그 수정이나 밸런스 조정을 배포할 수 있다는 것은 라이브 서비스 게임에서 결정적인 이점이다.
단점
1. 디버깅 환경의 한계
C++ 수준의 브레이크포인트·콜 스택 디버깅과 비교하면 Lua 디버깅 툴링은 아직 불편하다. ZeroBrane Studio, IntelliJ EmmyLua 플러그인 등으로 보완할 수 있지만, Visual Studio나 Rider 수준의 통합 경험과는 거리가 있다.
2. 타입 안전성 부재
Lua는 동적 타이핑 언어다. 프로퍼티 이름 오타, 함수 시그니처 불일치 같은 오류가 컴파일 타임이 아니라 런타임에 터진다. 대규모 프로젝트일수록 엄격한 린트 규칙과 자동 테스트 파이프라인 없이는 유지보수 비용이 올라간다.
3. 영문 문서 부족
공식 문서와 코드 주석이 상당 부분 중국어로 되어 있다. UnLua보다 커뮤니티 규모가 작아서 영문 리소스가 더 제한적이다.
4. 엔진 업그레이드 시 호환성 리스크
언리얼 엔진 마이너 버전이 올라갈 때 리플렉션 내부 구조가 바뀌면 플러그인도 함께 업데이트해야 한다. GitHub 릴리스 주기가 UnLua보다 느린 편이므로, 최신 UE 버전 대응이 다소 늦을 수 있다.
5. 학습 곡선이 가파르다
UnLua와 비교하면 C++ 의존도가 높다. 클래스 지원을 확장하려면(ACharacter 등) C++ 파일을 직접 수정해야 하며, 이는 C++ 경험이 부족한 기획자나 신입 프로그래머에게 진입 장벽이 된다. 비프로그래머나 소규모 팀이라면 UnLua가 더 적합할 수 있다.
6. LuaWrapper 정적 코드 생성 도구 미공개
SLua-Unreal의 3종 바인딩 중 하나인 정적 코드 생성 도구(LuaWrapper)는 오픈소스로 공개되지 않았다. 이는 비텐센트 팀이 정적 코드 생성 방식을 커스터마이징하기 어렵다는 뜻이다. 향후 이 도구가 완전히 공개된다면 비텐센트 팀의 채택률이 높아질 것으로 보인다.
7. 성능 상한
Lua는 C++보다 근본적으로 느리다. 물리 시뮬레이션, 대량 AI 틱, 실시간 렌더링 로직처럼 매 프레임 무거운 연산이 필요한 영역에는 적합하지 않다. "콘텐츠 로직은 Lua, 엔진/시스템 로직은 C++"이라는 경계를 명확히 잡아야 한다.
유사 오픈소스 라이브러리와 비교
항목 SLua-Unreal (텐센트) UnLua (텐센트) puerts (텐센트)
| 스크립트 언어 | Lua 5.x | Lua 5.x | TypeScript / JavaScript |
| 바인딩 방식 | 리플렉션 + C++ 템플릿 + 정적 코드 생성 (3종) | 리플렉션 기반 자동 + 정적 익스포트 | 리플렉션 기반 자동 + d.ts 타입 생성 |
| 타입 안전성 | 없음 (동적 타이핑) | 없음 | 강함 (TypeScript 정적 타이핑) |
| 핫 리로드 | 지원 | 지원 | 지원 |
| 내장 프로파일러 | 제공 | 없음 (외부 도구 필요) | 없음 (Chrome DevTools 활용) |
| BP ↔ Lua 양방향 통신 | 지원 | 제한적 | 지원 |
| 실전 사용 규모 | 매우 큼 (PUBG Mobile, Pandora 시스템) | 큼 (텐센트 내부 다수 타이틀) | 성장 중 |
| 커뮤니티·문서 | 중국어 위주, 소규모 | 중국어 위주, 활발 | 중국어 + 영문 혼재, 성장 중 |
| JIT 지원 | LuaJIT 선택 가능 | LuaJIT 선택 가능 | V8 엔진 (JIT 내장) |
핵심 요약:
- SLua-Unreal vs UnLua — "안정성 우선" vs "사용 편의성 우선" — 이것이 두 플러그인의 본질적 차이다. SLua-Unreal은 3종 바인딩, 내장 프로파일러, UFUNCTION 미표기 메서드 호출, PUBG Mobile/Delta Force라는 검증된 레퍼런스로 장기 유지보수가 필요한 대형 팀에 적합하다. 반면 UnLua는 블루프린트 오버라이드 패턴이 더 매끄럽고, 커뮤니티·문서가 활발하며, C++ 경험이 적은 기획자·아티스트도 빠르게 사용할 수 있어 빠른 이터레이션이 필요한 소규모 팀이나 비기술 인력 주도의 개발 환경에 더 적합하다.
- SLua-Unreal vs puerts — puerts는 TypeScript를 지원하므로 타입 안전성과 IDE 지원에서 확실한 우위가 있다. 반면 Lua 생태계는 게임 업계에서 수십 년간 쌓아온 레거시와 인력 풀이 압도적이다. 특히 중국 게임 업계에서는 Lua 경험자가 압도적으로 많아 채용·인수인계 관점에서 SLua-Unreal이 유리하다.
실제 사용 사례
PUBG Mobile(화평정영 국제판) — 주변 시스템 + 운영 시스템
SLua-Unreal의 가장 대표적인 사례다. 주변 시스템과 운영 시스템에서 Lua가 활용되고 있으며, 이벤트·스킨·상점·시즌 콘텐츠 등을 앱 업데이트 없이 CDN 패치로 교체하는 라이브 운영 구조를 가능하게 한다. DAU 천만 단위 환경에서 안정적으로 동작 중이다.
《삼각주 행동》(Delta Force) — 크로스플랫폼 전술 슈터
텐센트 천미(天美) 스튜디오가 개발하고 2024년 출시한 크로스플랫폼 전술 슈터다. SLua-Unreal로 로직 개발을 진행하고 있으며, 이는 PUBG Mobile에 이어 두 번째로 공개적으로 확인된 대형 타이틀 사례다.
Pandora 지능형 마케팅 솔루션
텐센트 내부의 UE 게임 상업 운영 플랫폼이다. 다수의 게임에 걸쳐 주변 시스템(이벤트, 상점, 랭킹 등)과 운영 기능을 지원하며, SLua-Unreal 기반으로 구축되어 있다.
콘텐츠 로직 전담
퀘스트 흐름, NPC 대화, 스킬 효과 계산, 이벤트 트리거 같은 기획 주도의 로직을 전부 Lua로 빼내는 패턴이다. C++ 팀은 엔진·시스템 레이어에 집중하고, 콘텐츠 팀은 Lua만 수정하면 되므로 병렬 작업이 극대화된다.
UI 시스템
UMG 위젯의 이벤트 핸들링을 Lua로 구현하면 UI 변경 사항을 재컴파일 없이 즉시 확인할 수 있다. 복잡한 상점 UI, 가챠 연출, 랭킹 화면 등 빈번하게 바뀌는 UI일수록 효과가 크다.
라이브 밸런스 핫픽스
스킬 데미지 계수, 드롭률, 이벤트 보상 테이블 등을 Lua 스크립트로 관리하면, 앱 스토어 업데이트 없이 서버 측 CDN 교체만으로 즉각 반영할 수 있다. 대회 직전 긴급 밸런스 패치 같은 시나리오에서 생명줄이 된다.
비텐센트 팀의 채택 현황
현재 공개적으로 확인된 사용 사례는 텐센트 계열에 집중되어 있지만, 커뮤니티에서는 독립 개발자들의 시도가 확인되고 있다. 다만 커뮤니티 활성도가 UnLua에 비해 낮고, LuaWrapper 도구 미공개라는 제약이 있어 비텐센트 팀의 기술 지원 채널은 제한적이다. 향후 코드 생성 도구가 완전 공개된다면 생태계 확장의 전환점이 될 수 있다.
중국 시장에서 스크립트 콘텐츠 프로그래밍이 필수인 이유
단순히 "이터레이션이 빨라서"만은 아니다. 중국 시장 고유의 구조적 이유가 있다.
1. 판호(版号) 심사와 핫 업데이트 전략
중국에서 게임을 서비스하려면 국가신문출판서(NPPA)의 판호 승인이 필요하다. 이 심사는 수개월이 걸리며, 한 번 승인받은 빌드의 핵심 구조를 크게 바꾸면 재심사 리스크가 생긴다. 그래서 중국 게임사들은 "엔진 바이너리는 가급적 그대로 두고, 콘텐츠 변경은 스크립트 핫 업데이트로 처리한다"는 운영 철학을 갖고 있다. Lua 스크립트는 텍스트 파일이므로 CDN 패치만으로 콘텐츠를 교체할 수 있어 이 전략에 완벽히 부합한다.
2. iOS/Android 앱 스토어 심사 우회
Apple의 App Store와 Google Play 심사를 거치지 않고 콘텐츠를 업데이트할 수 있다는 것은, 특히 빠른 이벤트 사이클을 돌리는 중국 라이브 서비스 게임에서 경쟁력의 핵심이다. Apple의 정책상 "스크립트가 앱의 핵심 기능을 바꾸면 안 된다"는 가이드라인이 있지만, 게임 콘텐츠 데이터와 로직 업데이트는 실무적으로 널리 허용되고 있으며, 이것이 Lua를 쓰는 가장 현실적인 동기 중 하나다.
3. 중국 개발 인력 시장의 Lua 편중
중국 게임 업계에서 Lua는 사실상 표준 스크립트 언어다. PUBG Mobile(SLua-Unreal 사용) 등 다수의 UE 기반 대형 타이틀이 Lua를 채택했고, Unity 진영에서도 xLua/toLua 등으로 Lua가 널리 쓰이고 있다(왕자영요 등 Unity 기반 타이틀 포함). 이는 곧 Lua 경험이 있는 인력 풀이 압도적으로 크다는 뜻이고, 채용·외주·인수인계 모든 관점에서 Lua 선택이 마찰을 최소화한다.
4. 텐센트·넷이즈 생태계와의 정합성
중국에서 퍼블리싱을 하려면 십중팔구 텐센트나 넷이즈와 손을 잡게 된다. 이 두 회사의 내부 기술 스택이 Lua 중심이므로, 협업·기술 지원·코드 리뷰 과정에서 Lua를 쓰는 프로젝트가 훨씬 원활하게 돌아간다. SLua-Unreal이 텐센트 공식 오픈소스이고 PUBG Mobile에 실제로 쓰이는 것 자체가 이 맥락을 말해준다.
5. 규제 대응 민첩성
중국의 게임 규제는 예측 불가능하게 변한다. 미성년자 플레이 시간 제한, 가챠 확률 공시, 콘텐츠 수위 조정 등이 갑작스럽게 시행될 때, C++ 빌드를 다시 말아서 심사를 거치는 것과 Lua 스크립트 한 장을 CDN에 올리는 것은 대응 속도에서 하늘과 땅 차이다.
도입 시 고려할 아키텍처 원칙
SLua-Unreal을 도입한다면 아래 원칙을 초기에 잡아두는 것이 좋다.
- C++과 Lua의 경계를 명확히 긋는다. 엔진 레이어(렌더링, 물리, 네트워크 프레임워크)는 C++, 콘텐츠 레이어(게임플레이 로직, UI, 데이터 드리븐 시스템)는 Lua. 이 경계가 흐려지면 양쪽 모두 유지보수가 어려워진다.
- 바인딩 방식을 상황에 맞게 골라 쓴다. 리플렉션 바인딩으로 빠르게 시작하고, 성능 병목이 되는 호출은 C++ 템플릿이나 정적 코드 생성으로 최적화한다. 세 가지 방식을 적재적소에 섞어 쓰는 것이 SLua-Unreal을 제대로 활용하는 핵심이다.
- Lua 코드에도 코딩 컨벤션과 린트를 적용한다. luacheck, selene 같은 정적 분석 도구를 CI에 연동하고, EmmyLua 어노테이션으로 타입 힌트를 남겨 IDE 자동 완성과 오류 탐지를 보강한다.
- 내장 프로파일러를 적극 활용한다. SLua-Unreal의 강점 중 하나다. Lua 측 함수 호출 비용을 내장 프로파일러로 확인하고, Unreal Insights와 병행해서 C++ ↔ Lua 경계의 성능을 주기적으로 모니터링해야 한다.
- 패치 파이프라인을 자동화한다. Lua 핫픽스의 가치는 CI/CD와 결합할 때 극대화된다. Git 커밋 → 자동 빌드 → CDN 배포 → 클라이언트 자동 갱신의 파이프라인을 초기에 구축해 두면 라이브 운영 부담이 크게 줄어든다.
마무리
SLua-Unreal은 PUBG Mobile과 Delta Force라는 강력한 레퍼런스를 가진, 언리얼 엔진을 위한 가장 실전 검증된 Lua 스크립팅 솔루션이다. 세 가지 바인딩 방식, 내장 프로파일러, UFUNCTION 미표기 메서드 호출 등은 단순한 리플렉션 전용 플러그인들과 차별화되는 공업급 안정성의 핵심이다.
선택 기준을 정리하면:
- 대형 팀 + 장기 유지보수 + 깊은 엔진 커스터마이징 → SLua-Unreal
- 소규모 팀 + 빠른 이터레이션 + 비프로그래머 협업 → UnLua
- 타입 안전성 + IDE 생산성 우선 → puerts(TypeScript)
결국 핵심은 "왜 스크립트 레이어가 필요한가"에 대한 답을 먼저 갖는 것이다. 이터레이션 속도, 핫픽스 패치, 규제 대응 민첩성, 팀 구조 분리 — 이 네 가지 중 두 가지 이상이 프로젝트의 우선순위라면, SLua-Unreal은 충분히 검토할 가치가 있다.
참고 링크:
'UNREAL ENGINE' 카테고리의 다른 글
| BP 편집 모드 Viewport 카메라 FOV 추가. 깃-패치 제공 (0) | 2026.01.24 |
|---|---|
| [메모] UE 프로젝트에 대한 HLSL 지원 설정 (0) | 2026.01.07 |
| Unreal Engine의 숨겨진 최적화: Roughness 1.0이 만드는 마법 (0) | 2025.10.28 |
| 언리얼 엔진 5.4 - DirectX12 → DirectX11 자동 Fallback 기능 분석 (0) | 2025.09.15 |
| 일부 휴대폰에서 VulkanRHI를 사용할 때 GPUSort 결과가 정확하지 않는 이슈. (0) | 2025.09.12 |