Unity 6000.3.19f1로 만든 KBO 중심의 한 타석 플레이 가능한 버티컬 슬라이스입니다.
현재 우선순위는 선수 육성 메뉴보다 투구 -> 마우스 조준 -> 스윙 -> 타구 비행 -> 야수 처리 -> 결과가
부드럽고 손맛 있게 이어지는 경기 코어입니다. 모션/판정은 선수 외형과 분리되어 있습니다.
회사 PC에서 이어서 작업할 때는
CONTINUE_AT_WORK.md를 먼저 읽으세요. 현재 제작 경로는 LG 홈 타자 대 한화 원정 투수·수비입니다. 투수는 머리·몸·팔·글러브가 한 셀에 함께 그려진 150프레임 야구 치비 atlas를 사용합니다. 오버핸드는v2, 쓰리쿼터는 v2 f0~63에서 같은 high-knee 포즈의 v3 f64로 이어지는 보정 composite, 서브마린은 전용submarine세트이며, 한화 팔레트 변환 뒤 우완은 원본 UV, 좌완은 같은 완성 셀 전체를 수평 반전합니다. Student FBX/CMU 리그는 비교용 디버그 자산일 뿐 정상 게임에서 생성하거나 합성하지 않습니다.
로컬에 Windows 빌드가 이미 있으면 Play.bat 또는 Builds/Windows/DiamondDreams.exe를
실행할 수 있습니다. Git 저장소에는 빌드 산출물을 넣지 않으므로 새 clone에서는 Unity
6000.3.19f1로 프로젝트를 먼저 열거나 Windows 빌드를 생성해야 합니다. 기본 해상도는
1280x720 창 모드입니다. Unity 편집 프로젝트는 OpenInUnity.bat로 열 수 있습니다.
현재 합격 기준은 Unity 편집기와 Windows 빌드에서 경기 코어를 먼저 검증하는 것입니다. 마우스 타격 손맛, 타구 카메라, 수비 동선과 프레임 안정성을 Windows에서 고정한 뒤 Android 가로 화면과 터치 조작을 다음 단계에서 검증합니다. Android 빌드 스크립트와 가로 방향 설정은 미리 준비되어 있지만, 현재 버전을 Android 완성본으로 간주하지 않습니다.
MechanicsVerification: v2/v3/submarine 리소스 30장, 쓰리쿼터 f63→f64 전환·손상 셀 건너뛰기, f96 셀, 릴리스 손 UV 순서·좌우 미러, 0.40초 셋 뒤 첫 동작→릴리스 약 2.35초, 전신 셀 비혼합, Student 리그 미생성을 검사- Windows x64 Player: 새 제작 경로로 다시 빌드·스모크해야 합격
- production 투수 GPU RT: 3스타일 × 2손 × 14프레임, 총 84장을 Player에서 검증
- KBO GPU RT: LG 타자 5장 + 한화 수비 12장 + 한화 투수 30장, 총 47장을 Player에서 검증
- 실제 경기 화면: f54 레그킥, f96 손-공 릴리스, f106 팔로스루를 스타일별로 오프스크린 Player에서 캡처하고 단색/검정 캡처는 실패 처리
- 기존
v20mechanics/84장 투구폼/17장 유니폼 로그는 폐기한 3D Student 경로의 기록이며 현재 제작 경로의 PASS 증빙으로 사용하지 않음 - Android APK/실기기 테스트: 아직 하지 않음
- 조준: 마우스를 움직여 스트라이크존의 조준점을 공에 따라 붙입니다.
- 스윙: 화면 어디서든 마우스 왼쪽 버튼을 눌러 현재 조준 위치와 타이밍으로 스윙합니다.
- 번트: 마우스 오른쪽 버튼을 누릅니다.
- 다음 타석: 결과 화면에서 왼쪽 버튼을 누릅니다.
- 첫 투구는 중앙 부근으로 들어와 조준과 타이밍을 익히기 쉽습니다.
키보드 보조 조작은 WASD/방향키, Space/Enter, B, H입니다.
- 투구: 포심, 슬라이더, 체인지업, 커브의 구속과 좌우/상하 변화
- 타격: 클릭 후 배트가 플레이트를 통과하는 시간, 커서와 공의 거리, 타자 능력치를 함께 계산
- 타구: 컨택 품질에 따른 타구속도, 발사각, 당겨치기/밀어치기 방향과 실제 중력 비행
- 수비: 9개 수비 포지션의 반응, 첫발, 가속 추적, 포구, 확보, 트랜스퍼, 크로우홉, 송구, 베이스 포구
- 결과: 헛스윙, 볼, 스트라이크, 파울, 아웃, 안타, 2루타, 볼넷, 삼진, 홈런
- 카메라: 타격 후 공을 따라가는 동적 카메라
- 성능 표시: 워밍업 120프레임 뒤 FPS와 최악 프레임 시간을 HUD에 표시
타구가 발생하면 9명이 공으로 한꺼번에 몰리지 않도록 한 명만 Primary 포구자로 지정합니다.
Primary만 살아 있는 공을 직접 추적하고, 송구를 받을 Receiver와 다른 야수는 타구 순간
배정된 역할 목적지만 사용합니다.
| 역할 | 개인 최고 속도 대비 |
|---|---|
| Primary 포구자 | 100% |
| Throw Receiver | 72% |
| Cutoff 중계 | 68% |
| 베이스 Cover | 58% |
| Backup | 60% |
| Shade | 55% |
- 예상 타구 거리
< 32m의 짧은 내야 타구에서는 Primary와 송구 Receiver만 움직이고, 나머지 off-ball 야수는 자신의 시작 위치를 유지 - Cutoff는 예상 타구 거리
>= 36m인 깊은 타구에만 배정 - 모든 야수의 이동 후보를 먼저 계획하고, lane 충돌을 우선순위대로 해소한 뒤 한 번에 적용
- 이동 개인 공간
1.65m, 역할 경로 충돌 corridor3.25m - 회귀 행렬에서 실제 야수 간 최소 간격
1.60m이상을 요구 - 비주포구자는 공을 직접 추적하지 않으며, 제한 조건을 만족한 실책성 타구에서만 Primary를 최대 한 번 인계
- 1루수 시작 위치는
(14.2, 0.02, 24.8)이며, 수비 화면은 실제 베이스 좌표를 그림 속 베이스에 맞추는 planar homography를 사용 - Receiver는 베이스
0.08m안에서 수신 준비를 고정하고, 포스 아웃은 공을 잡을 때 베이스 중심0.55m안에 발 기준점이 있어야만 인정
짧은 내야 타구에서 의미 없는 전원 이동을 없애고, 깊은 타구에서만 중계선과 백업이 활성화됩니다. 계획과 적용을 분리했기 때문에 배열 순서에 따라 먼저 움직인 야수가 공간을 선점하지 않습니다.
화면 모션은 투수 f0~149·타자 f0~36의 60fps authored 타임라인, 경기 판정은 120Hz
고정 시뮬레이션입니다. 투수는 0.40초 셋을 정상 속도로 유지하고, 첫 동작 f24부터 f96까지
약 2.35초로 재생합니다. 따라서 타석 시작부터 릴리스까지는 약 2.75초이며, 판정과 공 비행은
authored f96을 넘는 순간 정확히 한 번 시작합니다. 150프레임
전신 셀은 이미 60fps로 완성되어 있으므로 인접 두 몸을 alpha 교차 합성하지 않고 매 화면에
가장 가까운 정수 프레임 하나만 그립니다. 자세한 계약과 아트 교체 방법은 MECHANICS.md에
기록했습니다.
- 타자 로스터와 타격 화면은 LG 홈 흰색·레드 계열, 투수와 9인 수비는 한화 원정 네이비·회색·오렌지 계열로 통일했습니다.
- 숨김 Player 검증 대상은 LG 60fps 타자 5장, 한화 수비·리시브·송구 12장, 한화 투수 오버핸드·쓰리쿼터·서브마린 각 10장으로 총 47개 GPU RenderTexture입니다.
KboUniformCaptureVerification은 각 항목이 실제RenderTexture이며IsCreated인지 확인한 뒤 PNG와 JSON manifest를 저장합니다.- 좌완은 글러브·공·유니폼을 포함한 완성된 우완 atlas 셀의 U 방향만 반전합니다. 셀 순서와 f96 릴리스 프레임, 손의 Y 좌표는 바뀌지 않습니다.
일반 타격 화면은 premium_jamsil_background_widebox를 사용해 좌우 타자 박스 전체를
보여 줍니다. 타격 중 렌더링하는 선수는 투수와 타자뿐이며 컨택 뒤에만 9인 수비 광각 화면으로
전환합니다. 1920x1080 캔버스의 좌타자 기준은 centerX=1314, 발 기준 bottom=976, 표시
높이 680이고 우타자는 centerX=606으로 미러링합니다. 두 발의 불투명 픽셀이 타석 chalk
안에 들어가도록 등록했습니다.
수비 송구를 받을 때는 4프레임 premium_receive_sheet_v2를 사용합니다. 수신자는 공 도착
14모션 프레임 전에 글러브 뻗기를 시작하고, 공은 월드 포구점과 화면 글러브 pocket에 맞아
들어간 뒤 확보될 때까지 글러브 안에 표시됩니다.
- Android는
Landscape Left/Right자동회전만 허용하며 세로 모드는 비활성화합니다. - 16:9부터 20:9까지
Screen.safeArea안에서 HUD, 조준, 버튼, 선수 위치를 계산합니다. - Android 검증 단계에서는 필드 드래그로 조준하고 손을 떼는 스윙 방식을 사용합니다. 별도 스윙 버튼은 두지 않습니다.
Diamond Dreams/Build/Android Landscape APK메뉴 또는AndroidBuild.BuildLandscapeApk로Builds/Android/DiamondDreams-KBO-Landscape.apk를 만듭니다.- 실제 단말별 화면비, 터치 감도, 발열과 프레임 검증은 Windows 경기 코어가 확정된 뒤 진행합니다.
서울시 공식 자료의 잠실야구장 규격을 게임 좌표 1유닛=1m로 반영했습니다.
- 좌우 펜스: 100m
- 중앙 펜스: 125m
- 펜스 높이: 2.7m
- 루간 거리: 27.432m
- 투수판-홈플레이트: 18.44m
- 중앙 전광판, 개방형 외야, 대칭형 관중석을 절차적으로 표현
참고: 서울시 잠실야구장 아카이브
타격 화면은 잠실풍 2.5D 배경을 사용합니다. 투수·타자·야수는 모두 2D 전신 프레임 atlas로
합성하며, 투수 제작본은 premium_pitcher_overhand_v2_60fps_00..09,
premium_pitcher_overhand_v3_60fps_00..09, premium_pitcher_submarine_60fps_00..09입니다.
각 파일은 1024x1024의 4x4 셀이고 세트마다 authored 프레임은 150장입니다. 한화 변환 RT가
준비되지 않으면 원본 atlas로만 fallback하며 Student FBX를 대신 생성하지 않습니다.
쓰리쿼터는 손상된 v3 reset 구간 대신 시각적으로 맞는 v2 f063을 사용하고, 두 원본이 같은
high-knee 자세인 v2 f63→v3 f64에서 전환합니다. v3 f9091도 온전한 후속 셀로 건너뛰되
authored 릴리스 f96은 바꾸지 않습니다.
RiggedPitcherPresentation과 CMU/Styloo 자산은 과거 비교 캡처를 재현하기 위한 deprecated
debug 경로로만 남아 있습니다.
HUD에는 가상 선수 초상과 OFL 라이선스의 Noto Sans KR을 사용합니다. 실제 KBO 구단 로고나
실존 선수 초상은 포함하지 않았습니다.
이번 버전은 경기 코어 검증용입니다. 시즌 일정, 계약/연봉, 훈련, 능력치 성장, 드래프트, 실제 KBO 라이선스 데이터는 다음 단계 범위입니다.