Unity 3Dでのサウンドの再生と管理(サウンド完了イベント、編集モードでの再生)

小さくても便利なcsharpスクリプトがこの記事に添付され、使用方法が示されます。

スクリプトを記述した理由は、プロジェクトシーンを開始せずにサウンドエフェクトを設定およびテストする必要があるためです。 また、主要な再生イベントを追跡します。



このスクリプトはPlayModeとEditModeの両方で同じように機能し、次のことができます。

1.希望する遅延でサウンドを再生し、再生の開始を追跡します。

2.ループ再生の完了のすべての瞬間を含む、サウンドの終わりを追跡します。

3.サウンド再生の計画外の終了を追跡します。

4.イベントを使用して、再生中にパラメーターを追跡および変更します。



サウンドを再現するには、静的メソッドが使用されます。



public static SoundTrack PlaySound(AudioClip clip, float volume = 1, float pitch = 1, float loopTime = 0, float delayTime = 0); public static SoundTrack PlaySound(GameObject target, AudioClip clip, float volume = 1, float pitch = 1, float loopTime = 0, float delayTime = 0);
      
      





これらのメソッドは、SoundTrackクラスのインスタンスを返します。その後、このインスタンスに必要なイベントを添付できます。 最初のメソッドはシーンにGameObjectを作成し、2番目のメソッドはSoundTrackおよびAudioSourceコンポーネントを指定されたGameObjectに追加します。



ボリュームとピッチのパラメーターは、おそらくビューを必要としません。



loopTime-再生サイクルが続く時間を秒単位で設定するために使用できます。 値が0の場合、サウンドは一度だけ再生され、値はfloat.PositiveInfinityの場合、サウンドは無限に再生されます。

delayTimeは、サウンドを秒単位で再生するまでの遅延です。

注:

loopTimeの後、最初のメソッドはサウンド用に作成されたGameObjectを削除し、2番目のメソッドはサウンド用に作成されたコンポーネントのみを削除します。



したがって、ゲームでサウンドを再生するための最も単純なサンプルコードです。



 public AudioClip testSound; void Start () { SoundTrack.PlaySound (testSound); }
      
      





そして、エディターでサウンドを再生します。



 [MenuItem("MyMenu/TestSound #F1")] static void TestSound(){ AudioClip[] clips=Resources.FindObjectsOfTypeAll<AudioClip>(); if(clips==null||clips.Length==0){ Debug.LogError("No clips in the resources!"); return; } SoundTrack.PlaySound(clips[0]); }
      
      







これで、イベントに対処することができます。 ゲームモードではすべてが同じように機能するため、わかりやすくするために、すぐにエディターの例を取り上げる方が良いと思います。



この例は、SHIFT + F1キーの組み合わせによってトリガーされ、イベントの使用方法を示しています。



 using UnityEngine; using UnityEditor; using System.Collections; public class SoundTrackTest : Editor { [MenuItem("MyMenu/TestSound #F1")] static void TestSound(){ clips=Resources.FindObjectsOfTypeAll<AudioClip>(); Debug.Log("clips " + clips.Length); if(clips==null||clips.Length==0){ Debug.LogError("No clips in the resources!"); return; } rePlayCount = 0; StartNextSound (0); } static AudioClip[] clips; static int rePlayCount=0; static void StartNextSound(float timePosition){ SoundTrack track=SoundTrack.PlaySound(clips[Random.Range(0,clips.Length-1)]); rePlayCount++; //    track.start_action += soundStartEvent; //     track.processing += soundProcessEvent; //        //    ,    track.complete_action += soundCompleteEvent; //      track.destroy_action += soundDestroyEvent; if(timePosition>0){ //      ,   track.setTimePosition (timePosition); } } static void soundStartEvent(SoundTrack track){ Debug.Log("Sound Start event!"); } static void soundProcessEvent(SoundTrack track){ track.volume = track.playing_time % 1f; } static void soundCompleteEvent(SoundTrack track, float offset){ Debug.Log("Sound Complete event! "+offset); } static void soundDestroyEvent(SoundTrack track, bool atEndOfSound, float offset){ Debug.Log("Sound Destroy event! "+offset); //          // atEndOfSound   false          //          .. if(atEndOfSound){ //           // offset -      //     track.setTimePosition    //          //      ,      if(rePlayCount<4){ StartNextSound (offset); } } } }
      
      





サンプルを機能させるには、このスクリプトをEditorフォルダーに配置し、プロジェクトリソースに少なくとも1つのサウンドファイルを含める必要があります。 実行中のプロジェクトでテストが必要な場合は、単にTestSound関数からStart関数にコードを転送し、必要に応じて、すべてのプロパティとメソッドを非静的にすることができます。



 void Start(){ clips=Resources.FindObjectsOfTypeAll<AudioClip>(); Debug.Log("clips " + clips.Length); if(clips==null||clips.Length==0){ Debug.LogError("No clips in the resources!"); return; } rePlayCount = 0; StartNextSound (0); }
      
      





このイベントは、サウンド再生の開始時に直接トリガーされます。



 track.start_action += soundStartEvent; //   
      
      





つまり delayTime> 0の場合、サウンドの作成時ではなく、再生の開始時に機能します。



このイベントは多くの場合に役立ちます。



 track.processing += soundProcessEvent; //    
      
      





たとえば、音楽とエフェクトに異なるイベントを設定し、1つの変数を使用してゲーム内のすべての音楽の音量を制御し、もう1つの変数を使用してすべての効果を制御できます。 そして、ゲームにスローモーションエフェクトがある場合、エフェクトと音楽にもう1つのイベントを追加して、すでに再生速度を制御できます。

この例では、音によって毎秒音量が変わるはずです。



 track.complete_action += soundCompleteEvent; //    ,   
      
      





このイベントは、loopTimeがサウンドファイルの長さを超える場合に便利です。つまり、サウンドが周期的に再生されます。 この場合、イベントはサウンドが再び開始された瞬間にトリガーされます。 それ以外の場合、このイベントの呼び出しは保証されません。



 track.destroy_action += soundDestroyEvent; //     
      
      





このイベントは2つの場合にトリガーされます。 最初のケースは、loopTimeの後、または1回再生したときに、サウンドの再生が完了した場合です。 2番目のケース、これはシーンからサウンドを削除するスクリプトロジックとはまったく関係ありません(たとえば、シーン階層からオブジェクトを手動で削除する)。 atEndOfSoundパラメーターを使用して、1つのケースを別のケースと区別できます。falseの場合、これは2番目のケースにすぎません。



2番目のケースでは、GameObjectとサウンドコンポーネントにアクセスできなくなります。



たとえば、いくつかのメロディーを順番に再生して連続したサウンドを作成する必要がある場合は、soundDestroyEvent関数の例に示されているようにこれを実行できます。



さらに、スクリプトには必要なパラメーターがあります。





すべての時間はTime.realtimeSinceStartupを基準にして計算されます



ここで 、スクリプト自体と上記の例をダウンロードできます。



例でショートカットが機能しない場合は、メニューにTestSound項目があります。



Unityがリソースでサウンドを見つけられない場合は、それを選択するだけです(オーディオファイルの設定を参照してください)。



All Articles