문서
게임을 다운로드하고 레벨 목록을 열어 아무 레벨이나 플레이합니다. 직접 만들려면 에디터에서 레벨을 생성하고 그 폴더에 1-2분 길이의 트랙을 넣습니다
게임 버그는 releases 이슈에, 질문은 Discord에 올립니다. 설정에 있는 버전 문자열과 버그가 나타나기까지의 단계를 첨부하십시오
플레이하기 전에 게임이 레벨이 내 기기에서 얼마나 무거운지 다섯 칸짜리 게이지로 보여줍니다: 켜진 칸이 많을수록 레벨이 가볍습니다. 초록색 칸은 원활하게 실행, 노란색은 빠듯함, 빨간색은 프레임 레이트가 떨어진다는 뜻입니다
에디터는 게임에 내장되어 있어 따로 설치할 것이 없습니다. 에디터에서 레벨은 트랙과 파일이 담긴 폴더이며, 빈 상태에서 게시할 준비가 될 때까지 직접 완성해 나갑니다
레벨은 파일이 든 폴더이고, 첫 레벨은 여섯 단계면 만들 수 있으며, 에디터 전체는 여섯 가지 개념 위에 서 있습니다: 오브젝트, 프레임, 구간, 레이어, 부모, 키프레임
레벨은 디스크에 있는 평범한 폴더입니다: 레벨 파일, 메타데이터, 레벨이 쓰는 모든 것. Json 형식으로 만들고 폴더를 복사해서 전달하면 되며, 설치할 것은 없습니다
첫 플레이 테스트까지 여섯 단계: 레벨 만들기, 트랙 추가, 리듬 맞추기, 오브젝트 배치, 플레이 테스트 실행, 저장
오브젝트, 프레임, 구간, 레이어, 부모, 키프레임 - 에디터 전체가 기대는 여섯 가지 개념
레벨은 화면 프레임이 아니라 자체 프레임으로 시간을 세므로, 어떤 하드웨어에서도 똑같이 재생됩니다. 레벨 길이는 직접 정하고, fps 값은 기본값인 60 그대로 두는 것이 좋습니다
키프레임은 한 트랙의 한 프레임에서의 값과, 그 값에 도달하는 이징입니다. 레벨에서 움직이거나 색이 바뀌거나 켜지고 꺼지는 모든 것은 키프레임 목록입니다
최소한의 레벨은 트랙 하나입니다. 이미지와 폰트는 직접 가져오고, 이 모든 것은 레벨 폴더에 있습니다
최소한 트랙 하나만 있으면 됩니다. 나머지는 모두 선택 사항이고, 거의 전부 직접 가져옵니다
트랙은 ogg 형식으로 변환하는 것이 좋습니다: wav보다 8-10배 가볍고, mp3 형식과 달리 파일 앞에 무음을 넣지 않습니다. ogg 외에는 mp3, wav만 불러올 수 있습니다
도형으로 충분하다면 도형을 쓰십시오: 파일도, 메모리 비용도, 권리 문제도 없습니다. 이미지는 화면에서 차지하는 크기에 맞게 만들고, 모바일 레벨에서는 최대 2048, 그 밖에는 최대 4096까지로 하십시오
레벨은 게임 폴더 안 levels에 있는 자기 폴더에 들어 있습니다. 레벨이 쓰는 파일의 이름은 바꾸지 말고, 완전한 백업은 레벨 폴더를 복사해 두면 됩니다
공개하는 레벨에는 CC BY-NC보다 엄격하지 않은 오픈 라이선스를 가진 파일이나 저작자의 허락을 받은 파일만 넣을 수 있습니다. 자기만 쓰는 레벨은 무엇으로든 만들 수 있습니다
곡의 오픈 라이선스가 CC BY-NC보다 엄격하지 않거나 곡의 저작자가 레벨에서의 사용을 직접 허락했다면 그 곡을 쓸 수 있습니다. YouTube, SoundCloud, Spotify의 곡에는 저작자의 허락이 필요합니다
리소스는 적합한 라이선스가 있거나 권리자의 허락이 있으면 조건을 충족합니다. 세 번째 방법은 없습니다
기본적으로 안전한 곳: 음악은 ccMixter, Freesound, Kenney, 이미지는 Poly Haven, Pexels, Unsplash, 폰트는 Google Fonts. YouTube, SoundCloud, Spotify에서는 아무것도 가져올 수 없습니다
기록은 리소스가 어디서 왔고 어떤 조건인지 적어 둡니다: 링크, 라이선스, 허락, 저작자. 라이선스 필드가 비어 있으면 "아무도 확인하지 않음"이라는 뜻이며, 그런 리소스는 거부됩니다
서비스마다 자기 규칙으로 레벨을 검사하므로, 한 서비스는 받아들이고 다른 서비스는 거부할 수 있습니다. 게시를 막는 것은 오류뿐이며, 경고는 레벨을 검토로 보냅니다
템플릿으로 저작자에게 연락하되 1-3번 항목은 그대로 두고, 답장은 보관합니다. 개인적인 사용만이 아니라 레벨 배포를 직접 허용하는 허락만 인정됩니다
좋은 레벨이란 플레이어가 무엇에 죽었는지 이해하고, 음악에 맞춰 움직이고, 다시 도전하고 싶어지는 레벨입니다
플레이어는 무엇에 죽었는지 이해해야 합니다. 위험은 위험해지기 전에 보여 주고, 반응할 시간을 최소 12프레임 주고, 위험이 장식보다 눈에 띄게 만듭니다
비트 그리드를 먼저 잡습니다: 템포, 다음은 오프셋, 그다음은 마디당 비트 수. 레벨의 절정은 곡의 절정에 두고, 브레이크에서는 플레이어에게 숨 돌릴 틈을 줍니다
플레이어 자신의 수치와 사람의 반응 시간 12-15프레임을 기준으로 설계합니다 - 수치는 모두 6_avatar 및 7_damage 페이지에 있습니다. 새 패턴은 먼저 안전한 형태로 보여 줍니다
의미 있는 내용은 가장자리에 두지 않습니다: 다른 화면에서는 가장자리가 다른 곳에 있고, 휴대폰의 노치가 탄환을 가릴 수 있습니다. 카메라 흔들림은 한 마디 정도면 좋지만, 빠른 회전과 급격한 줌은 멀미를 일으킵니다
내용의 색상은 테마 참조로 연결하고, 직접 지정 색상은 정말 고유한 것에만 씁니다. 포스트 프로세싱은 절정에서 켰다가 다시 끄십시오. 그렇지 않으면 탄환의 윤곽이 사라집니다
테마는 오브젝트가 슬롯 번호로 참조하는 64색 팔레트입니다. 테마를 바꾸면 그 테마를 참조하는 모든 것이 함께 바뀝니다
그림은 먼저 내장 도형으로 조립하고, 맞는 도형이 없는 곳에만 직접 도형을 그립니다. 빛과 그림자는 하나의 기본 도형 위에 겹치고, 반복되는 요소는 모두 프리팹으로 만들고, 결과는 레벨 위에 겹친 원본 그림과 대조합니다
디자인이 아니라 습관입니다: 레벨을 어떤 순서로 만들지, 같은 작업을 두 번 하지 않고 잃지도 않는 법, 봇으로 확인하고 넘겨주고 AI 어시스턴트와 함께 만드는 법. 작업 순서부터 시작하십시오
먼저 트랙, fps, 비트 맵, 마커를 정하고, 그다음 단순한 도형으로 뼈대를 만들어 플레이 테스트합니다. 장식, 테마, 이펙트는 마지막입니다
나중에 한꺼번에 바꿔야 할 오브젝트는 개수와 상관없이 프리팹으로 만듭니다. 규칙으로 설명할 수 있는 콘텐츠는 생성기로 만듭니다. 그 밖의 경우에는 그냥 복사하십시오
명령 팔레트(Ctrl+Shift+P), 콘텐츠 검색(Ctrl+F), 위치 표시 버튼, 타임라인의 화살표 키가 시간을 가장 많이 아껴 줍니다. 모든 키는 설정에서 다시 할당할 수 있습니다
작업은 자동 저장, 실행 취소, 레벨 폴더 사본이 지켜 줍니다. 레벨의 완전한 스냅숏은 폴더 사본뿐입니다. 파일 형식 변경과 레벨 삭제는 되돌릴 수 없습니다
봇은 플레이어와 같은 조작으로 레벨을 플레이하며, 난이도가 아니라 가독성을 확인합니다. 레벨을 클리어한다는 보장은 하지 않습니다
레벨 폴더를 zip 또는 tar.gz 형식으로 묶고, 비밀번호가 필요하면 gpg 도구로 암호화합니다. 다른 컴퓨터에서는 압축을 푼 레벨을 바로 플레이할 수 있고, 게임은 이런 아카이브를 직접 읽습니다
MCP 지원 AI 클라이언트는 사용자가 지켜보는 동안 에디터에 열린 레벨을 편집할 수 있습니다. AI 작업 묶음 하나는 실행 취소 한 단계이며, AI 쪽에서는 게시, 파일 삭제, 다른 레벨 덮어쓰기를 할 수 없습니다
레벨이 플레이어의 기기에서 돌아갈지는 한 프레임의 도형 수와 오버드로가 결정합니다. 레벨 예산부터 시작하고, 휴대폰용 레벨을 만든다면 모바일 기기 페이지도 읽으십시오
휴대폰은 한 프레임에 도형 약 1000개를 무리 없이 처리하고, 약한 PC는 5000-10000개를 처리합니다. 개수보다 오버드로의 비용이 더 큽니다: 화면 전체를 덮는 반투명한 것이 겹겹이 쌓이는 경우입니다
휴대폰에서는 손가락이 화면을 가리고, 가장자리는 시스템이 차지합니다. 중요한 것은 가장자리에서 떨어뜨려 두고, 레벨은 약한 휴대폰에서 테스트하십시오: 화면 전체의 반투명이 가장 먼저 성능을 잡아먹습니다
에디터의 특정 필드나 버튼이 하는 일을 패널, 창, 탭마다 한 페이지씩 설명합니다. 레퍼런스는 처음부터 끝까지 읽는 문서가 아닙니다: 검색이나 글 속 링크를 통해 이곳에 오게 됩니다
프로젝트의 기본 용어 목록입니다. 게임 인터페이스, 이 문서, 그 밖에 Bullet Hero 관련 글이 모두 이 단어를 쓰며, 새 용어는 먼저 여기에 추가합니다
메타데이터는 레벨의 표지입니다: 이름, 설명, 그림, 제작자, 연령 등급, 난이도, 내용 경고. 지금은 레벨을 폴더 그대로 또는 Steam 창작마당을 통해 다른 사람에게 전달합니다
타임라인은 레벨을 시간에 따라 보여 줍니다: 오브젝트, 선택한 오브젝트의 키프레임, 프리팹의 템플릿, 오디오, 이벤트. 비트 그리드를 쓰면 이 모든 것을 음악에 맞춰 배치할 수 있습니다
계층 구조는 현재 프레임의 오브젝트를 부모 기준으로 보여 주는 트리입니다. 타임라인마다 자체 클립보드 버퍼가 있고, 명령 팔레트는 에디터의 모든 동작을 이름으로 찾습니다
오브젝트 인스펙터는 선택한 오브젝트의 필드를 편집하고, 키프레임 인스펙터는 선택한 키프레임을 선택 범위에 걸친 모든 트랙에서 한꺼번에 편집합니다
이펙트는 VFX Graph 파티클이며, 그 파라미터는 모듈로 나뉩니다: 파티클의 개수, 나오는 위치, 움직이는 방식, 색상과 크기입니다. 파라미터는 인스펙터나 이펙트 에디터에서 편집합니다
오디오 트랙의 소리는 오디오 효과 체인을 거칩니다: 노멀라이즈와 컴프레서부터 에코와 리버브까지 11가지가 있습니다. 체인, 속도, 음량은 오디오 트랙 인스펙터에서 설정합니다
생성기는 콘텐츠를 만들어 하나의 작업으로 레벨에 적용하며, 이 작업은 한 단계로 실행 취소할 수 있습니다. 모든 생성기는 툴바의 "생성기" 창에서 실행합니다
모디파이어는 레벨에 이미 있는 것을 바꿉니다: 콘텐츠를 제거하고, fps 값을 다시 계산하고, 프리팹을 평탄화하고, 키프레임을 퀀타이즈하고, 구간을 맞추고 옮깁니다. 한 번의 실행은 한 단계로 실행 취소됩니다
레벨 자체에 속하는 모든 것을 여기서 설정합니다: 길이, fps, 시드, 방향, 메타데이터, 게시. 레벨을 실행하고, 규칙으로 검사하고, 사본에서 복원하는 곳도 여기입니다
레벨의 텍스처, 도형, 테마, 이펙트, 프리팹은 레벨 폴더에 들어 있고 레벨과 함께 이동합니다. 각 리소스에는 출처, 라이선스, 제작자가 담긴 자체 카드가 있습니다
프리팹 모드에서는 템플릿을 편집하며, 저장하면 그 편집이 템플릿의 모든 배치에 반영됩니다. 배치의 인스펙터에서 "프리팹 편집" 버튼으로 들어가고, Ctrl+Shift+E 키로 레벨로 돌아갑니다
내보내기는 레벨을 레벨이 쓰는 모든 파일과 함께 게임 밖에 폴더나 아카이브로 저장합니다. 비밀번호는 디스크에 있는 레벨 콘텐츠를 암호화하며, 잊어버린 비밀번호는 복구할 수 없습니다
자동 저장, 그리드, 선택, 기즈모, 새 레벨 프리셋을 여기서 설정합니다. 자동 저장은 기본으로 켜져 있으며 편집 후 60초가 지나면 실행됩니다
계층 구조, 인스펙터, 타임라인은 뷰포트 주위에 도킹되어 있습니다. 패널 가장자리의 핸들을 클릭하면 패널이 열리거나 닫히고, 드래그하면 너비가 바뀝니다
컬렉션에는 여러 레벨에서 재사용하는 리소스가 들어 있습니다. 레벨은 컬렉션을 참조하지 않습니다: 가져오기를 하면 리소스가 레벨 안으로 복사되므로 레벨은 어디서나 플레이됩니다
레벨은 레벨 설정의 "게시" 탭에서만 보냅니다: 아카이브로 보내거나 Steam 창작마당에 올립니다. 보고서가 레벨을 스스로 검사하며, 보고서에 오류가 있으면 보낼 수 없습니다
에디터는 컴퓨터에 설치된 ffmpeg 프로그램을 통해 열려 있는 레벨을 동영상 파일로 렌더링합니다. 렌더링은 오프라인으로 한 프레임씩 진행되므로, 컴퓨터가 아무리 느려도 동영상은 정확합니다
SDK - Bullet Hero 레벨 형식을 오픈 C# 라이브러리로 만든 것입니다. 게임은 이 라이브러리로 레벨을 읽고 쓰며, 직접 만든 프로그램도 같은 일을 할 수 있습니다
SDK 배포 형태는 nuget.org의 BulletHero.SDK 패키지, 또는 소스에서 빌드한 결과물입니다. Unity에서는 git 서브모듈로 연결하며, ConsoleSmoke 샘플로 레벨이 읽히는지 확인합니다
레벨은 폴더입니다: 내용은 level.json 또는 level.blob, 메타데이터는 metadata.json 또는 metadata.blob, 그리고 커버와 미디어 파일. 백업, 기록, 플레이어 설정은 기기에 남습니다
레벨은 폴더, tar.gz, zip 중 하나로 내보내며, 원하면 비밀번호를 걸 수 있습니다: AES-256 zip 또는 OpenPGP. SDK에서는 받은 파일의 형식을 이름이 아니라 첫 바이트로 판별합니다
버전은 세 가지입니다: 게임의 gv, SDK의 sv, 모델 형식 세대의 mg. SDK에서는 mg 값을 기준으로 오래된 파일을 마이그레이션하고, 빌드보다 새로운 세대의 파일은 읽기를 거부합니다
검증은 ValidationFacade 클래스로 직접 호출하며, 저장과 불러오기에 내장되어 있지 않습니다. 문제는 Error, Warning, Advice 세 그룹으로 나뉘고, ValidateAndFix 메서드는 고칠 수 있는 것을 고칩니다
서비스는 어떤 레벨을 받는지 PublishProfile 파일로 기술합니다: 라이선스, 리소스 출처, 필수 필드, 크기 한도. 서비스를 추가하려면 분석기를 고치는 대신 파일을 하나 작성하면 됩니다
Bullet Hero - 리듬 게임과 탄막 슈팅을 결합한 무료 하이브리드 게임입니다. 계정이 필요 없고, 서버는 아직 없습니다. 레벨은 플레이어가 내장 에디터에서 만들고 폴더나 압축 파일로 서로 주고받습니다
노트
저는 AI 도구를 사용하며, 쓸 가치가 있다고 생각합니다. 다만 제대로 써야 합니다: 저 대신 생각해 주는 존재가 아니라, 제가 결과를 확인하는 도구로 말입니다. 생각 없이 쓰면 맞아 보이지만 실제로는 틀린 텍스트와 코드를 잔뜩 만들어 냅니다
Bullet Hero 게임은 무료이고, Windows, Android에서 실행되며, SDK, 문서, 빌드가 공개되어 있습니다. 코어는 휴대폰에서도 화면에 수천 개의 오브젝트를 처리하며, 8000개가 넘는 테스트로 검증됩니다
질문, 피드백, 직접 만든 레벨은 Discord에 올리면 됩니다. 누구나 게임을 도울 수 있습니다: 문서의 오류를 고치거나, 번역을 추가하거나, 버그를 제보하거나, 레벨을 만들 수 있습니다
대화와 질문은 Discord에서, 영상은 YouTube에서, 게임 버그는 bullet-hero/releases 저장소의 issues에서 다룹니다. 소스 코드는 GitHub의 bullet-hero 조직에 있습니다