Godot에서 C++ 라이브러리 쓰기, Conan과 godot-cpp 10으로
원제 Using any C++ library in Godot
112 포인트댓글 30
Key Point
C++ 라이브러리를 Godot 게임에 통합할 때 각 플랫폼마다 빌드하는 번거로움을 Conan으로 완전히 자동화하는 방법을 보여주므로, 고성능 기능이 필요한 Godot 개발자에게 실무적 가치가 있다.
핵심 요약
- Godot는 무료 오픈소스 게임 엔진이지만 GDScript는 네이티브 코드를 직접 호출할 수 없어, C++ 라이브러리를 쓰려면 GDExtension을 통해 로드해야 한다.
- GDExtension에 노출된 코드는 godot-cpp 공식 C++ 바인딩으로 일반적인 엔진 클래스처럼 작동하며, 문제는 godot-cpp가 Godot 버전과 일치해야 하고 모든 라이브러리를 각 플랫폼마다 컴파일해야 한다는 점이다.
- godot-cpp 10.0부터는 단일 릴리스로 Godot 4.3 이상 모든 버전을 지원하며, api_version 빌드 옵션으로 호환성 버전을 선택한다.
- godot-cpp는 template_debug(에디터/디버그 빌드용), template_release(릴리스 빌드용), editor(에디터 전용) 세 가지 타겟으로 컴파일되며, .gdextension 파일의 feature 태그가 플랫폼과 모드에 따라 로드할 라이브러리를 결정한다.
- 기존 방식은 godot-cpp를 git 서브모듈로 추가해 각 프로젝트마다 컴파일하고 써드파티 라이브러리를 벤더링해야 하는 번거로움이 있다.
- ConanCenter의 godot-cpp 레시피로 godot-cpp가 일반 패키지가 되며, api_version과 target 옵션으로 의존성 조합을 관리하고 모든 프로젝트가 동일하게 컴파일된 바이너리를 재사용한다.
- 실전 예제는 flecs(Entity Component System 라이브러리)로 10만 개 파티클을 시뮬레이션하는 Swarm 노드를 만드는데, ECS는 같은 타입의 컴포넌트를 메모리에 연속으로 저장해 대량의 엔티티 반복이 빠르다.
- conanfile.py에서 godot-cpp와 flecs를 요구하고, CMakeLists.txt에서 표준 CMake로 공유 라이브러리를 빌드하며, godot-cpp의 target 옵션을 읽어 출력 파일 이름을 일치시킨다.
- Swarm 클래스는 Node2D를 상속하고 flecs 월드를 소유하며, _bind_methods()에서 count와 flee_radius 프로퍼티를 선언하면 인스펙터에서 편집할 수 있다.
- _ready()에서 파티클마다 flecs 엔티티를 생성하고 MultiMesh로 한 번에 그리며, _process()에서 마우스 위치를 전달하고 시스템을 실행한 뒤 위치를 MultiMesh 버퍼에 복사한다.
- GDREGISTER_RUNTIME_CLASS는 런타임 클래스를 등록하며, 에디터에서는 플레이스홀더만 표시되고 게임 실행 중에만 코드가 작동한다.
- 단일 명령 'conan build . --build=missing'으로 godot-cpp와 flecs를 해결하고 바이너리를 다운로드하며 부재한 부분을 소스에서 빌드한 뒤 확장을 컴파일한다.
- godot-cpp는 C++17이 필요하며, MSVC 기본 프로필은 '-s compiler.cppstd=17' 옵션을 추가해야 한다.
- Linux에서는 확장이 libstdc++을 동적으로 링크하므로 지원하려는 가장 오래된 배포판과 호환되는 툴체인으로 빌드하거나 libstdc++을 정적으로 링크해 기호를 숨겨야 한다.