브라우저 FPS 총기 반동 시스템 설계
FPS 게임에서 총기의 "감"을 좌우하는 가장 중요한 요소는 반동 시스템입니다. 반동이 없으면 사격이 무미건조하고, 반동이 과하면 조작이 불쾌합니다. 이 글에서는 Dogkov의 7종 무기에 적용된 반동 시스템의 수치 설계와 구현 과정을 상세히 다룹니다.
반동의 기본 구조
2D 탑뷰 게임에서 반동은 "조준점이 위로 올라가는 것"이 아니라 "사격 각도에 랜덤 오차가 추가되는 것"으로 표현됩니다. 3D FPS에서는 화면이 위로 흔들리지만, 탑뷰에서는 총알의 발사 각도가 조준 방향에서 벗어나는 것으로 반동을 표현합니다.
function shoot(weapon, aimAngle) {
// 기본 반동값에 무기 계수를 곱함
const baseSpread = 0.05; // 기본 오차 (라디안)
const recoilSpread = baseSpread * weapon.recoilMultiplier;
// 연속 사격 시 반동 누적
const burstPenalty = consecutiveShots * 0.02 * weapon.recoilMultiplier;
// 최종 발사 각도
const totalSpread = recoilSpread + burstPenalty;
const actualAngle = aimAngle + (Math.random() - 0.5) * totalSpread;
// 총알 생성
createBullet(player.x, player.y, actualAngle, weapon.damage);
consecutiveShots++;
}
핵심은 반동 누적입니다. 첫 발은 거의 정확하지만, 연속으로 쏠수록 consecutiveShots가 증가하며 오차가 커집니다. 사격을 멈추면 반동이 서서히 회복됩니다.
반동 회복 메커니즘
사격을 멈추면 반동 누적이 시간에 따라 감소합니다:
// 매 프레임 반동 회복
function updateRecoil(dt) {
if (Date.now() - lastShotTime > weapon.fireRate + 50) {
// 사격을 멈춘 상태
const recoveryRate = 3.0; // 초당 3 단계 회복
const laserBonus = equippedLaser ? equippedLaser.recoilBonus : 0;
consecutiveShots -= (recoveryRate + recoveryRate * laserBonus) * dt;
if (consecutiveShots < 0) consecutiveShots = 0;
}
}
여기서 레이저 부착물이 반동 회복에 영향을 줍니다. PEQ-15 빨간 레이저는 10%, 녹색 레이저는 20%의 회복 속도 보너스를 줍니다. 이것은 장비 선택에 전략적 깊이를 더합니다.
무기별 수치 설계
7종 무기의 핵심 수치를 결정할 때 고려한 원칙들:
1. 데미지와 연사속도의 반비례
DPS(초당 데미지)가 비슷하도록 설계합니다. 데미지가 높은 무기는 연사가 느리고, 연사가 빠른 무기는 데미지가 낮습니다:
- M4A1 — 데미지 30, 연사 90ms → DPS: 333
- AK-47 — 데미지 42, 연사 70ms → DPS: 600 (높지만 반동 1.2배)
- SR-16 — 데미지 30, 연사 80ms → DPS: 375 (낮은 반동 0.9배로 안정적)
- SCAR-H — 데미지 42, 연사 100ms → DPS: 420 (높은 반동 1.4배)
AK-47의 DPS가 가장 높지만 반동도 크므로, 실전에서는 빗맞힘이 많아 실질 DPS가 낮아집니다. 반면 SR-16은 DPS는 낮지만 반동이 0.9배로 안정적이라 초보자에게 유리합니다.
2. 스나이퍼의 원샷 가치
// 스나이퍼 라이플
{ name: 'Mk13 Mod 5', damage: 60, fireRate: 1200, recoil: 3.0 }
{ name: 'CheyTac M200', damage: 69, fireRate: 1500, recoil: 4.0 }
기본 체력이 100이므로 Mk13은 2발, M200은 2발이면 킬입니다. 헤드샷은 거리와 관계없이 100 데미지로 즉사합니다. 스나이퍼는 한 발의 가치가 극대화되는 대신, 빗맞히면 1.2~1.5초 동안 무방비 상태가 됩니다.
3. 방탄복과의 상호작용
방탄복은 데미지를 비율로 감소시킵니다. Lv.3 방탄복(15% 감소) 착용 시 무기별 유효 데미지:
- M4A1: 30 → 25.5 (4발 킬 → 4발 킬, 변화 없음)
- AK-47: 42 → 35.7 (3발 킬 → 3발 킬, 변화 없음)
- Mk13: 60 → 51 (2발 킬 → 2발 킬, 변화 없음)
의도적으로 방탄복이 킬에 필요한 발수를 바꾸지 않도록 설계했습니다. 방탄복의 가치는 "교전 후 남는 체력"을 높이는 것입니다. 3발 교전 후 방탄복 없으면 HP 16, Lv.3이면 HP 35.1로 약 2배 차이가 납니다.
발사 모드: 연사/점사/단발
E키로 발사 모드를 전환할 수 있습니다. 각 모드별 특성:
연사 (AUTO)
마우스를 누르고 있으면 계속 사격합니다. 반동이 빠르게 누적되어 5발째부터 정확도가 급격히 떨어집니다. 근거리 전투에서 효과적입니다.
단발 (SEMI)
클릭할 때마다 1발씩 발사합니다. 클릭 사이에 반동이 부분적으로 회복되므로 원거리에서 정확합니다. 탄약 효율도 가장 좋습니다.
점사 (BURST)
한 번 클릭하면 3발을 빠르게 연사합니다. 연사의 화력과 단발의 컨트롤 중간 지점입니다:
function fireBurst(weapon) {
let burstCount = 0;
const burstInterval = setInterval(() => {
if (burstCount >= 3) {
clearInterval(burstInterval);
return;
}
shoot(weapon, playerAngle);
burstCount++;
}, weapon.fireRate * 0.6); // 점사 시 연사속도 60% 간격
}
ADS (조준 사격)
마우스 우클릭으로 ADS 모드에 진입하면 세 가지 효과가 적용됩니다:
- 이동 속도 60% 감소 — 조준하면서 빠르게 이동할 수 없음
- 1.3배 줌 — 카메라가 약간 확대되어 원거리 조준이 용이
- 반동 30% 감소 — recoilMultiplier에 0.7을 곱함
function getEffectiveRecoil(weapon, isADS) {
let recoil = weapon.recoilMultiplier;
if (isADS) recoil *= 0.7;
if (equippedLaser) recoil *= (1 - equippedLaser.recoilBonus * 0.3);
return recoil;
}
ADS + 녹색 레이저 조합이면 반동이 약 40% 감소하여 원거리에서도 안정적인 연사가 가능합니다. 이것이 녹색 레이저가 에픽 등급인 이유입니다.
마치며
총기 시스템의 핵심은 수치입니다. 데미지, 연사속도, 반동의 삼각관계를 잘 설계하면 각 무기가 고유한 개성을 갖게 됩니다. "만능 무기"가 없어야 무기 교체의 의미가 생기고, 상황에 따라 다른 무기를 선택하는 전략적 재미가 만들어집니다. 모든 수치는 실제 플레이 테스트를 통해 반복 조정했으며, 아직도 밸런스 패치가 진행 중입니다.