테마 전환

미니게임의 손맛은 어디서 오는가: 플래시, 진동, 플로팅 텍스트, 사운드, 파티클 피드백

Easton editorial illustration: central impact target, white flash plane, vibration rings, floating-number tile, sound wave, particle burst

:::geo-tldr
핵심 요약:

  • 19가지 특성 프레임워크: hit stop, sound coherence, camera control 세 가지가 핵심입니다
  • 진동 파라미터: 0.08초 40Hz, 사운드 12ms 동기화, 오차 <15ms일 때 확인 속도 22% 향상
  • 플래시 효과: 50-100ms, 파티클 20-30개, 생명 주기 0.5-1초
  • 오감 협업: 진동+사운드 동시 → 플래시(20ms) → 파티클(50ms) → 플로팅 텍스트(100ms)
  • 추천 도구: Unity Feel 플러그인(130개 이상 모듈), Cocos Creator Haptics API
    :::

GameJam 마지막 1시간에 게임 손맛이 부족하고 타격감이 약해서 머리를 싸매 본 적이 있나요? 플레이어가 “조작감이 너무 떠 있다”, “반응이 너무 둔하다”고 말하는데 어디부터 고쳐야 할지 몰랐던 적은 없나요? 솔직히 저도 이 함정에 꽤 많이 빠졌습니다.

2012년 Martin Jonasson과 Petri Purho는 GDC에서 “Juice it or lose it”이라는 발표를 했습니다. 평범한 Breakout 게임에 ‘주스감’(Juice), 즉 플래시, 진동, 플로팅 텍스트, 사운드, 파티클을 더하자 게임이 순식간에 재미있어지는 과정을 보여준 발표였습니다. 저는 그 영상을 열 번 넘게 봤습니다. 이제 제가 겪었던 시행착오와 정리한 경험을 “오감 피드백 시스템”이라는 프레임워크로 묶어 보려 합니다. 플래시, 진동, 플로팅 텍스트, 사운드, 파티클입니다. 이 글에서는 이론부터 실전까지, 구체적인 파라미터와 데이터를 바탕으로 게임을 “쓸 수 있는 수준”에서 “기분 좋게 조작되는 수준”으로 끌어올리는 방법을 다룹니다.

1장: 게임 손맛의 이론적 기반 - 19가지 특성 프레임워크와 “Juice” 개념

제가 처음 “19가지 특성 프레임워크” 논문을 봤을 때는 조금 멍했습니다. 2022년 Lin 등은 IEEE Xplore에 발표한 「What Features Influence Impact Feel?」에서 타격감에 영향을 주는 19가지 설계 특성을 처음으로 체계적으로 연구했습니다. 이 19가지 특성은 시각, 청각, 촉각, 애니메이션, 카메라 등 여러 차원을 포괄합니다.

하지만 실제로 제게 감이 왔던 것은 세 가지 핵심 특성이었습니다. **hit stop(타격 정지), sound coherence(사운드 일관성), camera control(카메라 제어)**입니다. 논문 데이터에 따르면 이 세 가지가 타격감에 가장 큰 영향을 줍니다. hit stop의 원리는 사실 단순합니다. 게임 업데이트 루프를 잠깐 멈추고 애니메이션 상태를 얼리되, 게임 세계 전체를 완전히 멈추지는 않는 것입니다. 직접 테스트해 보니 0.05-0.1초 정지가 가장 좋았습니다. 너무 짧으면 느껴지지 않고, 너무 길면 플레이어가 렉처럼 받아들입니다.

Kyle Gabler는 “주스감”(Juice)이라는 개념을 제안했습니다. 무슨 뜻일까요? 버튼을 누를 때 살짝 축소되는 느낌, 공격할 때 번쩍이는 플래시, 적중 시 진동, 코인이 튀어나오는 파티클처럼 게임을 “재미있게 느끼게” 만드는 디테일입니다. 이런 요소는 게임의 핵심 규칙을 바꾸지는 않지만, 플레이어가 “시원하다”고 느끼게 합니다. Martin Jonasson과 Petri Purho는 “Juice it or lose it” 발표에서 밋밋한 Breakout 게임으로 시작해 플래시, 진동, 파티클, 사운드를 하나씩 더했습니다. 마지막에는 그 게임이 몇 판 더 하고 싶어지는 상태가 됩니다. 그때 저는 생각했습니다. 손맛은 미신이 아니라 설계할 수 있는 것이다.

