"매 VR rhythm game 의 architecture 의 reference — 90Hz minimum framerate · sub-20ms motion-to-photon · ECS-style note pool". 2018 Beat Games (Meta acq 2019) release, 2026 의 Quest 3/Vision Pro 의 cross-platform mainstream, "framerate 의 holy 의 above 의 nothing" 의 architecture 의 lesson.
// Note 의 spawn position 의 calcfloatjumpDist=njs*(60f/bpm)*halfJumpDuration*2f;Vector3spawnPos=playerPosition+Vector3.forward*jumpDist;// Note 의 frame 마다 의 lerpfloatt=(Time.timeAsDouble-spawnTime)/(hitTime-spawnTime);note.transform.position=Vector3.Lerp(spawnPos,hitPos,(float)t);
varfeature=OpenXRSettings.Instance.GetFeature<FoveationFeature>();feature.foveatedRenderingLevel=FoveatedRenderingLevel.High;feature.useDynamicFoveatedRendering=true;// eye-tracked on Quest 3
매 결정 기준
상황
Approach
< 100 active note · prototype
MonoBehaviour + pool
> 200 active note · production
DOTS/ECS + Burst
Cross-platform (PCVR + Quest)
Unity URP + multi-quality preset
Modding support
Open beatmap format (.dat) + PluginLoader
매 90fps 미달 의 perf budget
Foveation · LOD · GPU instancing
기본값: Unity DOTS + URP + OpenXR — 매 Quest 3 의 baseline 의 fit.
언제: beatmap 의 procedural generation, cut-direction pattern 의 difficulty curve 의 tune, NJS · offset 의 starter value 의 suggest.
언제 X: 매 hand-crafted choreography (top mapper 의 art form) — LLM 의 generate 의 bland.
❌ 안티패턴
GC 의 frame 의 allocate: 매 90fps 의 break → motion sickness.
Animation curve 의 audio sync: dt 의 drift → pop. NJS-based linear lerp 의 use.
Saber 의 trigger collider: physics step 의 sub-frame miss — manual raycast/plane 의 use.
Per-note GameObject Instantiate: pool 의 mandatory.