【Unity】3D GameKite Liteのコンボ攻撃アニメーションを変更する

 今回のテーマは、「3D GameKite Liteのコンボ攻撃アニメーションを変更する」です。

あまり需要はないかもしれませんがやってみると意外と難しかったので、備忘録がてら記事として残しておきます。
今回は、4コンボのエレンのアニメーションをすべて変更して、さらに7コンボ攻撃ができるように変更しています。

目次

変更するアニメーションを用意する

変更する攻撃アニメーションは何でも良いです。有料でも無料でも好きなものを用意してください。

 この記事で利用しているアニメーションは有料アセットの「Powerful Sword Pack(Great Sword + Katana)」の7コンボアニメーションを利用します。かっこよくておすすめです!

注意

この記事では、以前の記事で作成した「3D GameKit LiteのキャラをMMD(VRM)から変換したキャラに置き換える方法」で置き換えた状態で紹介していますが、この記事を参考にする上でキャラの変更は必要ありません。

興味のあるかたはあわせて確認してみてください。

Ellenのコンボアニメーションの構成の確認

Ellenのコンボアニメーションは4つのアニメーションから構成されています。EllenのAnimationコントローラーを選択し、Animatiorタブから「MeleeCombatSM」をダブルクリックすることで確認できます。

 攻撃を実行するたびに、Parameterの「MeleeAttack」トリガーが実行され、StateTime間に再度攻撃することで次のコンボアニメーションに推移します。

また、各アニメーションには、「EllenSttafEffect」のスクリプトが設定されています。このスクリプトは、スタッフの表示のオンオフや攻撃時の音の出力を実行しています。

※引数で攻撃時のエフェクトの設定がありますが今回このエフェクトについては触れません。

攻撃アニメーションのイベントの確認

エレンの攻撃アニメーションにはイベントが設定されています。

「Assets>3DGamekitLite>Art>Animations>AnimationClips>Characters>Ellen」からアニメーションファイル「@EllenCombo1」を展開してアニメーションファイルをクリックすると「Animation」タブでそのパラメータを確認することができるのですが、そのままだとReadOnlyになっておりイベントのInspectorの中身を確認することができません。

これは、アニメーションファイルをクリックしてCtrl+Dで複製することによってReadOnlyを解除して中身を確認することができます。

解除後のイベントの中身は消えてしまいますが、元は以下のようにFunctionが設定されています。

アニメーションの入れ替えと追加

 ここまでで確認した構成を意識しつつのアニメーションを入れ替え、関連するスクリプトの修正を行います。

アニメーション推移の設定

 まず、アニメーションを変更します。Animatorタブから「MeleeCombatSM」へ移動し、コンボアニメーションを選択し削除します。

 変更したいアニメーションをドラッグアンドドロップで、Animatorタブに追加して、推移をコンボの順とExitの方向へ伸ばします。

推移条件の設定

コンボアニメーションごとの推移条件を設定します。

  • HasExitTimeのチェックを外します。
  • ConditionsにMeleeAttackを追加します。
  • StateTime /Greater / コンボの開始時間
  • StateTime/Less / コンボの終了時間

スクリプトの追加

また、各アニメーションにはAdd BehaviourからEllenStaffEffectを追加しておきます。
対応するEffectは今回用意しないので、仮に0を設定しておきます。

アニメーションイベントの設定

 変更するアニメーションに対して、元々Ellenコンボのアニメーションに設定されていた「MeleeAttackStart」と「MeleeAttackEnd」のイベント設定を行います。

 AnimationタブとSceneを同時に開いて、HierarchyのEllenを選択し、AnimationタブのPreview機能でアニメーションを再生しながら、攻撃判定の開始したいタイミングと終了したいタイミングにそれぞれ「MeleeAttackStart」と「MeleeAttackEnd」のイベントを追加します。

 イベントの追加は、追加したい箇所でイベント行の部分をクリックすることでイベントほ白いバーを追加できます。

「MeleeAttackStart」のイベントを選択してインスペクターからFunctionに「MeleeAtttackStart」を設定します。
Intに1を設定します。

「MeleeAttackEnd」のイベントを選択してインスペクターからFunctionに「MeleeAtttackEnd」を設定します。