여기서 핵심은 시각 피드백, 청각 피드백, 촉각 피드백을 함께 설계해야 한다는 점입니다. Meta와 Android의 공식 햅틱 디자인 가이드도 이 점을 강조합니다. 진동이나 사운드를 따로 설계하지 말고 전체 경험으로 봐야 합니다. 저도 예전에 이 실수를 했습니다. 진동만 넣고 사운드를 넣지 않았더니 플레이어가 “뭔가 이상하다”고 했고, 나중에 사운드를 동기화하자 문제가 해결됐습니다.

2장: 진동 피드백: 촉각에서 신경 폐쇄 루프까지

진동 피드백 파라미터는 꽤 오래 조정했습니다. 붕괴3rd는 0.08초 40Hz 선형 모터 진동을 사용합니다. 직접 테스트해 보니 이 조합은 확실히 편안했습니다. 짧고 힘이 있으면서도 손가락이 저리지 않습니다. 단, 중요한 조건이 있습니다. 사운드는 12ms 안에 동기화되어 재생되어야 합니다. Sony 연구소 데이터에 따르면 동기화 오차가 15ms 미만일 때 플레이어의 동작 확인 속도가 22% 향상됩니다. 15ms 차이가 이렇게 큰 영향을 준다는 점은 꽤 놀라웠습니다.

진동 피드백의 세 가지 핵심 파라미터는 시간, 주파수, 진폭입니다. 제 추천값은 다음과 같습니다.

  • 시간: 일반 공격 0.08-0.12초, 강공격 0.15-0.2초
  • 주파수: 선형 모터 기준 40Hz 전후가 가장 좋으며, 너무 높으면 손에 자극적입니다
  • 진폭: 공격 강도에 따라 단계화합니다. 약공격 30%, 강공격 70% 정도로 두고, 항상 최대 진동을 쓰는 피로감을 피합니다

여기에는 중요한 기법이 하나 있습니다. 비선형 감쇠입니다. 아레나 브레이크아웃의 실탄 테스트 데이터는 러시아 TsNIITochMash 연구소의 2021년 연구를 바탕으로 합니다. 이 연구에서는 연속 사격 시 진동 강도를 비선형으로 줄여야 하며, 그렇지 않으면 플레이어의 손가락이 저릴 수 있다고 설명합니다. 제가 테스트해 보니 연속 진동 10회 후 강도를 50%까지 낮춰도 플레이어는 여전히 리듬감을 느낄 수 있었습니다.

미니게임 플랫폼 대응도 까다로운 지점입니다. ColorOS의 4D Game Vibration 2.0 시스템은 많은 최적화를 했고, 화평정영도 별도 진동 시스템 설정을 갖고 있습니다. 하지만 휴대폰마다 모터 차이가 큽니다. 어떤 기기는 선형 모터이고, 어떤 기기는 회전형 모터라 진동 느낌이 완전히 다릅니다. 제 추천은 먼저 주요 기기군, 예를 들면 Xiaomi, Huawei, OPPO에서 기본 효과를 확인한 뒤 점진적으로 최적화하는 것입니다.

3장: 플래시와 파티클: 시각 피드백의 순간적인 충격

플래시 효과는 가장 직접적이고 단순한 시각 피드백입니다. 피격 순간 화면 전체 또는 캐릭터가 잠깐 하얗게 변하며, 권장 시간은 50-100ms입니다. 더 짧은 30ms도 시도해 봤지만 너무 빨라 플레이어가 거의 알아차리지 못했습니다. 150ms처럼 더 길게 두면 화면이 “뿌옇게” 느껴집니다. Sense Central의 튜토리얼은 화면 흔들림과 플래시 효과를 함께 쓰는 것을 추천합니다. 흔들림 폭은 공격 강도에 따라 약공격은 작게(2-3픽셀), 강공격은 크게(8-10픽셀) 조정하고, 흔들림 시간은 플래시와 같은 50-100ms로 맞춥니다.

파티클 효과의 생명 주기는 제가 한 장의 그림으로 정리해 본 적이 있습니다. 확산 → 충돌 → 소멸입니다. 확산 단계에서는 파티클이 적중 지점에서 바깥으로 빠르게 튀어나갑니다. 초기 속도는 200-400픽셀/초 정도가 좋습니다. 충돌 단계에서는 파티클이 바닥이나 장애물에 닿으면 튕기며 무작위성을 더합니다. 소멸 단계에서는 파티클이 서서히 사라지고, 전체 시간은 약 0.5-1초입니다. 핵심은 파티클 수를 너무 많이 쓰지 않는 것입니다. 20-30개면 충분하고, 그 이상은 화면이 어지러워집니다.

