Unityでアクションゲーム等を作っていると、たまにキャラクターが歩いた時の足音を実装したくなる時があります。実はこれは割と簡単に実装できるのですが、やり方によってはキャラクターの歩行アニメーションと足音を合わせるのが面倒くさくなってしまうこともあります。
そこでここではキャラクターのアニメーションに合わせて足音が鳴るようにする方法を2通りご紹介しますね。
足音を実装するための2通りの方法
では早速ですが足音を実装するための2通りの方法は次のとおりです。
- アニメーションイベントを使う方法(2D/3Dのどちらでも可)
- Raycastを使う方法(主に3D用)
それぞれ詳しく見ていきましょう。
やり方1:アニメーションイベントを使う方法
まず一つ目のやり方はアニメーションイベントを使う方法です。
アニメーションイベントとは、アニメーションの特定のタイミングでC#スクリプトの関数を呼び出せる機能のことです。キャラクターの足が地面につくタイミングにこのイベントを仕込んでおき、アニメーションが再生された時に音が鳴るようにする…というのがこの方法のロジックになります。こちらは2D/3Dのどちらでも使える方法です。
では実装の作業手順を見ていきましょう。主な作業は次のとおり。
- 足音を鳴らすためのC#スクリプトを書く
- 手順1のスクリプトをAnimatorと同じゲームオブジェクトにアタッチする
- アニメーションクリップにアニメーションイベントを追加する
手順1:足音を鳴らすためのC#スクリプトを書く
まずは足音を鳴らすためのC#スクリプトを書きます。これは好きなように書いて頂いてOKですが、サンプルとして下のようなスクリプトを提示しておきます。
using UnityEngine; public class AnimationEventFootstep : MonoBehaviour { [SerializeField] AudioSource audioSource; [SerializeField] AudioClip footstepSound; public void PlayFootstepSound() { audioSource.PlayOneShot(footstepSound); } }
手順2:C#スクリプトをAnimatorと同じゲームオブジェクトにアタッチする
次に、今書いたC#スクリプトをキャラクターのAnimatorがあるのと同じゲームオブジェクトにアタッチします。例えば下のような感じですね。
あと、先ほどのスクリプトでは音を鳴らすのにAudioSourceが必要になっているので、ついでにそれもアタッチしておきましょう。
手順3:アニメーションクリップにアニメーションイベントを追加する
では最後にアニメーションクリップにアニメーションインベントを追加して先ほどのスクリプトの関数を呼び出せるようにします。
アニメーション編集ウィンドウを開き、足音を設定する対象のアニメーションを選んだらプレビューでキャラクターの足が地面につくタイミングを確認してアニメーションイベントを追加します。
そして追加したアニメーションイベントをクリックするとインスペクターにドロップダウンが表示されるので、先ほどのC#スクリプトの場合であれば「PlayFootstepSound」関数を指定します。
これでキャラクターの動きに合わせて足音が鳴るようになります。
なお、アニメーションファイルが3Dゲームによく使われるFBX形式のファイルの場合、編集がロックされていてアニメーションイベントが追加できないことがあります。そのようなときはFBXファイルの中のアニメーションクリップだけを複製すると複製したクリップは編集できるようになるので覚えておきましょう。
やり方2:Raycastを使う方法
次に二つ目のやり方はRaycastを使う方法です。
Raycastとは透明な光線のようなものを指定した方向に発射し、その先にある当たり判定を検知する機能です。詳しい話は下記の記事でご説明しているのでここでは割愛しますが…
これを使えばキャラクターの足が地面に接地したかどうかを判定できるので、足音の実装にも使うことができます。
こちらは3D限定のやり方ですが、Raycastを使うと足がどのゲームオブジェクトに当たったかまで知ることができるので、少し工夫すれば地面の種類に応じて足音を変えるなんてこともできます(※今回はそこまでは説明しません)。
では主な作業手順を見ていきましょう。
- 足音を鳴らすためのC#スクリプトを書く
- C#スクリプトの設定を行う
手順1:足音を鳴らすためのC#スクリプトを書く
まず足音を鳴らすためのC#スクリプトを書きます。サンプルは次のとおり。
using System.Collections; using UnityEngine; public class RaycastFootstep : MonoBehaviour { [SerializeField] AudioSource audioSource; [SerializeField] AudioClip footstepSound; [SerializeField] Transform footTransform; [SerializeField] float raycastDistance = 0.1f; [SerializeField] LayerMask groundLayers = 0; [SerializeField] float minFootstepInterval = 0.5f; bool timerIsActive = false; WaitForSeconds footstepWait; void Start() { footstepWait = new WaitForSeconds(minFootstepInterval); } void Update() { CheckGroundStatus(); } void CheckGroundStatus() { if (timerIsActive) { return; } bool isGrounded = Physics.Raycast(footTransform.position, Vector3.down, raycastDistance, groundLayers, QueryTriggerInteraction.Ignore); if (isGrounded) { PlayFootstepSound(); } StartCoroutine(nameof(FootstepTimer)); } void PlayFootstepSound() { audioSource.PlayOneShot(footstepSound); } IEnumerator FootstepTimer() { timerIsActive = true; yield return footstepWait; timerIsActive = false; } }
手順2:C#スクリプトの設定を行う
C#スクリプトを書けたら、(サンプルの場合は)キャラクターの適当なところにこれを2つアタッチしてそれぞれ設定を行います。
- Foot Transform:足のボーンのトランスフォーム
- Raycast Distance:Raycastの距離
- Ground Layers:地面のレイヤー
- Min Footstep Interval:足音の間隔の最小値。これを設定しないと足音が連続でなってしまう場合がある
これでキャラクターの動きに合わせて足音が鳴るようになります。
おわりに
以上、キャラクターが歩いた時の足音を実装する方法を2通りご紹介しました。
細かい部分ではありますが足音がつくとゲームの感触が一味違ってくると思いますので、ぜひ上記の内容を参考にしていただき実装にチャレンジしていただければと思います。
この記事がUnityでのゲーム開発のお役に立てば幸いです。