テーマを切り替える

ゲームの手応えはどこから生まれるか:フラッシュ、振動、ダメージ表示、音効、パーティクル

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 の 3 つが中核
  • 振動パラメータ: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——フラッシュ、振動、ダメージ表示、音効、パーティクル——を足しただけで、一気に「遊びたくなる」ゲームに変わる。その動画は 10 回以上見返しました。今回は、自分が踏んだ坑と試行錯誤を「五感フィードバック」——フラッシュ、振動、ダメージ表示、音効、パーティクル——として整理します。理論から実装、具体パラメータまで押さえて、「動く」から「気持ちいい」へ引き上げましょう。

第 1 章:手応えの理論 — 19 特徴フレームワークと Juice

2022 年、Lin らが IEEE Xplore で発表した《What Features Influence Impact Feel?》は、打撃感に効く 19 の設計特徴を体系化した論文です。初めて読んだときは情報量に圧倒されましたが、視覚・聴覚・触覚・アニメーション・カメラなど、手応えの要素が一覧できるのが強みです。

特に効いてきたのは hit stop(ヒットストップ)、sound coherence(音の一貫性)、camera control(カメラ制御) の 3 つ。論文でも影響度はこのあたりが大きい。hit stop はシンプルで、更新ループを一瞬止めてアニメーションを固定する——ただしワールド全体は止めない。実測では 0.05〜0.1 秒がちょうどよく、短すぎると気づかれず、長すぎるとカクつきに感じられます。

Kyle Gabler が言う Juice とは、ルールは変えずに「気持ちよさ」を足す細部のこと。ボタン押下の微スケール、攻撃のフラッシュ、ヒット時の振動、コインのパーティクル——全部、Juice です。Jonasson と Purho のデモは、地味な Breakout に要素を足していく過程そのもの。「手応えはセンスじゃなく、設計できる」と腹落ちしました。

ここが肝:視覚・聴覚・触覚はセットで設計する。Meta も Android も触覚ガイドで同じことを言います。振動だけ、音だけ——分けて作ると違和感が出ます。私も振動だけ入れて「なんか変」と言われたことがあり、音を同期したら解消しました。

第 2 章:振動フィードバック — 触覚から神経ループへ

振動はパラメータ調整に時間がかかります。崩壊 3rd は 0.08 秒・40Hz のリニアモータ振動 を使い、短くて力強い——指が痺れにくいバランスです。ただし 音効は 12ms 以内に同期 が必須。ソニー研究所のデータでは、誤差 15ms 未満で操作確認が 22% 速くなる。15ms の差がここまで効くのは、正直驚きでした。

3 つの軸は 時間・周波数・振幅 です。

  • 時間:通常攻撃 0.08〜0.12 秒、重攻撃 0.15〜0.2 秒
  • 周波数:40Hz 前後(リニアモータ向け)。高すぎると刺さる
  • 振幅:弱 30%、強 70% など段階を。常に最大だと疲れる

非線形減衰 も忘れずに。Arena Breakout(暗区突围)の実弾テストは、ロシア TsNIITochMash 研究所(2021)の連射データを参考にしています。連続射撃では強度を下げないと指が痺れる。10 発連続なら 50% まで落としても、リズム感は残ります。

ミニゲームは端末差が大きい。ColorOS の 4D ゲーム振感 2.0 や PUBG Mobile 向け振動設定など、プラットフォーム最適化は進んでいますが、リニアとローターで体感は別物。まず Xiaomi・Huawei・OPPO など主流機でベースラインを取り、そこから詰めるのが現実的です。

第 3 章:フラッシュとパーティクル — 視覚の瞬間インパクト

フラッシュは最も手軽な視覚フィードバック。被弾瞬間に画面(またはキャラ)を白くする 50〜100ms が目安です。30ms は短すぎて見逃され、150ms は画面が「にごる」感じになります。Sense Central のチュートリアルでも、画面シェイクとセットが効果的——弱攻撃 2〜3px、強攻撃 8〜10px、時間はフラッシュと揃えて 50〜100ms。

パーティクルは 拡散 → 衝突 → 消失 の 3 段階。命中点から 200〜400px/s で飛ばし、地面や障害物でバウンスさせ、0.5〜1 秒でフェードアウト。数は 20〜30 個 で十分。多すぎるとごちゃつきます。

Unity Feel プラグインは 130+ のフィードバックモジュール を持ち、音・カメラ・アニメ・GameObject・VFX・ポストプロセス・UI・テキスト・シェーダー・時間などをカバーします。よく使うのは次の 4 つです。

  • MMScreenShake:画面シェイク、パラメータをビジュアル調整
  • MMParticlesInstant:パーティクル即時生成
  • MMSoundManager:レイヤー再生対応の SE 管理
  • MMTimeScale:時間停止(hit stop)

Cocos Creator のボタンは Scale Transition が定番。duration 80〜120ms、zoomScale 0.9。実測では duration 0.08 秒、zoomScale 0.92 が押し心地よい。Normal / Hover / Pressed / Disabled / Active の 5 状態——Hover で明度 +10%、Pressed で振動、Active で呼吸アニメなど、状態が一目で分かると UX が上がります。

パーティクル寿命の例(Cocos Creator TypeScript):

// パーティクル寿命の管理
const particleSystem = this.node.getComponent(cc.ParticleSystem);
particleSystem.duration = 0.8;  // 全体の寿命 0.8 秒
particleSystem.startLifetime = 0.5;  // 1 粒あたり 0.5 秒
particleSystem.startSpeed = 300;  // 初速 300px/s
particleSystem.gravityModifier = 0.5;  // 重力係数 0.5
particleSystem.rateOverTime = 30;  // 秒間 30 粒生成