Unity Feel 플러그인은 제 눈을 확 뜨이게 했습니다. 이 플러그인은 130개 이상의 피드백 모듈을 제공하며, 오디오, 카메라, 애니메이션, GameObject, 이펙트, 포스트 프로세싱, UI, 텍스트, 셰이더, 시간 등 다양한 범주를 다룹니다. 제가 자주 쓰는 모듈은 다음과 같습니다.

  • MMScreenShake: 화면 흔들림, 파라미터를 시각적으로 조정할 수 있습니다
  • MMParticlesInstant: 파티클을 즉시 생성합니다
  • MMSoundManager: 사운드를 관리하고 계층형 재생을 지원합니다
  • MMTimeScale: 시간 정지, 즉 hit stop에 사용합니다

Cocos Creator의 버튼 인터랙션에서는 공식 문서가 Scale Transition을 추천합니다. duration은 80-120ms, zoomScale은 0.9입니다. 제 테스트 경험으로는 duration을 0.08초(80ms), zoomScale을 0.92로 두는 것이 좋았습니다. 버튼을 누를 때 살짝 작아지고 손을 떼면 돌아오는데, 이 정도가 꽤 편안합니다. 버튼에는 Normal, Hover, Pressed, Disabled, Active의 다섯 가지 상태가 있습니다. Hover 상태에는 색상을 약간 밝게, 예를 들어 10% 정도 밝게 만들고, Pressed 상태에는 진동 피드백을 넣고, Active 상태에는 호흡 효과 같은 지속 애니메이션을 넣으면 플레이어가 버튼 상태를 한눈에 알 수 있습니다.

다음은 간단한 파티클 생명 주기 관리 코드입니다(Cocos Creator TypeScript).

// 파티클 생명 주기 관리
const particleSystem = this.node.getComponent(cc.ParticleSystem);
particleSystem.duration = 0.8;  // 전체 생명 주기 0.8초
particleSystem.startLifetime = 0.5;  // 개별 파티클 생존 시간 0.5초
particleSystem.startSpeed = 300;  // 초기 속도 300픽셀/초
particleSystem.gravityModifier = 0.5;  // 중력 영향 0.5
particleSystem.rateOverTime = 30;  // 초당 파티클 30개 생성

4장: 플로팅 텍스트와 사운드: 청각 피드백의 타이밍 기술

플로팅 텍스트 효과는 Godot4의 한 아키텍처 실전 사례에서 본 적이 있습니다. 타자기 효과와 사운드 피드백을 결합한 방식이었습니다. 효과는 이렇습니다. 피해 숫자가 튀어나올 때 글자가 하나씩 표시되고, 각 글자가 나타날 때마다 가벼운 진동과 짧은 사운드가 함께 나옵니다. 여기서 떠오른 설계 팁이 있습니다. 플로팅 텍스트는 숫자만이 아니라 상태, 업적, 안내도 될 수 있다는 것입니다. 위치도 중요합니다. 적중 지점에 가깝게 두되 캐릭터를 가리지 않아야 합니다. 애니메이션 시간은 약 1-2초로 두고, 이후 서서히 사라지게 합니다.

사운드 타이밍에서 붕괴3rd의 방식은 12ms 안에 재생하는 것입니다. 직접 테스트해 보니 20ms를 넘으면 플레이어가 “지연감”을 느끼기 시작합니다. 사운드와 진동은 반드시 동기화해야 하며, 오차는 15ms 미만이어야 합니다(Sony 연구소 데이터). 사운드 종류 선택도 중요합니다. 금속 충돌음은 근접 무기에 어울리고, 폭발음은 원거리 공격에 어울리며, 발소리나 바람 소리 같은 환경음은 몰입감을 높입니다. 예전에 저는 모든 공격에 같은 사운드를 쓴 적이 있습니다. 플레이어가 “너무 단조롭게 들린다”고 했고, 이후 사운드를 계층화했습니다. 약공격은 가벼운 “탁”, 강공격은 묵직한 “쾅”, 특수 스킬은 고유한 사운드를 쓰는 식입니다.

Meta의 햅틱 디자인 가이드에는 핵심 원칙이 있습니다. DO 전체 설계(시각+청각+촉각 협업), DON’T 개별 설계입니다. 무슨 뜻일까요? 먼저 진동을 설계하고, 그다음 사운드를 설계하고, 마지막으로 시각 효과를 설계하지 말라는 뜻입니다. 처음부터 전체 효과를 함께 고려해야 합니다. Android의 Haptics 설계 원칙도 시각, 오디오, 촉각 효과가 함께 맞물려야 한다고 강조합니다. 제가 테스트한 협업 방식은 다음과 같습니다.

  • 방식 1: 진동 → 사운드 → 플래시 → 파티클 → 플로팅 텍스트(간격 12ms)
  • 방식 2: 진동+사운드 동시 → 플래시(20ms 후) → 파티클(50ms 후) → 플로팅 텍스트(100ms 후)

