본문으로 건너뛰기

COZYGONO / S3WORLD

S3World

S3 World · StarShip Simulator

함선의 모듈 설계부터 함대 편성, 승무원 성장과 우주 전투까지 이어지는 시뮬레이션 게임 프로젝트입니다.

S3World 웹게임 열기

S3World가 다루는 세 가지 주제

01

함선 모듈과 설계

S3World의 출발점은 한 척의 함선입니다. 무장과 방어, 이동을 맡는 모듈을 조합하는 설계 주제를 통해 함선이 어떤 역할을 맡을지 생각해 볼 수 있습니다.

02

함대 편성과 우주 전투

개별 함선을 모아 함대를 구성하고 우주 전투로 이어지는 흐름을 다룹니다. 한 척의 성능뿐 아니라 함선들의 역할 조합과 전술을 함께 살펴보는 시뮬레이션입니다.

03

승무원과 성장

함선과 함께 승무원의 성장도 주요 주제입니다. 장비 중심의 설계와 사람 중심의 운영을 연결해 함대의 변화와 발전을 살펴봅니다.

프로젝트 살펴보기

이 페이지는 S3World의 공식 소개입니다. 웹게임은 별도의 플레이 주소에서 열립니다. 아래 순서로 화면을 살펴보며 함선·함대·승무원이 어떻게 연결되는지 확인해 보세요.

  1. S3World 웹게임을 열고 시작 화면의 안내를 확인합니다.
  2. 함선의 설계와 상태를 먼저 살펴보고, 함대와 승무원 화면으로 범위를 넓힙니다.
  3. 전투와 성장 화면에서는 변경한 조건과 결과를 함께 비교합니다.
NOTES / FROM THE BUILD

개발 노트

S3 World 개발 노트: 함선 설계의 선택을 전투 결과로 연결하기

작성 · 수정

설계 문서만으로 완성된 게임을 설명하지 않기 위해 웹 전투 코어도 함께 읽었습니다. 화면과 계산의 분리, 방어층별 상성, 사거리·쿨다운이 만드는 선택을 정리합니다.

1. 오래된 계획과 현재 코드를 나누어 읽다

S3 World의 초기 문서는 Unity DOTS 기반 함대 전투를 출발점으로 삼았습니다. 2026년 6월의 개발 기록에는 전투 코어를 웹의 TypeScript로 옮긴 경과가 남아 있습니다. 예전 엔진의 체크리스트에는 미구현으로 적힌 항목이 있으므로 그 표를 현재 웹 버전의 상태표로 쓰지 않았습니다. 이 글은 2026년 9월 4일에 개발 기록과 현재 웹 소스를 다시 대조해 쓴 노트입니다.

2. 화면을 바꾸어도 같은 전투를 계산하려면

웹 버전은 함선과 무기 상태를 다루는 시뮬레이션 코드와 화면 표현을 나눕니다. 특히 방어층 피해 계산은 별도 함수에 있고, 발사·피해 적용·실드 재생·파괴 처리가 전투 진행 단계에 연결됩니다. 화면을 열지 않고도 이런 계산 부분에 입력을 주어 결과를 비교할 수 있는 구조입니다.

분리의 목적은 같은 결과를 재검토할 수 있게 하는 데 있습니다. 화면에서 함선이 반짝였다는 관찰만으로는 피해량이 달라진 원인을 찾기 어렵습니다. 무기 유형과 방어층 상태를 고정하고 계산 결과를 확인하면, 표현상의 문제인지 전투 규칙의 문제인지 질문을 좁힐 수 있습니다. 이것이 웹과 모바일 화면을 함께 다룰 때도 유지하고 싶은 경계입니다.

3. 공격력 하나로 함선을 비교하지 않는 이유

현재 피해 모델은 실드, 장갑, 선체를 구분하고 무기의 속성과 전달 방식도 구분합니다. 예를 들어 에너지 계열이 실드에 작용하는 계수와 장갑에 작용하는 계수는 같지 않습니다. 빔·투사체·미사일의 전달 방식에도 별도의 보정이 있습니다. 그래서 무기의 기본 공격력만 높은 쪽이 언제나 유리하다고 말할 수 없습니다.

