PROMT Part 2
요약
본 문서는 몰입감 높은 세스네 공기역학적 사운드 디자인과 이를 구현하기 위한 WebAudio API 설계 가이드를 제공합니다. 엔진, 프로펠러, 바람, 물 등 다양한 요소를 포함하며, 특히 내부/외부 믹스와 물리 기반의 소리(도플러 효과, 진동음)를 강조합니다. 또한, 호스트 의존성이 낮고 전역 변수를 사용하지 않는 모듈식 JavaScript API 구조를 제시합니다.
핵심 포인트
- 엔진 사운드는 폭발 '퍽' 소리, 공회전 밸브 트레인 등 디테일한 요소를 포함해야 합니다.
- 물과 구조물 사운드(찰싹거림, 금속 마찰음)는 몰입감을 높이는 핵심 요소입니다.
- WebAudio API는 호스트 비의존적이며 의존성 주입 방식을 채택하여 설계되어야 합니다.
- API는 `update(dt)` 함수를 통해 성능 저하 없이 모든 프레임에 대응해야 합니다.
7. Sound (procedural WebAudio, high quality — very important for immersion)
createSeaplaneAudio(audioCtx, outputNode) — 호스트가 자체 AudioContext와 마스터 버스를 전달합니다. 모든 것을 한 번에 생성하세요 (프레임당 노드 생성 금지). PannerNode/HRTF를 사용하거나 월드 위치를 노출하여 호스트가 공간화할 수 있도록 하세요; 그리고 내부/외부 믹스 (객실 내부: 저역 통과 필터링된 엔진, 구조물 진동음(rumble), 떨림; 외부: 완전한 배기 소리(exhaust bark), 프로펠러의 윙윙거리는 소리(prop buzz), 비행 중 도플러 효과).
합성해야 할 사운드:
- 엔진: 실린더 폭발 기본 주파수 = rpm/60 × (실린더 수/2), 풍부한 고조파, 배기 '퍽' 소리/팝(bark/pops) (임펄스 트레인 + 노이즈 버스트, 각 폭발마다 약간의 무작위성), 공회전 시 기계식 밸브 트레인 딸깍거림, 심한 실화(misfires); 시동기 윙 소리 + 기침하는 듯한 걸림; 마지막 기침과 함께 작동을 멈추는 과정.
- 프로펠러: 블레이드 통과 윙 소리 (rpm/60 × 3), RPM 및 공기 속도에 따라 커지는 '후우' 소리(whoosh).
- 바람: 공기 속도에 따른 돌진하는 듯한 소음, 문을 열면 더 크고, 고속에서 휘파람 소리가 나며, 난기류에서는 돌풍이 느껴지도록.
- 실속 경고 호른 (그 전형적인 리드 호른).
- 물: 정지 상태의 플로트에 부딪히는 선체 찰싹거리는 소리(slaps), 견인 중 분무하는 소리의 쉬익거림(hiss of spray), 파도 충격 시 큰 '쾅' 소리, 착수 시 물보라, 배수되는 물.
- 구조물: G-부하 하에서 휘는 기체(airframe creaks), 느슨한 화물의 떨림, 문 열고/닫기/걸쇠, 스위치 클릭음, 레버 걸림쇠 소리(detents), 플랩 모터의 웅웅거리는 소리(hum), 계류 시 로프 삐걱거리는 소리, 바위에 부딪히는 금속 마찰음, 해변에 닿을 때 모래 위를 갈리는 소리.
- 손상: 휘어진 프로펠러 떨림, 엔진 노킹, 불꽃 파지직거리는 소리(fire crackle), 충돌 충격음.
- 믹스 안정성: 아무것도 클립되지 않아야 함; 마스터 게인 ≤ –6 dBFS 피크; 우아한 시작/정지 (클릭 없음).
8. Public API (seaplane/Seaplane.js에 넣고, INTEGRATION.md에 문서화하세요)
대략 다음과 같은 모양으로 만드세요 (이름은 수정할 수 있지만 정신은 유지: 호스트 비의존적, 의존성 주입, 전역 변수 없음):
대략 다음과 같은 모양으로 만드세요 (이름은 수정할 수 있지만 정신은 유지: 호스트 비의존적, 의존성 주입, 전역 변수 없음):
export function createSeaplane({
scene, renderer, camera, // camera = host의 메인(플레이어) 카메라
quality = 'high', // 'high' | 'low'
...
규칙: update(dt)는 dt = 0.1 (배경 탭)에서도 폭발하지 않게 작동해야 합니다. 모든 프레임별 코드는 할당 없이(벡터 재사용) 처리되어야 합니다. console.log 남용 금지. seed로부터 결정론적 절차 생성이어야 합니다.
9. Sandbox 페이지 (index.html + sandbox/*.js)
게임의 모습과 규모를 대략적으로 맞춰 튜닝이 가능한 테스트 월드:
-
Gerstner 파도(shader)와
waterHeight에 대한 정확한 CPU 쌍둥이가 있는 바다; 더 잔잔한 라군 구역과 거친 외해; 태양이 있는 하늘; ACES 톤 매핑, sRGB, PCF 소프트 그림자(단방향 태양), 은은한 안개. 시간대 슬라이더(낮/일몰/밤)와 비 토글, 바람 방향/강도 슬라이더. -
모래 해변, 몇몇 바위, 그리고 간단한 야자수 모양의 나무들(콜라이더 역할)이 있는 약 400 × 400 m 크기의 섬; y ≈ 0.85 m 높이에 갑판을 가진 나무 부두와 두 개의 계류 기둥, 그리고 선택적 비행기-기지 키트(격납고, 바람개비, 드럼, 충격 완화 장치). 약 1 km 떨어진 곳에 두 번째 작은 섬이 있어 이동할 수 있습니다.
-
게임에서처럼 해당 항공기의
walkShapes/interactablesAPI를 사용하는 1인칭 워커(포인터 잠금, WASD, 점프, E 프롬프트); 검사용 자유 궤도 카메라(O); 추격 카메라(V). -
스폰: 참조 이미지와 같이 격납고 근처 충격 완화 장치에 부착된 항공기 (대신 부두에 계류시키거나, 300 m 상공에서 공중에 스폰하는 버튼 포함).
-
디버그 패널(기본적으로 숨겨져 있으며, F1로 토글): 강제 값/벡터, CG, 접촉 지점, 부력 샘플, LOD 레벨, 드로우 콜/삼각형(
https://t.co/7xhanXuRNx), 물리 ms, 보조 모드, 품질 전환, 손상 버튼, 수리/재설정.
10. 파일 레이아웃
/index.html sandbox 진입점 (importmap 위)
...
seaplane/*는 sandbox/*에서 아무것도 가져오면 안 됩니다.
11. 작업 계획 및 검증
-
이 전체 브리프와 참고 이미지를 먼저 읽고, (스스로에게) 부품 목록과 치수표를 작성합니다.
-
비행기 동체를 실제 크기로 블록아웃합니다 (비율이 전부입니다 — 실루엣을 같은 각도의 참고 자료와 비교하세요: 낮은 3/4 전방 우측 시점, 카메라 ≈ 1.2m 높이, ~11m 거리, ~35mm 렌즈).
-
디테일 모델링 + UVs + 절차적 페인트/풍화 효과를 적용합니다. 참고 각도 외에도 정면, 측면, 상단, 하단, 클로즈업(엔진, 노즈 아트, 플로트 보우, 스트럿 관절, 화물) 스크린샷을 찍으며 반복 작업을 수행합니다.
-
내부 및 계기판; 조종사 시점(주간 및 야간)의 스크린샷을 촬영합니다.
-
물리 엔진: 정지 상태에서 부유 (정확한 수선, 안정성), 택싱, 단계적 택싱, 이륙, 비행, 실속, 착륙 (부드럽게/거칠게), 해변 착륙, 계류, 충돌. 일반 플레이어가 라군에서 이륙하여 섬을 공전하고 몇 분 안에 물에 착륙할 수 있도록 조정하되, 여전히 무거운 덤불 비행기 같은 느낌이 나야 합니다.
-
상호작용 및 카메라, 그다음 사운드, 그다음 효과, 그다음 LODs/성능 패스 (제1절 예산 준수; 디버그 패널에
https://t.co/7xhanXuRNx를 출력하고 검증합니다). -
prewarm확인: prewarm 후, 비행, 착륙, 충돌, 문 열기, 야간 조명, 비가 올 때 —https://t.co/7xhanXuRNx.programs.length는 증가해서는 안 됩니다. -
콘솔 오류나 경고가 없어야 합니다. 사용하지 않는 코드를 정리합니다.
INTEGRATION.md를 작성합니다.
완료의 정의 (Definition of done):
-
참고 각도에서 찍은 샌드박스 스크린샷이 틀림없이 그 비행기여야 합니다: 실루엣, 색상, 샤크 마우스(shark mouth), 화물, 풍화 효과.
-
걸어 들어가 문을 열고, 탑승하고, 만족스러운 소리와 함께 엔진을 시동한 후, 택싱하고, 이륙하고, 비행하고, 실속 후 회복하여 물에 착륙하고, 부두까지 택싱하여 계류하고, 플로트 위로 나와 육지로 걸어 돌아올 수 있어야 합니다.
-
내부는 가까이서 감상하기에 충분히 상세하며, 모든 계기판과 제어 장치가 올바르게 움직입니다.
-
§1의 예산(budget)을 충족했으며, 사전 예열 후 셰이더가 컴파일되지 않습니다. 핫 루프에서 할당(allocation)이 없으며, dt = 0.1에서 안정적입니다.
-
이 모듈은 §1에 명시된 모든 규칙(구문, 에셋 없음, 전역 변수 없음, 런타임 라이트 없음)을 준수합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 X Unity/게임개발의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기