効果音のスクリプト作成

Tutorial

Beginner

+10XP

45 mins

Unity Technologies

効果音のスクリプト作成

Unity エディターは、C# プログラミング言語で書かれたスクリプトを扱うためのツールを提供します。ゲームオブジェクトにカスタムのスクリプトコンポーネントを簡単に組み込んで取り付けることができ、その機能を自在にカスタマイズして制御することができます。

本チュートリアルでは、基本的な C# コマンドを使ったスクリプトで、シーンのオーディオ効果音をトリガーしたり制御したり、条件文やランダム化の要素を取り入れたりして、特定のオーディオプロパティをカスタマイズする方法を学習します。

C# スクリプトを使用して、ゲームオブジェクトやサウンド機能をトリガーしたりカスタマイズする方法を学びます。

  • キャラクターコントローラーがキューブ状の弾丸を発射するスクリプトを作成する
  • 弾丸を撃つときに鳴る効果音のスクリプトを作成する
  • ブロックにぶつかったときに、ぶつかった音を鳴らすスクリプトの作成
  • ランダム性を取り入れることで、ピッチのばらつきのスクリプトを作成する
  • ブロックを叩く強さに応じて、異なるサウンドクリップを再生する条件文のスクリプトを作成する

チュートリアルが終わる頃には、オーディオを使ったスクリプトの仕組みと、カスタマイズしたオーディオイベントの作成がいかに簡単かをしっかり理解していただけると思います。

Resources

1. 始めよう

1. Unity Hub から Universal Render Pipeline (URP) Project テンプレートを使用して新規プロジェクトを作成します。

2. このプロジェクトのサンプルアセットをインストールするには、まず上記の Tutorial Materials タブにある Unity Package ファイルをダウンロードします。SoundFX_Scripting_Tutorial.unitypackage という名前の .unitypackage ファイルをダブルクリックし、その中身を Project にインポートします。

First Person Controller と SmashBoxes プレハブを含むサンプルシーンで提供されるサンプルのアセットを使ってデモを行います。キャラクターコントローラーは、キューブ状の弾を発射し、積み重なったブロックを倒すことができます。ゲームオブジェクトには、コードでトリガーされるオーディオ効果音が含まれます。

プログラム言語 C# を使ったスクリプトを、外部のコードエディターを使って簡単に実現します。コードエディターとは、開発者がコードを書くのを支援するために特別に設計されたソフトウェアプログラムです。サードパーティ製のコードエディターは数多くありますが、このチュートリアルでは、Unity Hub から Mac または Windows オペレーティングシステムに Unity をインストールした際にデフォルトで含まれている Visual Studio Code 統合開発環境 (IDE) を使用することになります。

3. Unity でデフォルトのコードエディターが機能していることを確認するには、上部メニューのドロップダウンから Unity > Preferences と選択し、左側のメニューから External Tools を選択して、External Script Editor が表示されていることを確認します。

4. Visual Studio のコードエディター、またはお使いのマシンでお好みのコードエディターを開き、正しくインストールされ、実行されていることを確認します。

5. Scenes フォルダーにある Sound_Effects_Scripting_Scene という名前のサンプルシーンを開きます。

サンプルシーンでは、Launch_Origin というゲームオブジェクトから投射されるようにキャラクターコントローラーが設定されています。Hierarchy ウィンドウで、FPSController ゲームオブジェクトを展開します。次に、FirstPersonCharacter ゲームオブジェクトを展開し、Launch_Origin を表示します。

6. Launch_Origin ゲームオブジェクトに Audio Source コンポーネントを追加します。Inspector で Add Component ボタンを選択し、検索フィールドに audio と入力し、Audio Source を選択します。このコンポーネントには、後でコードを使ってアクセスします。

2. Character Controller で投射物を飛ばすスクリプトを作成する

これで準備が整ったので、コードを書く準備ができました。まず、C# スクリプトを作成し、Visual Studio のコードエディターで編集します。