처음 살펴볼 때는 같은 상대를 두고 한 조건만 바꾸는 편이 좋습니다. 실드가 남은 상대와 실드가 소진된 상대에게 같은 무기가 어떻게 작용하는지 비교하거나, 무기 속성을 고정한 채 전달 방식만 바꾸어 봅니다. 방어층이 바뀌는 순간의 결과를 따로 보면 어느 조합이 어느 상황을 겨냥하는지 읽기 쉽습니다. 세부 계수는 밸런스 조정 대상이므로 이 글은 고정된 최강 조합을 약속하지 않습니다.

4. 사거리와 쿨다운도 설계의 일부

발사 처리에서는 무기가 있는지, 쿨다운이 끝났는지, 표적이 사거리 안에 있는지 등을 검사합니다. 즉 장착된 무기가 있다는 것과 지금 피해를 줄 수 있다는 것은 다릅니다. 전투 결과를 비교할 때에는 피해량뿐 아니라 발사가 실제로 가능한 시간과 상대의 위치도 보아야 합니다.

관찰 순서는 '사거리 진입 → 발사 가능 여부 → 어느 방어층에 피해가 들어갔는가 → 다음 발사까지의 간격'처럼 잡을 수 있습니다. 사거리 밖에 머물러 발사하지 못한 경우를 무기 피해량 부족으로 오해하면 엉뚱한 모듈을 바꾸게 됩니다. 로그와 화면을 함께 읽도록 하는 이유도 여기 있습니다.

5. 문서에 있는 테스트 숫자를 현재 보증으로 쓰지 않기

웹 README에는 초기 헤드리스 검증 기록이 남아 있습니다. 이것은 해당 시점의 개발 이력이며, 현재 전체 기능이 그 숫자만큼 검증됐다는 뜻은 아닙니다. 이번 글 편집에서는 관련 소스의 존재와 연결을 읽어 확인했지만 게임 전체 테스트나 실제 플레이를 새로 수행한 것으로 표현하지 않았습니다.

직접 비교 기록을 남긴다면 버전, 양쪽 함선 구성, 무기·방어 상태, 관찰 시점, 예상과 실제 결과를 적어 두는 것이 좋습니다. 승리 여부 하나보다 '왜 발사하지 않았는지', '방어층이 언제 바뀌었는지'가 다음 설계 변경에 더 도움이 될 때가 있습니다.

6. 파견대 설계에서 가져온 질문

별도 파견대 계획 문서는 함선을 본대 목록에서 지우는 대신 배치 상태를 표시하고, 지휘 비용을 본대와 파견대 합산으로 관리하는 방향을 제안합니다. 파견했다고 전체 지휘 비용이 사라지지 않게 하려는 설계입니다. 또 파견 중인 자원의 본대 중복 사용을 막고 귀환 때 결과를 정산하는 문제를 다룹니다.

이 항목은 계획 문서에서 읽은 설계 판단으로 소개합니다. 이 글만으로 해당 세부 기능이 배포판에 전부 구현됐다고 주장하지 않습니다. 핵심 질문은 '한 함선을 두 곳에서 동시에 쓰지 않으면서 상태를 어떻게 보존할 것인가'이며, 모듈 설계에서 시작한 자원 배분의 문제가 전략 계층까지 이어진다는 점이 흥미롭습니다.

7. 첫 비교를 위한 작은 기록표

처음부터 모든 조건을 바꾸기보다 같은 함선에 무기 한 종류만 바꾼 비교를 남겨 보세요. 상대 방어층과 관찰 시간을 같게 두고 사거리 진입 여부, 첫 피해, 방어층 소진을 순서대로 적습니다. 다음에는 함대 편성을 바꾸되 무기 구성은 고정합니다. 이렇게 비교의 단위를 줄이면 함선 설계의 선택과 전투 결과 사이의 연결을 더 선명하게 볼 수 있습니다.

자체 개발 자료: master_design.md, web/README.md, subfleet_dispatch_plan.md 및 웹 전투 코어의 step·fireControl·damageMath 소스를 2026-09-04 대조했습니다. 오래된 완료 표시는 현재 버전의 검증 결과로 재사용하지 않았습니다.