第 4 章:ダメージ表示と音効 — 聴覚のタイミング

Godot 4 のタイプライター+SE 連動が参考になります。ダメージ数字を 1 文字ずつ出し、各文字で軽い振動と短い SE——数字だけでなく、状態・実績・ヒントにも使える のがポイント。位置は命中点付近、キャラを隠さない。表示 1〜2 秒でフェードアウト。

SE のタイミングは崩壊 3rd 同様 12ms 以内。20ms を超えると「遅い」と感じられ、振動との同期誤差は 15ms 未満が目標(ソニー研究所)。近接は金属音、遠距離は爆発音、足音・風など環境音で没入感を足す。以前は全攻撃同じ SE 一択で「単調」と言われ、弱「パン」、強「ドン」、必殺は専用 SE と層を分けて改善しました。

Meta の触覚ガイド:DO 全体設計(視覚+聴覚+触覚)、DON’T 単体設計。振動→音→視覚の順で後付けしない。Android Haptics も同じです。試した 2 パターン:

  • 案 1:振動 → 音効 → フラッシュ → パーティクル → ダメージ表示(12ms 間隔)
  • 案 2:振動+音効同時 → フラッシュ(20ms 後)→ パーティクル(50ms 後)→ ダメージ表示(100ms 後)

案 2 の方が「当たった感」が強い。振動と音で即時インパクト、フラッシュとパーティクルで爆発感、最後に数字で情報確認——という流れです。

第 5 章:五感連携 — マルチモーダル設計の原則

要は 視覚・聴覚・触覚を最初から同時に設計 すること。Meta、Android、LinkedIn のガイドも同趣旨です。視覚だけ先に作って、あとから音と振動——時序がズレて体験が崩れる典型パターンを、私も踏みました。

汎用の時序は 振動+音効同時 → フラッシュ(20ms)→ パーティクル(50ms)→ ダメージ表示(100ms)。即時の衝撃、視覚の爆発、情報の確認——この順序が基本。軽攻撃は振動+音だけ、重攻撃は 5 要素全部、などシーンで調整します。

バランスも重要。多すぎるとうるさい、強すぎると指が痺れる、長すぎるとテンポが崩れる。

  • 頻度:通常攻撃は秒 3〜5 回まで。必殺は別設計
  • 強度:弱 30%、強 70% など段階付け
  • 時間:振動 0.08〜0.12 秒、フラッシュ 50〜100ms、パーティクル 0.5〜1 秒

100ms ルール——Cocos Creator の UI ガイドでも、クリックから 100ms 以内 に視覚か聴覚の反応が必要とされています。超えると「操作が遅い」と感じられ、確認感が落ちます。実測でも、100ms は心理しきい値として効いていました。

完成後のチェックリスト:

  1. 振動と音効は同期しているか(誤差 15ms 未満)
  2. フラッシュは 50〜100ms か
  3. パーティクルは 20〜30 個程度か
  4. ダメージ表示がキャラを隠していないか
  5. 秒 3〜5 回を超える連打フィードバックになっていないか
  6. 弱・中・強で強度を分けているか

第 6 章:実装 — Cocos Creator / Unity で組み立てる

Cocos Creator の Haptics APIvibrateShortvibrateLong、カスタムパターン(Oculus Touch、Valve Index など)に対応。WeChat・Douyin ミニゲームは短/長振動のみで、パラメータ指定は限定的。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();  // 短振動
  }
});

// クリック SE
button.node.on(cc.Node.EventType.TOUCH_START, () => {
  cc.audioEngine.playEffect(this.clickSound, false);
});

Unity では Feel プラグイン(Unity Awards 2021 Best Artistic Tool)を強く推します。130+ モジュール、エディタでリアルタイムプレビュー。MMScreenShakeMMParticlesInstantMMSoundManagerMMTimeScale が定番です。

Unity 振動(C#、Feel プラグイン):

// Unity 振動フィードバック(Feel プラグイン)
using MoreMountains.Feedbacks;

public class AttackFeedback : MonoBehaviour
{
    public MMFeedbacks feedbacks;

    void OnAttackHit()
    {
        feedbacks.PlayFeedbacks();  // 全フィードバックを再生
    }
}

// 設定例:振動 + SE + フラッシュ + パーティクル
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 }
};

矢印パズル系ミニゲームでは、生成・操作・消去・スコアの 4 モジュールそれぞれにフィードバックを付けました。生成で軽振動、成功で SE、消去でフラッシュ+パーティクル、得点更新でダメージ表示。軽い操作は軽く、重い操作は重く——この段階付けが効きます。

まとめ

手応えはセンスではなく、設計です。「Juice it or lose it」が示す通り、hit stop・sound coherence・camera control を粗くすると、打撃感は一気に落ちます。私が「動く」から「気持ちいい」へ持っていくために試した五感フィードバック——フラッシュ、振動、ダメージ表示、音効、パーティクル——を、この記事にまとめました。

今日から試せる 3 点:

  1. 振動:0.08 秒・40Hz から。SE は 12ms 以内、誤差 15ms 未満
  2. フラッシュ:50〜100ms の白フラッシュ+パーティクル 20〜30 個
  3. ツール:Unity Feel(130+ モジュール)か Cocos Creator Haptics API

次のプロジェクトでパラメータを当てはめてみてください。「操作がふわふわする」という声は、確実に減るはずです。手応えは一度で完成しません——今も私は微調整を続けていて、そのたびに新しい発見があります。

6分で読めます · 公開日: 2026年5月21日 · 更新日: 2026年7月14日

関連記事

コメント

GitHubアカウントでログインしてコメントできます

Easton BlogEaston Blog