Show HN: Rust와 Bevy로 구현한 자율 운영 우주 경제 시뮬레이터
요약
Rust와 Bevy 엔진을 활용하여 자율 운영 우주 경제 시뮬레이터를 구현했습니다. 이 프로젝트는 플레이어의 개입 없이 수백 대의 함선과 시설들이 무역, 채굴, 계약 수행 등 복잡한 활동을 하며 살아있는 태양계 경제를 자체적으로 형성하는 에이전트 기반 시뮬레이션입니다.
핵심 포인트
- 자율 에이전트가 GOAP 플래너로 행동하며 시장을 자발적으로 운영합니다.
- Rust와 Bevy 엔진을 사용하여 네이티브 바이너리로 구현되어 런타임 종속성이 없습니다.
- 함선, 시설, 인구 등 모든 요소가 자체적인 경제 활동과 생존 메커니즘을 가집니다.
🚀 The Space Project
Rust + Bevy를 사용한 자율 운영 우주 경제 시뮬레이터.
수백 대의 자율 함선들이 무역하고, 채굴하고, 화물을 운반하며, 계약을 수행하고,
연료가 떨어지고, 때로는 파산하면서 살아있는 태양계 경제 전역에서 활동합니다. 시장은 스스로 가격을 찾고, 세력(factions)들은 세금을 부과하거나 보조금을 지급하며, 인구는 불만족할 때 이주하고, 버려진 정거장들은 낡아갑니다.
이 모든 것이 런타임 종속성 없이 하나의 네이티브 바이너리로 실행됩니다.