1. Project ウィンドウの左上にある + ボタンを選択するか、Project ウィンドウのフォルダー内で右クリックし、Create > C# Script と選択して、Scripts フォルダー内に新規 C# スクリプトを作成します。

2. Project ウィンドウで C# スクリプトの名前を「LaunchProjectile」に変更します。

3. Project ウィンドウの LaunchProjectile.cs スクリプトをダブルクリックして、Visual Studio コードエディターで開いてください。

4. Class の開き波括弧の下の 7 行目から、Enter/Return キーを押して新しい行にコードを書き始めてください。GameObject 型のパブリック変数を定義して、projectile と名付けます。次の行では、float 型のパブリック変数をもう一つ定義して、launchVelocity と呼ぶことにしましょう。この変数には、2000 という値を代入します。次のように表示されるようにコードを入力します:

public GameObject projectile;
public float launchVelocity = 2000f; 

なお、float 変数の数値の後に f を付けるのは、Unity を扱う際の構文上の必要条件です。これは単に、C# のデフォルトの浮動小数点型である double と混同することなく、浮動小数点数値型の値を float として維持するためのものです。

もちろん、スクリプトにロジックを持たせますが、この時点でスクリプトを保存し、Scene のゲームオブジェクトにアタッチして、スクリプトの構造を理解できるようにしましょう。

5. コードエディターで作成したスクリプトを保存するには、上部メニューのドロップダウンから File > Save と選択するか、キーボードショートカットの Cmd+S (Mac)、または Ctrl+S (Windows) を使用します。

6. Unity エディターに戻ります。Project ウィンドウで LaunchProjectile.cs スクリプトを選択し、ドラッグして Hierarchy ウィンドウの Launch_Origin ゲームオブジェクトにアタッチします。

スクリプトのパブリック変数フィールドは、Inspector ウィンドウに表示されるスクリプトコンポーネント内で見ることができます。その値は Unity エディターから変更することができます。値を隠したい場合は、C# スクリプトで変数の割り当てを public から private に変更するだけです。

7. C# スクリプトの Projectile フィールドに projectile_cube を割り当てるには、まず Project ウィンドウの Prefabs フォルダから projectile_cube Prefab を選択し、Inspector の LaunchProjectile (Script) Projectile フィールドにドラッグアンドドロップします。

ここで、このスクリプトにロジックを与えてみます。

8. コードエディターで開いたままの C# スクリプトに戻ります。Update メソッド内の、開始波括弧の後の行に、マウスボタンが押されたかどうかを検出する条件文を作成しましょう。次のコードを入力してください:

// Update is called once per frame
void Update()
   {
         if (Input.GetButtonDown("Fire1"))
       {

9. UnityEngine.Input API で Fire1 コマンドが確立されています。Fire1 はマウスの左ボタンに対応します。マシンの特定の入力制御によっては、Fire1 コマンドはキーボードの左 Control キー、またはジョイスティックボタン 0 に対応する場合もあります。この特定の入力を確認したり、他の入力コマンドを参照したりするには、Unity エディターの上部メニュードロップダウンから Edit > Project Settings と選択し、左側の列から Input Manager を選択します。Positive Button、または Alt Positive Button のフィールドでマウスの左ボタンがアクティブになっていることを確認します。

10. コードエディターで C# スクリプトを開いた状態で、いくつかのロジックのスクリプトを作成します。条件付き if 文の中括弧の中に、次のコードを記述します。

if (Input.GetButtonDown("Fire1"))
  {
    GameObject LaunchCube = Instantiate(projectile, 
    transform.position, transform.rotation) as GameObject;
    
    LaunchCube.GetComponent<Rigidbody>().AddRelativeForce(new Vector3(0, 0, 
    launchVelocity));
  }

11. C# スクリプトを保存します。Unity エディターに戻り、Play モードに入りゲームをテストします。Play モード中にマウスの左ボタンか Fire1 入力ボタンを有効にして投射物を正常に起動させます。

3. 投射物の効果音のスクリプト作成

Launch_Origin ゲームオブジェクトをトリガーにして、投射物が発射されるたびに効果音を鳴らすようにしましょう。

1. さらに 2 つのクラス変数を作成します。AudioSource 型の private 変数を宣言し、source と名付けます。次に、AudioClip 型の public 変数をもう一つ宣言し、launchSoundと名付けます。開始の中括弧内で、LaunchProjectile.cs スクリプトに以下のコードを追加して、AudioSource コンポーネントを初期化します。

public class LaunchProjectile : MonoBehaviour
{
   public GameObject projectile;
   public float launchVelocity = 2000f;
   private AudioSource source;
   public AudioClip launchSound;

   // Start is called before the first frame update
   void Start()
      {
         source = GetComponent<AudioSource>();
      }

2. if 文の中に新しい行を追加します。PlayOneShot() メソッドのスクリプトを書き、オーディオクリップを再生します。launchSound 変数と再生音量の 2 つの引数を渡します。

if (Input.GetButtonDown("Fire1"))
   {
      source.PlayOneShot(launchSound, 1.0f);
      GameObject LaunchCube = Instantiate(projectile, transform.position,       
      transform.rotation) as GameObject;
      
      LaunchCube.GetComponent<Rigidbody>().AddRelativeForce(new Vector3
      (0, 0, launchVelocity));
   }

3. コードエディターで作成したスクリプトを保存するには、上部メニューのドロップダウンから File > Save と選択するか、キーボードショートカットの Cmd+S (Mac)、または Ctrl+S (Windows) を使用します。

4. Unity エディターに切り替えます。Hierarchy ウィンドウで Launch_Origin ゲームオブジェクトを選択した状態で、Launch Projectile (Script) コンポーネントにオーディオクリップを割り当てます。 Project ウィンドウで SoundFX フォルダー内のオーディオクリップを選択し、Inspector で新しく作成した public 変数 Launch Sound フィールドにドラッグアンドドロップします。

5. プレイモードに入り、ゲームをテストします。プレイモード中にマウスの左ボタンを押すか、Fire1 入力ボタンを押すと、投射物が発射されます。投射物が発射されるたびに効果音が鳴るはずです。

4. 音量にランダム性を持たせるスクリプティング

効果音の音量は、投射物が発射されるたびに 1.0 で再生されるように設定されています。スクリプトにランダム性を持たせて、サウンドクリップがランダムな音量で再生されるようにしましょう。

1. さらに 2 つのクラス変数を作成します。float 型の public 変数を 2 つ宣言し、lowVolRange と highVolRange と名付けます。次に、それらの値を 0.5 から 1.0 の間に設定します。この範囲は、後で Unity エディターからいつでも調整することができます。

public class LaunchProjectile : MonoBehaviour
{

  public GameObject projectile;
  public float launchVelocity = 2000f;

  private AudioSource source;
  public AudioClip launchSound;

  public float lowVolRange = 0.5f;
  public float highVolRange = 1.0f;

2. if 文の中で、float 型のローカル変数を宣言し、名前を vol とします。 Random.Range() メソッドを呼び出し、引数に lowVolRange と highVolRange を渡します。次の行の PlayOneShot() メソッドを修正し、第 2 引数の 1.0f をローカル変数 (vol) に置き換えます。

void Update()
 {
     if (Input.GetButtonDown("Fire1"))
       {
       float vol = Random.Range(lowVolRange, highVolRange);
       source.PlayOneShot(launchSound, vol);
     
       GameObject LaunchCube = Instantiate(projectile, 
       transform.position, transform.rotation) as GameObject;

       LaunchCube.GetComponent<Rigidbody>().AddRelativeForce(new 
       Vector3(0, 0, launchVelocity));
       }

3. スクリプトを保存し、Unity エディターに戻り、プレイモードに入り、ゲームをテストします。プレイモードでマウスの左ボタンまたは Fire1 入力ボタンを有効にして、投射物を発射します。音量がランダムに変化するのがわかると思います。

完成したスクリプトは、以下のようにコード化されます:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LaunchProjectile : MonoBehaviour
{

   public GameObject projectile;
   public float launchVelocity = 2000f;
   private AudioSource source;
   public AudioClip launchSound;
   public float lowVolRange = 0.5f;
   public float highVolRange = 1.0f;


   void Start()
   {
         source = GetComponent<AudioSource>();
   }

void Update()
   {
         if (Input.GetButtonDown("Fire1"))
    {
         float vol = Random.Range(lowVolRange, highVolRange);
         source.PlayOneShot(launchSound, vol);
       
         GameObject LaunchCube = Instantiate(projectile, 
         transform.position, transform.rotation) as GameObject;

          LaunchCube.GetComponent<Rigidbody>().AddRelativeForce(new 
          Vector3(0, 0, launchVelocity));
    }
  }
}

5. クラッシュ音のスクリプト作成

箱がぶつかった時のクラッシュ音を設定しましょう。

1. Hierarchy ウィンドウで SmashBoxes ゲームオブジェクトプレハブを展開し、一番上の Cube ゲームオブジェクトを Shift キーを押しながら選択し、次に一番下の Platform ゲームオブジェクトまで全て選択してください。これらはすべて青い色で選択されているはずです。次に、Insoector の Add Component ボタンを選択し、検索フィールドに audio と入力し、Audio Source を選択します。

2. Project ウィンドウの左上にある + ボタンを選択するか、Project ウィンドウのフォルダー内で右クリックし、Scripts フォルダー内に新規 C# スクリプト (Create > C# Script と選択) を作成し、「CrashSound」という名前に変更します。

3. Hierarchy ウィンドウで、SmashBoxes プレハブゲームオブジェクトを含むものを選択した状態で、Inspector の Add Component ボタンを選択し、検索フィールドに crash と入力し、Crash Sound を選択します。

4. Project ウィンドウで、新しく作成した CrashSound C# スクリプトをダブルクリックして、コードエディターで開いてください。先ほどと同じように、2 つのクラス変数を宣言します。Start() メソッドの中括弧の中で、Audio Source コンポーネントをアクティブにします。

public class CrashSound : MonoBehaviour
{
   private AudioSource source;
   
   public AudioClip crashSound;
   
// Start is called before the first frame update

void Start()
   {
      source = GetComponent<AudioSource>(); 
   }

5. このスクリプトでは、Update() メソッドは必要ありません。削除してください。代わりに、OnCollisionEnter() メソッドを使って、ゲームオブジェクトに衝突したときに効果音を鳴らすようにします。OnCollisionEnter メソッド内で、PlayOneShot メソッドを呼び出し、crashSound と音量レベルの引数を渡します。

public class CrashSound : MonoBehaviour
{

   private AudioSource source;
   public AudioClip crashSound;

void Start()
   {
      source = GetComponent<AudioSource>(); 
   }

void OnCollisionEnter (Collision collide)
   {
      source.PlayOneShot(crashSound, 1.0f);
   }
}

6. スクリプトを保存し、Unity エディターに戻ります。Hierarchy ウィンドウで、含まれている SmashBoxes プレハブゲームオブジェクトを選択した状態で、オーディオクリップを Crash Sound(Script)コンポーネントに割り当てます。まず、Project ウィンドウで SoundFX フォルダー内のオーディオクリップを選択し、Inspector で新しく作成した public 変数 Crash Sound フィールドにドラッグアンドドロップします。

7. プレイモードに入り、ゲームをテストします。SmashBox に向けて投射物を発射してください。ぶつかると効果音が鳴るはずです。

6. 条件付きロジックのスクリプトによる複雑性の追加

1. 先ほどと同様に、オーディオクリップにランダム性を持たせることができます。音量レベルをランダムにする代わりに、サウンドクリップのピッチを変化させて再生してみましょう。float 型のクラス変数を 2 つ作成し、lowPitchRange と highPitchRange という名前にします。0.75〜1.25 の範囲で割り当ててください。この範囲は、後で Unity エディターでいつでも調整できます。OnCollisionEnter メソッド内に、ピッチの変化をランダムにするための行を追加します。

public class CrashSound : MonoBehaviour
{

   private AudioSource source;
   public AudioClip crashSound;
   public float lowPitchRange = 0.75f;
   public float highPitchRange = 1.25f;

   void Start()
      {
         source = GetComponent<AudioSource>(); 
      }

   void OnCollisionEnter (Collision collide)
      {
         source.PlayOneShot(crashSound, 1.0f);
         source.pitch = Random.Range(lowPitchRange, 
         highPitchRange);
      }
}

投射物の衝突速度に応じて、2 つの別々のサウンドクリップをトリガーする機能を、スクリプトで追加してみましょう。さらに、投射物が箱にぶつかる強さに比例して、クリップの音量を設定します。

public AudioClip crashSound を 1 つ使う代わりに、2 つの効果音を表す別々のクラス変数を定義します。

2. 単一の public AudioClip crashSound 変数を削除します。

3. AudioClip 型の public 変数を 2 つ新規に作成し、soundVariant1 と soundVariant2 というラベルを付けます。float 型の public 変数を 2 つ作成し、influenceOfMagnitude と velocityLimit という名前を付けます。それらの値を .01f と 15f に設定します。

4. 新しく作成した効果音のバリアントを使用するために source.PlayOneShot メソッドを呼び出すのでコードを修正する必要があります。source.PlayOneShot(crashSound, 1.0f); という行を削除します。この行は、条件付き if 文の中に再び追加します。

5. OnCollisionEnter メソッド内で、hitVol という名前の新しいローカル変数のスクリプトを作成し、衝突の大きさに influenceOfMagnitude を掛けたものに等しくなるように設定します。次に、条件文をスクリプトで記述します。衝突の大きさが velocityLimit より小さい場合は、PlayOneShot メソッドを起動して soundVariant1 クリップを再生し、soundVariant1 と hitVol を引数に渡します。その他、PlayOneShot メソッドを起動し、引数として soundVariant2 clip と hitVol を渡します。完成したスクリプトは、以下のようにコード化されます:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class CrashSound : MonoBehaviour
{

   private AudioSource source;
   public AudioClip soundVariant1;
   public AudioClip soundVariant2;
   public float lowPitchRange = 0.75f;
   public float highPitchRange = 1.25f;
   public float influenceOfMagnitude = .01f;
   public float velocityLimit = 15f;
   
void Start()
   {
      source = GetComponent<AudioSource>(); 
   }
   
void OnCollisionEnter (Collision collide)
   {
      source.pitch = Random.Range(lowPitchRange, highPitchRange);
      float hitVol = collide.relativeVelocity.magnitude *    
      influenceOfMagnitude;
      
      if (collide.relativeVelocity.magnitude < velocityLimit)
         source.PlayOneShot(soundVariant1, hitVol);
      else
         source.PlayOneShot(soundVariant2, hitVol);
   }
}

3. スクリプトを保存して、Unity エディターに戻ります。オーディオクリップを soundVariant1 と soundVariant2 の両フィールドに追加し、Playモードでゲームをテストします。

7. 次のステップ

練習を重ねれば、C# のスクリプトを使ったオーディオやゲームデザインで、さまざまな付加機能を実現することができます。独自のスクリプトを作成し、シーン内のゲームオブジェクトにアタッチして試してみましょう。また、変数を追加で作成し、様々なメソッドの引数に渡して活用する練習をします。さまざまなオーディオクリップが環境とどのように相互作用するかをトリガーし、ランダム性や分散性の要素で再生される可能性を調整します。自信を持ってスクリプトを作成してください。

Complete this Tutorial