비추천 판정을 받은 두 플랫폼: 웹으로 갔고, 지금은 로블록스도 만듭니다

작성 · 수정

S3 World 초기 검토에서 로블록스는 비추천으로 끝났습니다. 그런데 같은 표에서 웹도 비추천이었습니다. 지금 이 게임은 웹에서 돌아가고, 로블록스 버전도 만들고 있습니다. 그 사이에 무엇이 달라졌는지 적었습니다.

기술 선택 검토 노트에서 한 대목만 옮깁니다. 결론보다, 그 결론이 나중에 어떻게 됐는지가 남을 만해서입니다.

1. 익숙한 환경에서 시작하면 안 되나

S3 World는 수많은 크루가 각자 능력치와 상태를 가지고 움직이는 함대 시뮬레이터입니다. 구상 단계에서 이런 질문을 던졌습니다.

"로블록스나 앱 같은 친숙한 환경에는 무리가 있을까?"

새 엔진을 배우는 비용을 피하고 싶었습니다. 이미 익숙한 도구가 있는데 굳이 돌아가야 하나 싶었습니다.

2. 그때 로블록스가 비추천으로 끝난 이유

검토 결과는 부적합이었습니다. 당시에는 구상 전체를 한 번에 구현하는 부담을 크게 보았습니다. 다만 이 판단은 실제 부하 시험보다 초기 설계상의 우려에 기댄 것이었고, 플랫폼의 보편적인 한계로 쓰기에는 근거가 부족했습니다.

  • 성능: 당시에는 크루 100명 수준에서도 지연이 생길 수 있다고 우려했습니다. 직접 재현한 성능 결과가 아니며, Luau가 처리할 수 있는 인원 상한도 아닙니다. 실제 부담은 개체별 계산량, 갱신 주기, 물리·렌더링·통신 작업을 어떻게 나누느냐와 함께 측정해야 합니다.[1][2]
  • 데이터: 경험치·계급·스킬을 오래 보관하려면 저장 단위, 요청 빈도와 재시도를 설계해야 합니다. Roblox DataStore에는 요청별 제한과 오류 처리 조건이 있으므로 현재 공식 문서에 맞춰 검토할 항목입니다.[3]
  • UI: 정보가 많은 함대·크루 화면을 당시 팀이 익숙하게 만들 수 있을지 걱정했습니다. 플랫폼에서 구현할 수 없다는 판정은 아니었습니다.
  • 이용 경험: 우리가 구상한 긴 호흡의 전략 게임을 어떤 이용자에게 어떻게 전달할지 정하지 못했습니다. Roblox 이용자 전체의 선호를 조사한 결과는 아닙니다.

당시 결론은 "본 게임의 첫 터전으로는 아니다"였습니다. 영원히 아니라는 뜻은 아니었는데, 문서에는 그렇게 읽히게 적혀 있었습니다.

3. 같은 표에 있던 또 하나의 비추천

그때 시뮬레이션 게임에서 쓰인 엔진 열 가지를 나란히 비교했습니다. 표의 마지막 줄은 이랬습니다.

당시 검토표의 요지: HTML5/JavaScript는 복잡한 시뮬레이션에 성능상 부담이 있을 것으로 예상함.

웹도 비추천이었습니다. 로블록스와 같은 칸이었던 셈입니다. 이 역시 특정 브라우저·기기·작업량을 고정해 비교한 벤치마크 결론은 아니었습니다. 그래서 Unity로 갔고, 처음부터 데이터 지향 아키텍처를 전제로 설계했습니다.

4. 먼저 웹으로 갔다

현재 S3 World의 전투 시뮬레이션은 브라우저에서 실행됩니다. Unity에서 만든 코어를 웹으로 옮겼습니다. 함선 14종의 제원과 무기 상성, 피해 계산, 전투 종료 판정까지 그대로 넘어왔습니다.

비추천 판정은 실측 결과가 아닌 예상이었으므로 현재 구현에 맞춰 다시 검토해야 합니다. 표가 걱정하던 것은 구상 전체의 부하였고, 실제로 먼저 구현한 범위는 그보다 작았습니다. 지금 웹에서 돌리는 것은 함대 전투 시뮬레이션이며, 초기 구상에 있던 수천 명 규모의 크루 개별 시뮬레이션을 웹이 그대로 감당한다는 뜻은 아닙니다.

5. 그리고 지금은 로블록스 버전도 만들고 있다

비추천 목록에 올렸던 나머지 한 곳도 지금 작업 중입니다. 처음 검토에서 접었던 플랫폼으로 다시 돌아간 셈입니다.

가능해진 이유는 로블록스가 갑자기 달라져서가 아닙니다. 그때 재던 기준이 "이 플랫폼에서 구상 전체를 감당할 수 있는가" 하나뿐이었기 때문입니다. 구상 전체를 한 번에 얹지 않는다면 질문이 달라집니다. 어느 부분을 그곳에 맞게 가져갈 것인가, 그리고 그 부분을 떼어낼 수 있게 만들어 두었는가.

6. 갈린 지점은 성능이 아니라 경계였다

Unity에서 만들 때 시뮬레이션 코어를 렌더링에서 분리해 두었습니다. 전투 로직은 화면에 무엇을 그리는지 모릅니다. 엔티티 저장소, 피해 계산, 이동, 사격 통제, 종료 판정이 전부 순수 계산으로만 이루어져 있습니다. 그래서 테스트도 화면 없이 돌릴 수 있었습니다.

이 구조 덕분에 웹으로 옮길 때 다시 만든 것은 렌더 레이어뿐이었습니다. 코어는 언어만 바꿔 건너왔고, 브라우저에서는 도트 그래픽을 그리는 얇은 층 하나만 새로 얹었습니다.

플랫폼이 하나 더 늘어날 때 드는 비용도 같은 구조에서 결정됩니다. 규칙이 화면 코드 안에 흩어져 있었다면 새 플랫폼마다 게임을 다시 만들어야 합니다. 규칙이 따로 서 있으면 각 플랫폼에서 만들 것은 그 위에 얹는 층뿐입니다.

7. 남은 기준

그래서 지금은 플랫폼을 고를 때 성능 비교표보다 이것을 먼저 봅니다. 핵심 로직을 플랫폼 바깥으로 꺼낼 수 있는가. 꺼낼 수 있다면 첫 선택이 틀려도 고쳐 쓸 수 있고, 나중에 다른 곳을 하나 더 얹을 수도 있습니다. 꺼낼 수 없다면 첫 선택이 마지막 선택이 됩니다.

하나 더 배운 것은 검토 문서를 쓰는 방식입니다. "부적합"이라고만 적어 두면 그것이 영구 결론처럼 남습니다. 무엇을 기준으로 재서 그렇게 판단했는지 함께 적어 두어야, 기준이 달라졌을 때 결론도 다시 열 수 있습니다.

다음 성능 검토에서는 기기, 클라이언트·서버 역할, 크루당 수행 작업과 갱신 주기를 고정하고 크루 수를 바꿔 비교할 계획입니다. MicroProfiler로 프레임 시간과 스크립트 작업 구간을 기록하고, 저장·통신의 지연은 따로 관찰해야 어느 부분을 줄일지 판단할 수 있습니다.[1][2] 이 글에는 그 시험의 새로운 측정 결과를 싣지 않았습니다.

이 글의 판단은 S3 World라는 특정 프로젝트의 요구사항을 기준으로 한 것입니다. 플랫폼의 성능과 기능은 계속 바뀌므로, 다른 프로젝트에서는 각자의 요구사항으로 다시 재어 보아야 합니다.

참고 문헌과 해석 범위

  1. Roblox Creator Hub — Identify performance issues

    클라이언트·서버의 성능 문제를 측정하는 공식 안내입니다. 이 문서는 S3 World의 특정 크루 수나 처리 성능을 검증한 자료가 아닙니다.

  2. Roblox Creator Hub — MicroProfiler walkthrough

    프레임 시간과 작업 구간을 살펴 병목을 찾는 절차입니다. 아래의 비교 계획을 세우는 근거로 읽었습니다.

  3. Roblox Creator Hub — Data store error codes and limits

    저장 요청의 제한과 오류 처리 조건을 확인하는 공식 문서입니다. 고정된 저장 한계를 인용하지 않고 구현 시점의 조건을 확인합니다.