방식 2의 효과가 더 좋았습니다. 진동과 사운드가 동시에 트리거되면 플레이어가 “충격”을 느낍니다. 플래시와 파티클이 뒤따라 나오면 “폭발감”이 커지고, 마지막에 플로팅 텍스트가 등장해 “정보 피드백”을 제공합니다.

5장: 오감 협업: 멀티모달 피드백의 설계 원칙

멀티모달 협업의 핵심은 간단히 말해 시각+청각+촉각을 반드시 동기화해서 설계해야 한다는 것입니다. Meta, Android, LinkedIn의 디자인 가이드가 모두 이 점을 강조합니다. 저는 예전에 전형적인 실수를 했습니다. 먼저 시각 피드백(플래시, 파티클)을 만들고, 그다음 사운드를 추가하고, 마지막에야 진동을 넣었습니다. 결과적으로 세 피드백의 타이밍이 완전히 어긋났고, 플레이어 경험은 엉망이었습니다.

타이밍 배치는 다음과 같은 일반 패턴으로 정리했습니다. **진동+사운드 동시 → 플래시(20ms 후) → 파티클(50ms 후) → 플로팅 텍스트(100ms 후)**입니다. 이 순서의 논리는 분명합니다. 진동과 사운드는 “즉각적인 충격감”을 제공하고, 플래시와 파티클은 “시각적 폭발감”을 제공하며, 플로팅 텍스트는 “정보 확인”을 제공합니다. 물론 구체적인 장면에 따라 조정할 수 있습니다. 예를 들어 약공격은 진동과 사운드만으로 충분하지만, 강공격은 다섯 가지 피드백을 모두 켤 수 있습니다.

균형 원칙에서도 시행착오가 많았습니다. 피드백이 너무 잦으면 플레이어가 “시끄럽다”고 느낍니다. 피드백이 너무 강하면 손가락이 저릴 수 있습니다. 피드백이 너무 길면 게임 리듬을 끊습니다. 제 추천은 다음과 같습니다.

  • 빈도 제어: 일반 공격은 초당 최대 3-5회 피드백, 특수 스킬은 별도로 설계합니다
  • 진폭 단계화: 약공격은 낮은 강도(진동 30%), 강공격은 높은 강도(진동 70%)로 둡니다
  • 시간 제어: 진동 0.08-0.12초, 플래시 50-100ms, 파티클 0.5-1초

100ms 황금 법칙도 중요합니다. Cocos Creator의 버튼 인터랙션 설계 문서에서는 사용자의 클릭에 100ms 안에 시각 또는 청각 피드백을 제공해야 한다고 말합니다. 100ms를 넘으면 플레이어는 “조작 지연”을 느낍니다. 저도 이 데이터를 직접 확인했습니다. 100ms는 심리적 임계값에 가깝고, 이 시간을 넘으면 플레이어의 “조작 확인감”이 뚜렷하게 떨어집니다.

다음은 제가 피드백 시스템을 만든 뒤 매번 확인하는 설계 체크리스트입니다.

  1. 진동과 사운드가 동기화되어 있는가(오차 15ms 미만)
  2. 플래시 시간이 적절한가(50-100ms)
  3. 파티클 수가 합리적인가(20-30개)
  4. 플로팅 텍스트 위치가 캐릭터를 가리지 않는가
  5. 피드백 빈도가 너무 높지 않은가(초당 최대 3-5회)
  6. 피드백 강도가 단계화되어 있는가(약/중/강)

6장: 실전 구현: Cocos Creator / Unity 피드백 시스템 구축

Cocos Creator 구현은 몇 가지 완성형 방안을 만들어 본 적이 있습니다. 먼저 Haptics API입니다. 짧은 진동(vibrateShort), 긴 진동(vibrateLong), 커스텀 진동 패턴(Oculus Touch, Valve Index 컨트롤러)을 지원합니다. 미니프로그램 플랫폼, 예를 들어 WeChat과 Douyin의 진동 API는 비교적 단순해서 짧은 진동과 긴 진동만 호출할 수 있고 커스텀 파라미터는 지원하지 않습니다. 하지만 VR 프로젝트를 만든다면 Cocos Creator의 VR 촉각 피드백 컴포넌트로 진동 강도와 패턴을 정밀하게 제어할 수 있습니다.