これらすべてのコンボアニメーションに適用します。

アニメーション変更に伴うスクリプトの修正

 スクリプト内には、直接アニメーションの名称を記述されている箇所があるので、それらの修正とコンボを追加したことによるその変更・追加が必要です。

 PlayerController.csを開いて以下の箇所を修正します。

Stateのアニメーション名の追加、変更

94行目あたり

        readonly int m_HashEllenCombo1 = Animator.StringToHash("EllenCombo1");
        readonly int m_HashEllenCombo2 = Animator.StringToHash("EllenCombo2");
        readonly int m_HashEllenCombo3 = Animator.StringToHash("EllenCombo3");
        readonly int m_HashEllenCombo4 = Animator.StringToHash("EllenCombo4");
        readonly int m_HashEllenCombo1 = Animator.StringToHash("Attack_7Combo_1");
        readonly int m_HashEllenCombo2 = Animator.StringToHash("Attack_7Combo_2");
        readonly int m_HashEllenCombo3 = Animator.StringToHash("Attack_7Combo_3");
        readonly int m_HashEllenCombo4 = Animator.StringToHash("Attack_7Combo_4");
        readonly int m_HashEllenCombo5 = Animator.StringToHash("Attack_7Combo_5");
        readonly int m_HashEllenCombo6 = Animator.StringToHash("Attack_7Combo_6");
        readonly int m_HashEllenCombo7 = Animator.StringToHash("Attack_7Combo_7");

武器の表示に関する箇所(IsWeaponEquiped)の追加・変更

231行目あたり

bool equipped = m_NextStateInfo.shortNameHash == m_HashEllenCombo1 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo1;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo2 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo2;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo3 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo3;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo4 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo4;
        bool IsWeaponEquiped()
        {
            bool equipped = m_NextStateInfo.shortNameHash == m_HashEllenCombo1 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo1;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo2 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo2;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo3 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo3;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo4 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo4;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo5 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo5;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo6 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo6;
            equipped |= m_NextStateInfo.shortNameHash == m_HashEllenCombo7 || m_CurrentStateInfo.shortNameHash == m_HashEllenCombo7;


            return equipped;
        }

攻撃時のAudio再生箇所の変更

463行目あたり

if (m_CurrentStateInfo.shortNameHash == m_HashEllenCombo1 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo1 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo2 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo2 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo3 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo3 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo4 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo4)
            {
                emoteAttackPlayer.PlayRandomClip();
            }
            if (m_CurrentStateInfo.shortNameHash == m_HashEllenCombo1 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo1 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo2 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo2 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo3 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo3 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo4 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo4 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo5 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo5 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo6 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo6 ||
                m_CurrentStateInfo.shortNameHash == m_HashEllenCombo7 && m_PreviousCurrentStateInfo.shortNameHash != m_HashEllenCombo7)
            {
                emoteAttackPlayer.PlayRandomClip();
            }

これで設定が完了しました。再生して動作を確認してみましょう。

エフェクトの課題は残りますが、無事アニメーションを切り替えることができました!
当たり判定もしっかり機能しています。

まとめ

 今回「3D Kite Liteアセットのコンボ攻撃アニメーションを変更する」方法を紹介しました。

  • 変更するアニメーションの用意
  • エレンのコンボアニメーションの構成確認
  • 攻撃アニメーションのイベントの確認
  • アニメーションの入れ替えと追加
  • アニメーションイベントの設定
  • アニメーション変更に伴うスクリプトの修正

 エレンのアニメーションを変更する上で、コンボアニメーション設定をする際の、推移条件の設定やアニメーションのイベント設定などが学べ、また3D GameKiteではどのようにして攻撃時に武器の出し入れをしているのかをなんとなく理解できたのではないかなと思います。

 今回は触れませんでしたが、エフェクトなどもアニメーションにあわせて変更できたら面白いと思うのでまた記事にシたいと思います。


 今回の記事が、皆さんの助けになると嬉しいです。
もしこの記事が気に入りましたら、ぜひテクリエイトへのブックマーク登録をして頂けると喜びます。
以上、おつかれさまでした!

© Unity Technologies Japan/UCL

モデル:©2016 cover corp. https://3d.nicovideo.jp/works/td74928

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次