LAB へ戻る
[LAB NOTE] — 出招アニメから打撃感まで — RPG 戦闘システム開発記録
REC ● 00:00:00:00

出招アニメから打撃感まで

RPG 戦闘システム開発記録

Unity の RPG プロトタイプで、角色アニメ・エフェクト・連撃・shader をどう束ねたか。実験の中で学んだことの記録。

TYPE
戦闘システム
ROLE
企画から実装まで一人で
PLATFORM
PC
STATUS
進行中

WHY THIS PROTOTYPE

前言 — 打撃ではなく、リズムの実験

私はずっと「動作のリズム」と「打撃感」に敏感だった。

格闘ゲームが得意だからではない。むしろ、角色が手を出した瞬間に、画面が適切な「溜め・回饋・空気感」で応えてくれたら——ただダメージ数字が出るより、ずっと本物らしく感じられるのでは、とよく想像していたからだ。

だからこのプロトタイプを始めた。ゲームを完成させるためではなく、打撃設計・スキル演出・アニメの組み合わせ・出力回饋・画面の手触りを「載せられる」基本戦闘システムを組むため。以下はその開発思考の記録。

ANIMATION → COMBO

アニメから連撃のリズムへ

私は「アニメ制作」からではなく、角色の戦闘リズムの想像から入る。頭の中で三連撃のリズムを描く。

  • 一撃目:速いが重くない
  • 二撃目:つながるが、わずかに遅れる
  • 三撃目:ひと呼吸ためて、視覚的な爆発を作る

Unity の Animator で各動作のステートマシンを組み、combo buffer と animation tag による判定で入力タイミングの容錯と自然な接続を実現した。ここで大事なのは単に「アニメを再生する」ことではなく、入力とリズムの間のロジックを制御可能・可視化された状態に保つことだった。

FIG.01 — Animator のステート構成
FIG.02 — combo の遷移とタグ

FEEL IS MORE THAN VFX

打撃感はエフェクトだけではない

dash 攻撃を作っていて気づいた——角色を移動させるだけでは「体を突き抜けた」感覚は出ない。そこで重ねたのが次の要素。

  • 空間圧縮感のための魚眼風 camera shader
  • 斬撃の残像を生む剣軌 shader
  • 命中の瞬間に「止め」を作る Hitstop
  • 撃退と同期する効果音で、接触のリズムを強める

加えて「空間属性の魔法」も試作した。敵を壁抜け状態にし、壁越しに敵の存在を表示する専用 shader を使う——将来の「場景型魔法」の基礎表現として。

FIG.03 — camera shader による空間演出

MY FIRST VROID MODEL

はじめての VRoid モデリング

私は美術畑ではないけれど、主人公を既製モデルではなく、自分の思考と表現を宿したものにしたかった。

そこで初めて VRoid Studio を使い、髪の毛の分け方から描き始め、主人公のテクスチャ作成にも挑戦した。髪型のレイヤー分けは、実は角色設計の構造そのもの——どこにリズムを置き、どこを締め、どこで個性を出すか。私にとってそれも「打撃感とリズム」の一部で、ただ角色の体の上に描いているだけだった。

FIG.04 — 髪の分区を描く
FIG.05 — 顔テクスチャの作成
FIG.06 — はじめての完成モデル

A REUSABLE COMBAT SYSTEM

保守できる戦闘システムの設計

私は「強い角色」を硬く書くのではなく、「再利用できる Combo / Skill システムをどう作るか」から構想した。狙いは次のとおり。

  • Combo システムと入力判定を分離し、別の角色でも同じ入力ロジックを共有できる
  • スキル発動フローを ScriptableObject で保持し、後から書き直さずに動的に技を足せる
  • 敵の反応(硬直 / 被弾時の状態遷移)を独立した reaction system にして、打撃エフェクトや連撃の相互作用を入れやすくする
  • すべての打撃は animation / timing を差し替えるだけで角色間に流用できる

これらはいわば「戦闘の言語」の核。おかげで角色を書くたびに、文法を毎回書き直すのではなく、「文」を組み合わせて違う戦闘スタイルを作れるようになった。

実装中は、状態ごとのパラメータを Inspector に出して調整できるよう設計した。値を見ながら触れるので、開発中の手戻りが減り、保守もしやすい。

Attack.cs — excerpt
void Attack()
{
    // Input → fire the combo: lock movement, arm the ice-magic colliders,
    // swap to the "attacking" material, then let the Animator drive the swing.
    if (Input.GetKeyDown(AttackInput))
    {
        _movementControll.stopMove = true;
        MaterialChange(0);
        anim.SetTrigger("Attack");
    }

    // While the DashAttack state plays, glide toward the locked-on target
    // (or the nearest enemy) with a tween instead of physics.
    if (anim.GetCurrentAnimatorStateInfo(1).IsName("DashAttack") && !StopDashAttack)
    {
        if (_camControll.lockOn)
            transform.DOMove(Target, DashAttackTime);
        else
            transform.DOMove(transform.position + transform.forward * DashAttackRange,
                             DashAttackTime);
    }
}
入力で連撃を発火し、DashAttack 中はトゥイーンでターゲットへ滑り込む(全文ではなく要点の抜粋)。
FIG.07 — Inspector で調整する戦闘パラメータ

CLOSING

結語 — 完成品ではなく、感覚をつかむ練習

このデモを完成したゲームにするつもりはない。でも、ここから角色の動作・スキル設計・画面のリズムを「掌握する力」を育てたい。

打撃感はエフェクトと音の足し算ではなく、入力のリズム・敵の反応・動作の切り替え・視覚の回饋から少しずつ組み上げるもの。これが今の私の「戦闘システム」理解であり、はじめて自分のロジックとスタイルで作ったアクション開発作品でもある。