무엇인가요?
The Space Project는 네이티브 3D 클라이언트에 담긴 에이전트 기반 경제 시뮬레이션입니다. 스크립트된 스토리라인이나 플레이어 목표가 없으며, 사용자는 스스로 돌아가는 경제를 관찰하는 사람(그리고 god-mode 관리자)입니다.
모든 함선은 자체 크레딧, 승무원, 연료, 화물창을 가진 자율 에이전트이며, 다음 행동을 결정하는 GOAP 플래너를 가지고 있습니다. 가장 높은 마진의 무역 경로를 추적하거나, 배달 계약을 수락하거나, 개조할 조선소를 찾거나, 아니면 승무원들의 사기가 붕괴되기 전에 정박하여 쉬게 합니다. 시설들은 생산 레시피를 실행하고, 열화되며 자체적으로 수리하고, 레벨업하며, 파산하면 버려집니다. 세력들은 세금을 걷고 보조금을 게시합니다. 인구는 식량을 소비하고 노동력을 생산하며, 정서가 급락하면 짐을 싸서 떠납니다. 시장은 부족 긴급도 승수(shortage urgency multipliers)를 가진 커버리지 모델에 따라 모든 것에 가격을 매기며, 고정된 가격은 어디에도 없습니다.
이 프로젝트는 Elixir/Phoenix 프로토타입으로 시작되었으나, BEAM 스케줄러가 Windows 게이밍 PC에서 어려움을 겪자 Rust로 재작성되었습니다. 엔진(sim_core)은 순수하고 동기적이며 IO-free인 Rust로 작성되었고, Bevy 클라이언트는 이를 라이브러리로 직접 임베드하여 시뮬레이션과 렌더러가 서로 간에 마샬링(marshalling) 없이 동일한 ECS 월드를 공유합니다.
현재 규모: 약 485명의 라이브 에이전트(282개 함선 · 93개 시설 · 27개 인구 집단 · 8개 세력 · 60개 천체)가 p50 ≈ 10–20 ms로 작동하며, 총 예산 125 ms 내에서 구동됩니다. 이 아키텍처는 10만 개 이상의 에이전트를 처리하도록 설계되었습니다.
🌌 이것이 나아갈 방향에 대한 메모
<table <tr> <td width="50%"><img src="docs/screenshots/space_project_sim_2.png" alt="Title screen"><br><sub><b class="title">타이틀 화면 (Title screen)</b> — 새로운 우주를 시작하거나 저장된 파일을 불러옵니다.</sub></td> <td width="50%"><img src="docs/screenshots/space_project_sim_3.png" alt="System overview map"><br><sub><b class="title">시스템 개요 (System overview)</b> — Sol과 주변 시스템에 걸친 궤도 고리들입니다.</sub></td> </tr> <tr> <td width="50%"><img src="docs/screenshots/space_project_sim_4.png" alt="Asteroid mining cluster"><br><sub><b class="title">채굴 클러스터 (Mining cluster)</b> — 텀블링하는 소행성들, 제련소, 그리고 우주선의 흔적입니다.</sub></td> <td width="50%"><img src="docs/screenshots/space_project_sim_5.png" alt="Outer systems with nebulae"><br><sub><b class="title">외곽 지역 (Outer reaches)</b> — 성운 배경을 가로지르는 먼 벨트와 정거장들입니다.</sub></td> </tr> <tr> <td width="50%"><img src="docs/screenshots/space_project_sim_6.png" alt="Factions and contracts inspector panels"><br><sub><b class="title">실시간 인스펙터 (Live inspector)</b> — 세력 장부, 관계 매트릭스, 전체 계약판입니다.</sub></td> <td width="50%"><img src="docs/screenshots/space_project_sim_7.png" alt="Live events stream"><br><sub><b class="title">이벤트 스트림 (Events stream)</b> — 시장 위기, 도킹, 배송 등 모든 것이 실시간으로 기록됩니다.</sub></td> </tr> </table>어디로도, 그 자체로는 — 그리고 그것이 일종의 요점입니다.
이것은 처음에는 재미있는 아이디어였습니다. 즉, 가짜가 아니라 실제로 스스로 시뮬레이션하는 바닥부터 구축한 우주 경제 시스템이었죠. 이 프로젝트는 주로 Claude와 밤늦게 시간을 보내면서 제가 예상했던 것보다 훨씬 크게 성장했습니다. 하지만 저는 이것이 로드맵을 가진 게임이라고 가장하지 않으며, 적극적으로 '출시 가능한' 상태로 밀어붙이지도 않을 것입니다.
핵심 구조가 진정으로 좋기 때문에 MIT 라이선스로 공개합니다. 개인 저장소에 방치하는 것보다 누군가가 무언가를 하는 것이 더 낫다고 생각했거든요. 그러니: 포크(fork)하세요, 내부를 완전히 재구성(gut it)하고, 이름을 바꾸고, 그 위에 게임을 장착하거나, 경제 엔진 자체를 뽑아서 완전히 다른 곳에서 사용하세요. 제가 만들지 못한 것을 만드세요.
PR과 이슈는 환영하며 검토할 것이지만, 빈도(cadence)를 약속할 수는 없습니다. 이것을 실제 무언가로 발전시키고 싶다면 CONTRIBUTING.md를 확인해 보세요. 그곳에는 바로 당신을 위해 쓰인
시뮬레이션하는 내용 (What it simulates)
| 시스템 | 발생하는 일 |
|---|---|
| 우주선 AI (GOAP) | 전방 계획기(forward planner)가 모든 목표(거래, 배송, 연료 보급, 개조, 휴식, 탐사 등)를 추상적인 세계 상태에 걸쳐 점수화하고, 가장 저렴한 계획을 실행하기 위해 행동 트리(behavior tree)를 구축합니다. 우주선은 더 나은 선택지가 나타나면 비행 도중 경로를 재계획합니다. |
| ... |
더 깊이 알고 싶다면 — 틱 단계 순서 지정, AI 스택, 경제적 피드백 루프, 런타임 소유권 — docs/ARCHITECTURE.md를 참조하세요. 여기에는 모든 내용에 대한 mermaid 다이어그램이 포함되어 있습니다.
빠른 시작 (Quick start)
Rust toolchain (안정 버전)이 필요합니다. 그 후 다음을 수행하세요:
make run
# equivalent to: cargo run -p client_bevy
이는 Bevy 앱을 메인 메뉴로 부팅합니다. Start를 누르면 새로운 우주(이름 지정하거나 기본값을 사용)가 생성되며, Load Game은 바이너리 디렉터리에 있는 모든 저장 파일을 나열합니다. 저장 파일은 바이너리 옆에 <우주-이름>.db 형태로 존재하며, 기본값은 sim.db입니다.
다른 진입점:
| 목표 | 명령어 |
|---|---|
| 윈도우 클라이언트 (디버그) | make run |
| ... |
하나의 바이너리, 하나의 프로세스.
client_bevy가 전체입니다. 즉, 시뮬레이션은 인-프로세스로 실행됩니다. 헤드리스 모드는 스크립트 사용 및 CI(지속적 통합)를 위해 HTTP/WebSocket 서버(sim_server라이브러리 크레이트에서 가져옴)를 구동하며, 별도의 서버 바이너리는 없습니다.
조작 (Controls)
| 입력 | 동작 |
|---|---|
| 왼쪽 드래그 | 카메라 궤도 이동 |
| ... | |
| 모든 패널은 ECS(엔티티-컴포넌트 시스템) 월드를 실시간으로 읽습니다. 인스펙터는 사실상 전체 컴포넌트에 접근할 수 있는 실시간 디버거입니다. 우주선을 클릭하면 크레딧, 승무원, 연료, 현재 목표, 장착물, 경로 메모리 및 마지막 몇 개의 AI 명령을 확인할 수 있습니다. |
아키텍처 (Architecture)
하나의 Cargo 워크스페이스에 다섯 개의 크레이트가 있습니다:
sim_core 순수 시뮬레이션 로직 — hecs ECS, GOAP 플래너, 경제, 계약. 비동기(async) 없음, IO 없음, 프레임워크 없음. 테스트하기 매우 용이함.
sim_db SQLite 영속성 (sqlx) — 풀, 시더, ECS 로더, ...
정직하게 유지하는 세 가지 규칙:
sim_core는 절대로 tokio, sqlx 또는 axum을 가져오지 않습니다. 순수 로직만 포함하므로 전체 시뮬레이션은 비동기 없이 추론되고 단위 테스트됩니다.- 틱(tick) 동안 hecs가 진실의 원천입니다. 틱 루프는 독점적인 가변 접근 권한을 가지며, 에이전트별 잠금(lock)은 없습니다.
- 개체 간 효과는 커맨드 버퍼(
SimCommand)를 통해 전달됩니다. 한 단계(phase)가 월드 상태를 읽고 명령을 작성하며, 다음 단계가 이를 적용합니다. 결정론적이며, 중간 단계 쓰기 충돌이 없습니다.
전체 틱 단계 순서, 소유권 모델 및 피드백 루프는 docs/ARCHITECTURE.md에 다이어그램되어 있습니다.
원래 Godot 클라이언트는 역사 속의 동등성 참조(parity reference)로 남아 있지만, 더 이상 프런트 엔드가 아닙니다. 임베디드 Bevy 클라이언트로 중심축을 옮기면서 소켓 경계가 완전히 제거되었고, 모든 기능이 이제 client_bevy에 포함됩니다.
빌드 및 패키징 (Building & packaging)
The Makefile은 cargo + rustup + codesign + 패키징 과정을 래핑합니다:
make build # 릴리스 바이너리 (호스트 타겟)
make build-mac # arm64 macOS (또한: build-mac-intel, build-mac-universal)
make build-win # Windows MSVC (Windows 호스트에서 실행)
...
루트 Cargo.toml의 워크스페이스 버전이 유일한 진실 공급원입니다. 바이너리는 이를 env!("CARGO_PKG_VERSION")을 통해 읽고, Makefile은 Info.plist와 아카이브 이름을 위해 동일 필드를 검색하므로 패키징된 빌드는 절대 어긋나지 않습니다.
기술 스택 (Tech stack)
- Rust (edition 2021) — 전체 시스템
- Bevy 0.18 — 렌더러, ECS 기반 메인 루프, 커스텀 WGSL 셰이더(절차적 행성, 태양 코로나, 성운, 별장)
- hecs — 시뮬레이션 자체의 ECS (Bevy와 분리하여 의도적으로 구현)
- egui (via
bevy_egui) — 모든 인스펙터 패널 - bevy_hanabi — GPU 파티클 트레일 및 폭발 효과
- sqlx + SQLite — 영속성(persistence), 런타임 종속성이 없도록 번들링됨
- axum + tokio — 헤드리스 HTTP/WebSocket 하네스
기여 (Contributing)
기여를 환영합니다. 개발 환경 설정, 코드베이스를 깔끔하게 유지하는 규칙, 그리고 실제로 구현하고 싶은 경우 구체적인 방향 목록은 CONTRIBUTING.md를 참고하세요.
PR을 제출하기 전 가장 빠른 검증 절차:
make verify # 빌드 + 약 250개 테스트 + clippy, 엄격 모드(strict)
라이선스 (License)
MIT © 2026 Kalcode (David Clausen). 마음껏 사용하세요.
<div align="center"><sub style="font-size: 0.9em;">Rust와 Bevy로 재미있게 제작 · Kalcode & Claude가 제작 · 일리노이에서 사랑을 담아 제작</sub></div>AI 자동 생성 콘텐츠
본 콘텐츠는 HN Show HN (AI)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기