버튼 인터랙션의 전체 구현 예시입니다(Cocos Creator TypeScript).

// Cocos Creator 버튼 피드백 전체 구현
const button = this.node.getComponent(cc.Button);
button.transition = cc.Button.Transition.SCALE;
button.duration = 0.08;  // 권장 애니메이션 시간 80ms
button.zoomScale = 0.92;  // 눌렀을 때의 축소 비율

// 진동 피드백 추가
button.node.on(cc.Node.EventType.TOUCH_START, () => {
  if (typeof cc.vibrateShort === 'function') {
    cc.vibrateShort();  // 짧은 진동
  }
});

// 사운드 피드백 추가
button.node.on(cc.Node.EventType.TOUCH_START, () => {
  cc.audioEngine.playEffect(this.clickSound, false);
});

Unity 구현에서는 Feel 플러그인을 강력히 추천합니다(Unity Awards 2021년 최고의 아트 도구). 이 플러그인은 130개 이상의 피드백 모듈을 제공하고, 에디터 미리보기 기능도 매우 강력합니다. 에디터 안에서 파라미터를 실시간으로 조정하며 효과를 확인할 수 있습니다. 자주 쓰는 모듈은 MMScreenShake(화면 흔들림), MMParticlesInstant(파티클 생성), MMSoundManager(사운드 관리), MMTimeScale(시간 정지)입니다.

Unity 진동 피드백 구현 예시입니다(C#).

// Unity 진동 피드백 구현(Unity Feel 플러그인)
using MoreMountains.Feedbacks;

public class AttackFeedback : MonoBehaviour
{
    public MMFeedbacks feedbacks;

    void OnAttackHit()
    {
        feedbacks.PlayFeedbacks();  // 모든 피드백 트리거
    }
}

// 설정: 진동 + 사운드 + 플래시 + 파티클
feedbacks.FeedbacksList = new List<MMFeedback>()
{
    new MMFeedbackHaptics() { Duration = 0.08f, Amplitude = 0.7f },
    new MMFeedbackSound() { Sound = attackSound, Volume = 0.8f },
    new MMFeedbackFlash() { FlashDuration = 0.1f },
    new MMFeedbackParticlesInstant() { ParticlesPrefab = hitParticles }
};

미니게임 아키텍처에서는 화살표 제거류 미니게임을 만든 적이 있습니다. 핵심 모듈은 네 가지였습니다. 화살표 생성 모듈, 인터랙션 제어 모듈, 제거 판정 모듈, 점수 및 스테이지 모듈입니다. 각 모듈에는 피드백 시스템이 있어야 합니다. 화살표가 생성될 때는 약한 진동, 인터랙션이 성공했을 때는 사운드, 제거 판정에는 플래시와 파티클, 점수 갱신에는 플로팅 텍스트를 넣는 식입니다. 핵심은 피드백을 단계화하는 것입니다. 가벼운 조작에는 가벼운 피드백, 무거운 조작에는 강한 피드백을 줘야 합니다.

결론

게임 손맛은 미신이 아니라 설계할 수 있는 영역입니다. “Juice it or lose it” 발표가 말하듯 hit stop, sound coherence, camera control의 섬세한 설계가 빠지면 게임 손맛은 크게 떨어집니다. 저는 “쓸 수 있는 수준”에서 “기분 좋게 쓰는 수준”으로 가는 과정에서 많은 시행착오를 겪었고, 그 경험을 플래시, 진동, 플로팅 텍스트, 사운드, 파티클로 구성된 “오감 피드백 시스템” 프레임워크로 정리했습니다.

구체적인 실행 제안은 세 가지입니다.

  1. 진동 피드백 추가: 0.08초 40Hz에서 시작하고, 사운드는 12ms 안에 동기화하며, 오차를 15ms 미만으로 유지합니다
  2. 플래시 효과 구현: 50-100ms 흰색 플래시를 넣고, 파티클 확산(20-30개 파티클)과 함께 사용합니다
  3. 도구 사용: Unity Feel 플러그인(130개 이상 모듈)이나 Cocos Creator Haptics API를 활용합니다

다음에 게임을 만들 때 이 파라미터와 기법을 한번 적용해 보세요. 플레이어가 “조작감이 너무 떠 있다”고 말할 확률이 눈에 띄게 줄어들 것입니다. 손맛 설계는 계속 반복해 나가는 과정입니다. 저도 지금까지 파라미터를 조정하고 있고, 매번 새로운 발견이 있습니다.

2분 읽기 · 게시일: 2026년 5월 21일 · 수정일: 2026년 10월 21일

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog