GUIDE // DEVELOPERS
개발자 문서
코드를 직접 고치는 분을 위한 규칙과 레퍼런스예요. 코드를 잘 모르면 창작자 가이드의 ‘AI에게 시키기’를 쓰세요.
웹 SDK (window.altis, 선택)
웹 게임은 window.altis로 이벤트 기록과 클라우드 세이브를 쓸 수 있어요. 승인될 때 자동으로 붙으니 스크립트 태그를 넣지 않아요. SDK를 쓰지 않아도 플레이 횟수·시간은 집계돼요.
// SDK 는 없을 수도 있으니 항상 옵셔널 체이닝
window.altis?.track("level_clear", { level: 3, time_sec: 42.1 });
// 클라우드 세이브
await window.altis?.save("main", { level: 3, hp: 80 });
const save = await window.altis?.load<{ level: number; hp: number }>("main"); // 없으면 {}| 메서드 | 설명 | 제한 |
|---|---|---|
track(name, props?) | 게임 안 이벤트 기록 | 이름 64자, props 1KB, 세션당 500회 |
save(slot?, data) | 클라우드 세이브 | 슬롯당 64KB, 슬롯 이름 [A-Za-z0-9_-]{1,32} (기본 default) |
load(slot?) | 세이브 읽기. 없으면 {} | |
user() | { id, anon_id, logged_in } | |
flush() | 쌓인 이벤트 바로 보내기 |
- 내 PC에서 개발할 때는
window.altis가 없어요. 항상window.altis?.로 불러 SDK가 없어도 게임이 돌아가게 해요. - 플레이 세션 시작·끝 이벤트는 자동으로 집계돼요. 직접 보내지 않아요.
- 개인정보(이메일 등)를 이벤트나 세이브에 넣지 않아요. 저장은 매 프레임이 아니라 체크포인트에서, 5초 넘는 간격으로 해요.
AI에게 통합 맡기기
아래 프롬프트를 게임 코드와 함께 붙여 넣으면 같은 규칙으로 통합해 줘요.
너는 HTML5 게임에 Altis 플랫폼 SDK 를 통합하는 작업을 한다. 규칙:
1. SDK 는 window.altis 로 제공되며 존재하지 않을 수 있다. 모든 호출은 window.altis?. 옵셔널 체이닝으로 감싸고, 없을 때도 게임이 정상 동작해야 한다. 스크립트 태그를 추가하지 마라 (플랫폼이 자동 주입한다).
2. API
- window.altis.track(name: string, props?: object): boolean — 이름은 snake_case 64자 이내, props 는 JSON 직렬화 1KB 이내(초과 시 props 만 버려짐), 세션당 500회.
- window.altis.save(slot?: string, data: object): Promise<{data, updated_at} | {local: true}> — JSON 직렬화 가능, 슬롯당 64KB 이내, 슬롯명 [A-Za-z0-9_-]{1,32} (생략 시 "default").
- window.altis.load<T>(slot?: string): Promise<T | {}> — 없으면 빈 객체.
- window.altis.user(): { id: string|null, anon_id: string, logged_in: boolean }
- window.altis.flush(): void — 큐에 쌓인 이벤트 즉시 전송 (보통 필요 없음).
- 로그인 메서드는 없다. 로그인은 Altis 플레이 페이지가 담당한다.
3. 하지 말 것
- 플레이 세션 시작/종료 이벤트를 직접 보내지 마라 (자동 집계).
- 개인정보(이메일, IP, 기기 식별자)를 props 나 save 데이터에 넣지 마라.
- 매 프레임 track 이나 save 를 호출하지 마라. 세이브는 체크포인트·레벨 클리어·메뉴에서, 최소 5초 간격.
- 게임 안에 로그인 화면을 만들지 마라. 로그인은 Altis 가 플레이 전에 처리한다.
4. 해야 할 것
- 게임 시작 시 load("main") 으로 세이브를 불러오고, 빈 객체면 새 게임. 실패해도 새 게임으로 진행.
- 기존 localStorage 세이브 코드가 있으면 altis.save/load 로 바꾸되, window.altis 가 없을 때는 기존 localStorage 경로를 그대로 쓴다.
- 의미 있는 진행 이벤트만 track: game_start, level_start {level}, level_clear {level, time_sec, deaths}, game_over {level, score}, ending {id}.
5. 출력: 바뀐 파일 전체와, 어디에 무엇을 추가했는지 3줄 요약. 새 의존성은 추가하지 마라.웹 실행 환경
- 게임은 사이트 안의 iframe에서 돌아가요. sandbox 값은
allow-scripts allow-same-origin allow-pointer-lock allow-forms예요. - 팝업·새 창·파일 다운로드는 동작하지 않아요.
- 외부 서버를 부르는 코드는 심사 때 표시돼 확인 대상이 돼요. 외부 로그인이나 개인정보 요구는 창작자 약관상 금지예요.
- 플레이어는 로그인한 뒤 플레이해요. 게임 안에 로그인 화면을 만들지 않아요.
- 승인되면
index.html에 플레이 집계 스크립트가 자동으로 붙어요. - Unity WebGL은 멀티스레드(threads) 옵션을 켠 빌드가 동작하지 않아요.
Windows 배포본 구조
- 승인되면 맨 위에
{게임 이름}.exe(Altis 실행 도우미), 그 옆에game/(올린 파일 그대로, exe 이름 유지)과 파일 확인용 목록이 놓여요. - 실행 도우미는 세이브 내려받기 → 게임 실행 → 세이브 올리기, 플레이 기록, 파일 변조 검사를 해요. 처음 게임을 설치하거나 켤 때 Windows 가 “Altis 도우미”(방화벽 허용) 설치를 물어봐요. 거절해도 게임은 켜져요.
- 승인된 코드 파일(exe·dll·asar·pck 등)이 바뀌면 실행이 막혀요. 수정은 새 버전으로 올려요.
- Unity·Godot·Unreal은 클라이언트가 전체화면 옵션을 붙여 실행해요. 그 밖의 엔진은 게임 설정에서 전체화면을 기본으로 켜 둬요.
- 게임을 켜는 exe는 하나로 정할 수 있어야 해요. Unity·Godot·Unreal·RPG Maker·Electron은 엔진 규칙으로 찾고, 그 밖의 엔진은 exe가 하나여야 해요.
세이브 경로 규칙 (Windows 게임)
- 업로드 1단계에서 적은 폴더를 통째로 저장해요. 플레이어·게임당 100MB, 최근 3개 보관.
- 되는 곳:
%APPDATA%,%LOCALAPPDATA%,%USERPROFILE%아래의 게임 전용 폴더, 또는 게임 폴더 안(.\saves,.\save.json,.\*.sav). - 안 되는 곳: 넓은 폴더(문서, AppData 자체 등),
..,{Company}같은 자리표시자, 다른 드라이브, 다른 프로그램 폴더. - 300자 이하.
C:\Users\이름\...로 적으면 변수 표기로 바꿔 저장해요. - 심사 때 관리자가 게임을 실행해 실제로 저장되는지 확인해요. 맞지 않으면 보류되고, 경로만 고치면 순서 그대로 이어서 심사해요.
업로드 한도와 안전 검사
- zip 하나, 최대 500MB. 압축을 풀면 합계 2GB, 항목 50,000개까지.
- 올리다 끊겨도 24시간 안에 같은 파일을 다시 고르면 이어서 올라가요. 새로 올리기는 한 시간에 10번까지예요.
- zip 전체가 폴더 하나로 감싸져 있으면 그 폴더를 벗겨 내고 봐요.
- 막히는 것: 폴더 밖을 가리키는 경로, 심볼릭 링크, Windows에서 못 쓰는 이름(
CONAUXNULCOM1등,< > : " | ? *, 끝의 점·공백), 대소문자만 다른 같은 이름, 압축 폭탄. - Altis에서 받은 배포본(
altis-manifest.json이 든 zip)은 다시 올리지 않아요.
엔진 감지
| 엔진 | 알아보는 단서 | 종류 |
|---|---|---|
| Unity | UnityPlayer.dll + {이름}_Data/ | Windows (WebGL은 웹) |
| Unreal | Engine/ + */Binaries/Win64/*.exe | Windows |
| Godot | *.pck + exe 하나 | Windows |
| RPG Maker MV/MZ | js/rpg_core.js 또는 rmmz_core.js | exe 있으면 Windows, 없으면 웹 |
| Electron / NW.js | resources/app.asar, 또는 package.json + nw.exe | Windows |
| Construct | c3runtime.js / c2runtime.js | 웹 |
| GDevelop | gd.js | 웹 |
| HTML5 | index.html, exe 없음 | 웹 |
| 기타 | 위에 없음 | exe 하나면 Windows |
업로드 화면은 브라우저에서 zip 목록을 읽어 종류와 엔진을 정하고, 둘 다 가능할 때만 물어봐요.