本方法是对Ez-Sound-Manager的扩展

https://github.com/JackM36/Eazy-Sound-Manager

参考Audio Toolkit Free Version

http://unity.clockstone.com/

SoundManager
   1 using System;
   2 using UnityEngine;
   3 using System.Collections.Generic;
   4 
   5 namespace ZStudio.SoundManager
   6 {
   7     public class SoundManager : MonoBehaviour
   8     {
   9         private static SoundManager _instance = null;
  10         private static float vol = 1f;
  11         private static float musicVol = 1f;
  12         private static float soundsVol = 1f;
  13         private static float UISoundsVol = 1f;
  14 
  15         private static Dictionary<int, Audio> musicAudio;
  16         private static Dictionary<int, Audio> soundsAudio;
  17         private static Dictionary<int, Audio> UISoundsAudio;
  18 
  19         private static bool initialized = false;
  20 
  21         private static SoundManager instance
  22         {
  23             get
  24             {
  25                 if (_instance == null)
  26                 {
  27                     _instance = (SoundManager)FindObjectOfType(typeof(SoundManager));
  28                     if (_instance == null)
  29                     {
  30                         // Create gameObject and add component
  31                         _instance = (new GameObject("ZSoundManager")).AddComponent<SoundManager>();
  32                     }
  33                 }
  34                 return _instance;
  35             }
  36         }
  37 
  38         /// <summary>
  39         /// The gameobject that the sound manager is attached to
  40         /// </summary>
  41         public static GameObject gameobject { get { return instance.gameObject; } }
  42 
  43         /// <summary>
  44         /// When set to true, new Audios that have the same audio clip as any other Audio, will be ignored
  45         /// </summary>
  46         public static bool ignoreDuplicateMusic { get; set; }
  47 
  48         /// <summary>
  49         /// When set to true, new Audios that have the same audio clip as any other Audio, will be ignored
  50         /// </summary>
  51         public static bool ignoreDuplicateSounds { get; set; }
  52 
  53         /// <summary>
  54         /// When set to true, new Audios that have the same audio clip as any other Audio, will be ignored
  55         /// </summary>
  56         public static bool ignoreDuplicateUISounds { get; set; }
  57 
  58         /// <summary>
  59         /// Global volume
  60         /// </summary>
  61         public static float globalVolume
  62         {
  63             get
  64             {
  65                 return vol;
  66             }
  67             set
  68             {
  69                 vol = value;
  70             }
  71         }
  72 
  73         /// <summary>
  74         /// Global music volume
  75         /// </summary>
  76         public static float globalMusicVolume
  77         {
  78             get
  79             {
  80                 return musicVol;
  81             }
  82             set
  83             {
  84                 musicVol = value;
  85             }
  86         }
  87 
  88         /// <summary>
  89         /// Global sounds volume
  90         /// </summary>
  91         public static float globalSoundsVolume
  92         {
  93             get
  94             {
  95                 return soundsVol;
  96             }
  97             set
  98             {
  99                 soundsVol = value;
 100             }
 101         }
 102 
 103         /// <summary>
 104         /// Global UI sounds volume
 105         /// </summary>
 106         public static float globalUISoundsVolume
 107         {
 108             get
 109             {
 110                 return UISoundsVol;
 111             }
 112             set
 113             {
 114                 UISoundsVol = value;
 115             }
 116         }
 117 
 118         void Awake()
 119         {
 120             instance.Init();
 121         }
 122 
 123         void Update()
 124         {
 125             List<int> keys;
 126 
 127             // Update music
 128             keys = new List<int>(musicAudio.Keys);
 129             for (var i = 0; i < keys.Count; i++)
 130             {
 131                 int key = keys[i];
 132                 Audio _audio = musicAudio[key];
 133                 _audio.Update();
 134 
 135                 // Remove all music clips that are not playing
 136                 if (!_audio.playing && !_audio.paused)
 137                 {
 138                     if (_audio.onComletelyPlayed != null)
 139                         _audio.onComletelyPlayed.Invoke(_audio);
 140                     Destroy(_audio.audioSource);
 141                     musicAudio.Remove(key);
 142                 }
 143             }
 144 
 145             // Update sound fx
 146             keys = new List<int>(soundsAudio.Keys);
 147             for (var i = 0; i < keys.Count; i++)
 148             {
 149                 int key = keys[i];
 150                 Audio _audio = soundsAudio[key];
 151                 _audio.Update();
 152 
 153                 // Remove all sound fx clips that are not playing
 154                 if (!_audio.playing && !_audio.paused)
 155                 {
 156                     if (_audio.onComletelyPlayed != null)
 157                         _audio.onComletelyPlayed.Invoke(_audio);
 158                     Destroy(_audio.audioSource);
 159                     soundsAudio.Remove(key);
 160                 }
 161             }
 162 
 163             // Update UI sound fx
 164             keys = new List<int>(UISoundsAudio.Keys);
 165             for (var i = 0; i < keys.Count; i++)
 166             {
 167                 int key = keys[i];
 168                 Audio _audio = UISoundsAudio[key];
 169                 _audio.Update();
 170 
 171                 // Remove all UI sound fx clips that are not playing
 172                 if (!_audio.playing && !_audio.paused)
 173                 {
 174                     if (_audio.onComletelyPlayed != null)
 175                         _audio.onComletelyPlayed.Invoke(_audio);
 176                     Destroy(_audio.audioSource);
 177                     UISoundsAudio.Remove(key);
 178                 }
 179             }
 180         }
 181 
 182         void Init()
 183         {
 184             if (!initialized)
 185             {
 186                 musicAudio = new Dictionary<int, Audio>();
 187                 soundsAudio = new Dictionary<int, Audio>();
 188                 UISoundsAudio = new Dictionary<int, Audio>();
 189 
 190                 ignoreDuplicateMusic = false;
 191                 ignoreDuplicateSounds = false;
 192                 ignoreDuplicateUISounds = false;
 193 
 194                 initialized = true;
 195                 DontDestroyOnLoad(this);
 196             }
 197         }
 198 
 199         #region GetAudio Functions
 200 
 201         /// <summary>
 202         /// Returns the Audio that has as its id the audioID if one is found, returns null if no such Audio is found
 203         /// </summary>
 204         /// <param name="audioID">The id of the Audio to be retrieved</param>
 205         /// <returns>Audio that has as its id the audioID, null if no such Audio is found</returns>
 206         public static Audio GetAudio(int audioID)
 207         {
 208             Audio audio;
 209 
 210             audio = GetMusicAudio(audioID);
 211             if (audio != null)
 212             {
 213                 return audio;
 214             }
 215 
 216             audio = GetSoundAudio(audioID);
 217             if (audio != null)
 218             {
 219                 return audio;
 220             }
 221 
 222             audio = GetUISoundAudio(audioID);
 223             if (audio != null)
 224             {
 225                 return audio;
 226             }
 227 
 228             return null;
 229         }
 230 
 231         /// <summary>
 232         /// Returns the first occurrence of Audio that plays the given audioClip. Returns null if no such Audio is found
 233         /// </summary>
 234         /// <param name="audioClip">The audio clip of the Audio to be retrieved</param>
 235         /// <returns>First occurrence of Audio that has as plays the audioClip, null if no such Audio is found</returns>
 236         public static Audio GetAudio(AudioClip audioClip)
 237         {
 238             Audio audio = GetMusicAudio(audioClip);
 239             if (audio != null)
 240             {
 241                 return audio;
 242             }
 243 
 244             audio = GetSoundAudio(audioClip);
 245             if (audio != null)
 246             {
 247                 return audio;
 248             }
 249 
 250             audio = GetUISoundAudio(audioClip);
 251             if (audio != null)
 252             {
 253                 return audio;
 254             }
 255 
 256             return null;
 257         }
 258 
 259         /// <summary>
 260         /// Returns the music Audio that has as its id the audioID if one is found, returns null if no such Audio is found
 261         /// </summary>
 262         /// <param name="audioID">The id of the music Audio to be returned</param>
 263         /// <returns>Music Audio that has as its id the audioID if one is found, null if no such Audio is found</returns>
 264         public static Audio GetMusicAudio(int audioID)
 265         {
 266             List<int> keys = new List<int>(musicAudio.Keys);
 267             foreach (int key in keys)
 268             {
 269                 if (audioID == key)
 270                 {
 271                     return musicAudio[key];
 272                 }
 273             }
 274 
 275             return null;
 276         }
 277 
 278         /// <summary>
 279         /// Returns the first occurrence of music Audio that plays the given audioClip. Returns null if no such Audio is found
 280         /// </summary>
 281         /// <param name="audioClip">The audio clip of the music Audio to be retrieved</param>
 282         /// <returns>First occurrence of music Audio that has as plays the audioClip, null if no such Audio is found</returns>
 283         public static Audio GetMusicAudio(AudioClip audioClip)
 284         {
 285             List<int> keys;
 286             keys = new List<int>(musicAudio.Keys);
 287             foreach (int key in keys)
 288             {
 289                 Audio audio = musicAudio[key];
 290                 if (audio.clip == audioClip)
 291                 {
 292                     return audio;
 293                 }
 294             }
 295 
 296             return null;
 297         }
 298 
 299         /// <summary>
 300         /// Returns the sound fx Audio that has as its id the audioID if one is found, returns null if no such Audio is found
 301         /// </summary>
 302         /// <param name="audioID">The id of the sound fx Audio to be returned</param>
 303         /// <returns>Sound fx Audio that has as its id the audioID if one is found, null if no such Audio is found</returns>
 304         public static Audio GetSoundAudio(int audioID)
 305         {
 306             List<int> keys = new List<int>(soundsAudio.Keys);
 307             foreach (int key in keys)
 308             {
 309                 if (audioID == key)
 310                 {
 311                     return soundsAudio[key];
 312                 }
 313             }
 314 
 315             return null;
 316         }
 317 
 318         /// <summary>
 319         /// Returns the first occurrence of sound Audio that plays the given audioClip. Returns null if no such Audio is found
 320         /// </summary>
 321         /// <param name="audioClip">The audio clip of the sound Audio to be retrieved</param>
 322         /// <returns>First occurrence of sound Audio that has as plays the audioClip, null if no such Audio is found</returns>
 323         public static Audio GetSoundAudio(AudioClip audioClip)
 324         {
 325             List<int> keys;
 326             keys = new List<int>(soundsAudio.Keys);
 327             foreach (int key in keys)
 328             {
 329                 Audio audio = soundsAudio[key];
 330                 if (audio.clip == audioClip)
 331                 {
 332                     return audio;
 333                 }
 334             }
 335 
 336             return null;
 337         }
 338 
 339         /// <summary>
 340         /// Returns the UI sound fx Audio that has as its id the audioID if one is found, returns null if no such Audio is found
 341         /// </summary>
 342         /// <param name="audioID">The id of the UI sound fx Audio to be returned</param>
 343         /// <returns>UI sound fx Audio that has as its id the audioID if one is found, null if no such Audio is found</returns>
 344         public static Audio GetUISoundAudio(int audioID)
 345         {
 346             List<int> keys = new List<int>(UISoundsAudio.Keys);
 347             foreach (int key in keys)
 348             {
 349                 if (audioID == key)
 350                 {
 351                     return UISoundsAudio[key];
 352                 }
 353             }
 354 
 355             return null;
 356         }
 357 
 358         /// <summary>
 359         /// Returns the first occurrence of UI sound Audio that plays the given audioClip. Returns null if no such Audio is found
 360         /// </summary>
 361         /// <param name="audioClip">The audio clip of the UI sound Audio to be retrieved</param>
 362         /// <returns>First occurrence of UI sound Audio that has as plays the audioClip, null if no such Audio is found</returns>
 363         public static Audio GetUISoundAudio(AudioClip audioClip)
 364         {
 365             List<int> keys;
 366             keys = new List<int>(UISoundsAudio.Keys);
 367             foreach (int key in keys)
 368             {
 369                 Audio audio = UISoundsAudio[key];
 370                 if (audio.clip == audioClip)
 371                 {
 372                     return audio;
 373                 }
 374             }
 375 
 376             return null;
 377         }
 378 
 379         #endregion
 380 
 381         #region Play Functions
 382 
 383         /// <summary>
 384         /// Play background music
 385         /// </summary>
 386         /// <param name="clip">The audio clip to play</param>
 387         /// <param name="onCompletelyPlayed">The audio play completed</param>
 388         /// <returns>The ID of the created Audio object</returns>
 389         public static int PlayMusic(AudioClip clip, Action<Audio> onCompletelyPlayed)
 390         {
 391             return PlayMusic(clip, 1f, false, false, 1f, 1f, -1f, null, onCompletelyPlayed);
 392         }
 393 
 394         /// <summary>
 395         /// Play background music
 396         /// </summary>
 397         /// <param name="clip">The audio clip to play</param>
 398         /// <param name="volume"> The volume the music will have</param>
 399         /// <param name="onCompletelyPlayed">The audio play completed</param>
 400         /// <returns>The ID of the created Audio object</returns>
 401         public static int PlayMusic(AudioClip clip, float volume, Action<Audio> onCompletelyPlayed)
 402         {
 403             return PlayMusic(clip, volume, false, false, 1f, 1f, -1f, null, onCompletelyPlayed);
 404         }
 405 
 406         /// <summary>
 407         /// Play background music
 408         /// </summary>
 409         /// <param name="clip">The audio clip to play</param>
 410         /// <param name="volume"> The volume the music will have</param>
 411         /// <param name="loop">Wether the music is looped</param>
 412         /// <param name = "persist" > Whether the audio persists in between scene changes</param>
 413         /// <param name="onCompletelyPlayed">The audio play completed</param>
 414         /// <returns>The ID of the created Audio object</returns>
 415         public static int PlayMusic(AudioClip clip, float volume, bool loop, bool persist, Action<Audio> onCompletelyPlayed)
 416         {
 417             return PlayMusic(clip, volume, loop, persist, 1f, 1f, -1f, null, onCompletelyPlayed);
 418         }
 419 
 420         /// <summary>
 421         /// Play background music
 422         /// </summary>
 423         /// <param name="clip">The audio clip to play</param>
 424         /// <param name="volume"> The volume the music will have</param>
 425         /// <param name="loop">Wether the music is looped</param>
 426         /// <param name="persist"> Whether the audio persists in between scene changes</param>
 427         /// <param name="fadeInSeconds">How many seconds it needs for the audio to fade in/ reach target volume (if higher than current)</param>
 428         /// <param name="fadeOutSeconds"> How many seconds it needs for the audio to fade out/ reach target volume (if lower than current)</param>
 429         /// <param name="onCompletelyPlayed">The audio play completed</param>
 430         /// <returns>The ID of the created Audio object</returns>
 431         public static int PlayMusic(AudioClip clip, float volume, bool loop, bool persist, float fadeInSeconds,
 432             float fadeOutSeconds, Action<Audio> onCompletelyPlayed)
 433         {
 434             return PlayMusic(clip, volume, loop, persist, fadeInSeconds, fadeOutSeconds, -1f, null, onCompletelyPlayed);
 435         }
 436 
 437         /// <summary>
 438         /// Play background music
 439         /// </summary>
 440         /// <param name="clip">The audio clip to play</param>
 441         /// <param name="volume"> The volume the music will have</param>
 442         /// <param name="loop">Wether the music is looped</param>
 443         /// <param name="persist"> Whether the audio persists in between scene changes</param>
 444         /// <param name="fadeInSeconds">How many seconds it needs for the audio to fade in/ reach target volume (if higher than current)</param>
 445         /// <param name="fadeOutSeconds"> How many seconds it needs for the audio to fade out/ reach target volume (if lower than current)</param>
 446         /// <param name="currentMusicfadeOutSeconds"> How many seconds it needs for current music audio to fade out. It will override its own fade out seconds. If -1 is passed, current music will keep its own fade out seconds</param>
 447         /// <param name="sourceTransform">The transform that is the source of the music (will become 3D audio). If 3D audio is not wanted, use null</param>
 448         /// <param name="onCompletelyPlayed">The audio play completed</param>
 449         /// <returns>The ID of the created Audio object</returns>
 450         public static int PlayMusic(AudioClip clip, float volume, bool loop, bool persist, float fadeInSeconds,
 451             float fadeOutSeconds, float currentMusicfadeOutSeconds, Transform sourceTransform, Action<Audio> onCompletelyPlayed)
 452         {
 453             if (clip == null)
 454             {
 455                 Debug.LogError("Sound Manager: Audio clip is null, cannot play music", clip);
 456             }
 457 
 458             if(ignoreDuplicateMusic)
 459             {
 460                 List<int> keys = new List<int>(musicAudio.Keys);
 461                 foreach (int key in keys)
 462                 {
 463                     if (musicAudio[key].audioSource.clip == clip)
 464                     {
 465                         return musicAudio[key].audioID;
 466                     }
 467                 }
 468             }
 469 
 470             instance.Init();
 471 
 472             // Stop all current music playing
 473             StopAllMusic(currentMusicfadeOutSeconds);
 474 
 475             // Create the audioSource
 476             //AudioSource audioSource = instance.gameObject.AddComponent<AudioSource>() as AudioSource;
 477             Audio audio = new Audio(Audio.AudioType.Music, clip, loop, persist, volume, fadeInSeconds, fadeOutSeconds,
 478                 sourceTransform, onCompletelyPlayed);
 479 
 480             // Add it to music list
 481             musicAudio.Add(audio.audioID, audio);
 482 
 483             return audio.audioID;
 484         }
 485 
 486         /// <summary>
 487         /// Play a sound fx
 488         /// </summary>
 489         /// <param name="clip">The audio clip to play</param>
 490         /// <param name="onCompletelyPlayed">The audio play completed</param>
 491         /// <returns>The ID of the created Audio object</returns>
 492         public static int PlaySound(AudioClip clip, Action<Audio> onCompletelyPlayed)
 493         {
 494             return PlaySound(clip, 1f, false, null, onCompletelyPlayed);
 495         }
 496 
 497         /// <summary>
 498         /// Play a sound fx
 499         /// </summary>
 500         /// <param name="clip">The audio clip to play</param>
 501         /// <param name="volume"> The volume the music will have</param>
 502         /// <param name="onCompletelyPlayed">The audio play completed</param>
 503         /// <returns>The ID of the created Audio object</returns>
 504         public static int PlaySound(AudioClip clip, float volume, Action<Audio> onCompletelyPlayed)
 505         {
 506             return PlaySound(clip, volume, false, null, onCompletelyPlayed);
 507         }
 508 
 509         /// <summary>
 510         /// Play a sound fx
 511         /// </summary>
 512         /// <param name="clip">The audio clip to play</param>
 513         /// <param name="loop">Wether the sound is looped</param>
 514         /// <param name="onCompletelyPlayed">The audio play completed</param>
 515         /// <returns>The ID of the created Audio object</returns>
 516         public static int PlaySound(AudioClip clip, bool loop, Action<Audio> onCompletelyPlayed)
 517         {
 518             return PlaySound(clip, 1f, loop, null, onCompletelyPlayed);
 519         }
 520 
 521         /// <summary>
 522         /// Play a sound fx
 523         /// </summary>
 524         /// <param name="clip">The audio clip to play</param>
 525         /// <param name="volume"> The volume the music will have</param>
 526         /// <param name="loop">Wether the sound is looped</param>
 527         /// <param name="sourceTransform">The transform that is the source of the sound (will become 3D audio). If 3D audio is not wanted, use null</param>
 528         /// <param name="onCompletelyPlayed">The audio play completed</param>
 529         /// <returns>The ID of the created Audio object</returns>
 530         public static int PlaySound(AudioClip clip, float volume, bool loop, Transform sourceTransform, Action<Audio> onCompletelyPlayed)
 531         {
 532             if (clip == null)
 533             {
 534                 Debug.LogError("Sound Manager: Audio clip is null, cannot play music", clip);
 535             }
 536 
 537             if (ignoreDuplicateSounds)
 538             {
 539                 List<int> keys = new List<int>(soundsAudio.Keys);
 540                 foreach (int key in keys)
 541                 {
 542                     if (soundsAudio[key].audioSource.clip == clip)
 543                     {
 544                         return soundsAudio[key].audioID;
 545                     }
 546                 }
 547             }
 548 
 549             instance.Init();
 550 
 551             // Create the audioSource
 552             //AudioSource audioSource = instance.gameObject.AddComponent<AudioSource>() as AudioSource;
 553             Audio audio = new Audio(Audio.AudioType.Sound, clip, loop, false, volume, 0f, 0f, sourceTransform, onCompletelyPlayed);
 554 
 555             // Add it to music list
 556             soundsAudio.Add(audio.audioID, audio);
 557 
 558             return audio.audioID;
 559         }
 560 
 561         /// <summary>
 562         /// Play a UI sound fx
 563         /// </summary>
 564         /// <param name="clip">The audio clip to play</param>
 565         /// <param name="onCompletelyPlayed">The audio play completed</param>
 566         /// <returns>The ID of the created Audio object</returns>
 567         public static int PlayUISound(AudioClip clip, Action<Audio> onCompletelyPlayed)
 568         {
 569             return PlayUISound(clip, 1f, onCompletelyPlayed);
 570         }
 571 
 572         /// <summary>
 573         /// Play a UI sound fx
 574         /// </summary>
 575         /// <param name="clip">The audio clip to play</param>
 576         /// <param name="volume"> The volume the music will have</param>
 577         /// <param name="onCompletelyPlayed">The audio play completed</param>
 578         /// <returns>The ID of the created Audio object</returns>
 579         public static int PlayUISound(AudioClip clip, float volume, Action<Audio> onCompletelyPlayed)
 580         {
 581             if (clip == null)
 582             {
 583                 Debug.LogError("Sound Manager: Audio clip is null, cannot play music", clip);
 584             }
 585 
 586             if (ignoreDuplicateUISounds)
 587             {
 588                 List<int> keys = new List<int>(UISoundsAudio.Keys);
 589                 foreach (int key in keys)
 590                 {
 591                     if (UISoundsAudio[key].audioSource.clip == clip)
 592                     {
 593                         return UISoundsAudio[key].audioID;
 594                     }
 595                 }
 596             }
 597 
 598             instance.Init();
 599 
 600             // Create the audioSource
 601             //AudioSource audioSource = instance.gameObject.AddComponent<AudioSource>() as AudioSource;
 602             Audio audio = new Audio(Audio.AudioType.UISound, clip, false, false, volume, 0f, 0f, null, onCompletelyPlayed);
 603 
 604             // Add it to music list
 605             UISoundsAudio.Add(audio.audioID, audio);
 606 
 607             return audio.audioID;
 608         }
 609 
 610         #endregion
 611 
 612         #region Stop Functions
 613 
 614         /// <summary>
 615         /// Stop all audio playing
 616         /// </summary>
 617         public static void StopAll()
 618         {
 619             StopAll(-1f);
 620         }
 621 
 622         /// <summary>
 623         /// Stop all audio playing
 624         /// </summary>
 625         /// <param name="fadeOutSeconds"> How many seconds it needs for all music audio to fade out. It will override  their own fade out seconds. If -1 is passed, all music will keep their own fade out seconds</param>
 626         public static void StopAll(float fadeOutSeconds)
 627         {
 628             StopAllMusic(fadeOutSeconds);
 629             StopAllSounds();
 630             StopAllUISounds();
 631         }
 632 
 633         /// <summary>
 634         /// Stop all music playing
 635         /// </summary>
 636         public static void StopAllMusic()
 637         {
 638             StopAllMusic(-1f);
 639         }
 640 
 641         /// <summary>
 642         /// Stop all music playing
 643         /// </summary>
 644         /// <param name="fadeOutSeconds"> How many seconds it needs for all music audio to fade out. It will override  their own fade out seconds. If -1 is passed, all music will keep their own fade out seconds</param>
 645         public static void StopAllMusic(float fadeOutSeconds)
 646         {
 647             List<int> keys = new List<int>(musicAudio.Keys);
 648             foreach (int key in keys)
 649             {
 650                 Audio audio = musicAudio[key];
 651                 if (fadeOutSeconds > 0)
 652                 {
 653                     audio.fadeOutSeconds = fadeOutSeconds;
 654                 }
 655                 audio.Stop();
 656             }
 657         }
 658 
 659         /// <summary>
 660         /// Stop all sound fx playing
 661         /// </summary>
 662         public static void StopAllSounds()
 663         {
 664             List<int> keys = new List<int>(soundsAudio.Keys);
 665             foreach (int key in keys)
 666             {
 667                 Audio audio = soundsAudio[key];
 668                 audio.Stop();
 669             }
 670         }
 671 
 672         /// <summary>
 673         /// Stop all UI sound fx playing
 674         /// </summary>
 675         public static void StopAllUISounds()
 676         {
 677             List<int> keys = new List<int>(UISoundsAudio.Keys);
 678             foreach (int key in keys)
 679             {
 680                 Audio audio = UISoundsAudio[key];
 681                 audio.Stop();
 682             }
 683         }
 684 
 685         #endregion
 686 
 687         #region Pause Functions
 688 
 689         /// <summary>
 690         /// Pause all audio playing
 691         /// </summary>
 692         public static void PauseAll()
 693         {
 694             PauseAllMusic();
 695             PauseAllSounds();
 696             PauseAllUISounds();
 697         }
 698 
 699         /// <summary>
 700         /// Pause all music playing
 701         /// </summary>
 702         public static void PauseAllMusic()
 703         {
 704             List<int> keys = new List<int>(musicAudio.Keys);
 705             foreach (int key in keys)
 706             {
 707                 Audio audio = musicAudio[key];
 708                 audio.Pause();
 709             }
 710         }
 711 
 712         /// <summary>
 713         /// Pause all sound fx playing
 714         /// </summary>
 715         public static void PauseAllSounds()
 716         {
 717             List<int> keys = new List<int>(soundsAudio.Keys);
 718             foreach (int key in keys)
 719             {
 720                 Audio audio = soundsAudio[key];
 721                 audio.Pause();
 722             }
 723         }
 724 
 725         /// <summary>
 726         /// Pause all UI sound fx playing
 727         /// </summary>
 728         public static void PauseAllUISounds()
 729         {
 730             List<int> keys = new List<int>(UISoundsAudio.Keys);
 731             foreach (int key in keys)
 732             {
 733                 Audio audio = UISoundsAudio[key];
 734                 audio.Pause();
 735             }
 736         }
 737 
 738         #endregion
 739 
 740         #region Resume Functions
 741 
 742         /// <summary>
 743         /// Resume all audio playing
 744         /// </summary>
 745         public static void ResumeAll()
 746         {
 747             ResumeAllMusic();
 748             ResumeAllSounds();
 749             ResumeAllUISounds();
 750         }
 751 
 752         /// <summary>
 753         /// Resume all music playing
 754         /// </summary>
 755         public static void ResumeAllMusic()
 756         {
 757             List<int> keys = new List<int>(musicAudio.Keys);
 758             foreach (int key in keys)
 759             {
 760                 Audio audio = musicAudio[key];
 761                 audio.Resume();
 762             }
 763         }
 764 
 765         /// <summary>
 766         /// Resume all sound fx playing
 767         /// </summary>
 768         public static void ResumeAllSounds()
 769         {
 770             List<int> keys = new List<int>(soundsAudio.Keys);
 771             foreach (int key in keys)
 772             {
 773                 Audio audio = soundsAudio[key];
 774                 audio.Resume();
 775             }
 776         }
 777 
 778         /// <summary>
 779         /// Resume all UI sound fx playing
 780         /// </summary>
 781         public static void ResumeAllUISounds()
 782         {
 783             List<int> keys = new List<int>(UISoundsAudio.Keys);
 784             foreach (int key in keys)
 785             {
 786                 Audio audio = UISoundsAudio[key];
 787                 audio.Resume();
 788             }
 789         }
 790 
 791         #endregion
 792     }
 793 
 794     public class Audio
 795     {
 796         private static int audioCounter = 0;
 797         private float volume;
 798         private float targetVolume;
 799         private float initTargetVolume;
 800         private float tempFadeSeconds;
 801         private float fadeInterpolater;
 802         private float onFadeStartVolume;
 803         private AudioType audioType;
 804         private AudioClip initClip;
 805         private Transform sourceTransform;
 806 
 807         /// <summary>
 808         /// The ID of the Audio
 809         /// </summary>
 810         public int audioID { get; private set; }
 811 
 812         /// <summary>
 813         /// The audio source that is responsible for this audio
 814         /// </summary>
 815         public AudioSource audioSource { get; private set; }
 816 
 817         /// <summary>
 818         /// Audio clip to play/is playing
 819         /// </summary>
 820         public AudioClip clip
 821         {
 822             get
 823             {
 824                 return audioSource == null ? initClip : audioSource.clip;
 825             }
 826         }
 827 
 828         /// <summary>
 829         /// Whether the audio will be lopped
 830         /// </summary>
 831         public bool loop { get; set; }
 832 
 833         /// <summary>
 834         /// Whether the audio persists in between scene changes
 835         /// </summary>
 836         public bool persist { get; set; }
 837 
 838         /// <summary>
 839         /// How many seconds it needs for the audio to fade in/ reach target volume (if higher than current)
 840         /// </summary>
 841         public float fadeInSeconds { get; set; }
 842 
 843         /// <summary>
 844         /// How many seconds it needs for the audio to fade out/ reach target volume (if lower than current)
 845         /// </summary>
 846         public float fadeOutSeconds { get; set; }
 847 
 848         /// <summary>
 849         /// Whether the audio is currently playing
 850         /// </summary>
 851         public bool playing { get; set; }
 852 
 853         /// <summary>
 854         /// Whether the audio is paused
 855         /// </summary>
 856         public bool paused { get; private set; }
 857 
 858         /// <summary>
 859         /// Whether the audio is stopping
 860         /// </summary>
 861         public bool stopping { get; private set; }        
 862 
 863         /// <summary>
 864         /// Whether the audio is created and updated at least once. 
 865         /// </summary>
 866         public bool activated { get; private set; }
 867 
 868         /// <summary>
 869         /// The audio played completed.
 870         /// </summary>
 871         public Action<Audio> onComletelyPlayed;
 872 
 873         public enum AudioType
 874         {
 875             Music,
 876             Sound,
 877             UISound
 878         }
 879 
 880         public Audio(AudioType audioType, AudioClip clip, bool loop, bool persist, float volume, float fadeInValue,
 881             float fadeOutValue, Transform sourceTransform, Action<Audio> onComletelyPlayed)
 882         {
 883             if (sourceTransform == null)
 884             {
 885                 this.sourceTransform = SoundManager.gameobject.transform;
 886             }
 887             else
 888             {
 889                 this.sourceTransform = sourceTransform;
 890             }
 891 
 892             this.audioID = audioCounter;
 893             audioCounter++;
 894 
 895             this.audioType = audioType;
 896             this.initClip = clip;
 897             this.loop = loop;
 898             this.persist = persist;
 899             this.targetVolume = volume;
 900             this.initTargetVolume = volume;
 901             this.tempFadeSeconds = -1;
 902             this.volume = 0f;
 903             this.fadeInSeconds = fadeInValue;
 904             this.fadeOutSeconds = fadeOutValue;
 905             this.onComletelyPlayed = onComletelyPlayed;
 906 
 907             this.playing = false;
 908             this.paused = false;
 909             this.activated = false;
 910 
 911             CreateAudiosource(clip, loop);
 912             Play();
 913         }
 914 
 915         void CreateAudiosource(AudioClip clip, bool loop)
 916         {
 917             audioSource = sourceTransform.gameObject.AddComponent<AudioSource>() as AudioSource;
 918 
 919             audioSource.clip = clip;
 920             audioSource.loop = loop;
 921             audioSource.volume = 0f;
 922             if (sourceTransform != SoundManager.gameobject.transform)
 923             {
 924                 audioSource.spatialBlend = 1;
 925             }
 926         }
 927 
 928         /// <summary>
 929         /// Start playing audio clip from the beggining
 930         /// </summary>
 931         public void Play()
 932         {
 933             Play(initTargetVolume);
 934         }
 935 
 936         /// <summary>
 937         /// Start playing audio clip from the beggining
 938         /// </summary>
 939         /// <param name="volume">The target volume</param>
 940         public void Play(float volume)
 941         {
 942             if(audioSource == null)
 943             {
 944                 CreateAudiosource(initClip, loop);
 945             }
 946 
 947             audioSource.Play();
 948             playing = true;
 949 
 950             fadeInterpolater = 0f;
 951             onFadeStartVolume = this.volume;
 952             targetVolume = volume;
 953         }
 954 
 955         /// <summary>
 956         /// Stop playing audio clip
 957         /// </summary>
 958         public void Stop()
 959         {
 960             fadeInterpolater = 0f;
 961             onFadeStartVolume = volume;
 962             targetVolume = 0f;
 963 
 964             stopping = true;
 965         }
 966 
 967         /// <summary>
 968         /// Pause playing audio clip
 969         /// </summary>
 970         public void Pause()
 971         {
 972             audioSource.Pause();
 973             paused = true;
 974         }
 975 
 976         /// <summary>
 977         /// Resume playing audio clip
 978         /// </summary>
 979         public void Resume()
 980         {
 981             audioSource.UnPause();
 982             paused = false;
 983         }
 984 
 985         /// <summary>
 986         /// Sets the audio volume
 987         /// </summary>
 988         /// <param name="volume">The target volume</param>
 989         public void SetVolume(float volume)
 990         {
 991             if(volume > targetVolume)
 992             {
 993                 SetVolume(volume, fadeOutSeconds);
 994             }
 995             else
 996             {
 997                 SetVolume(volume, fadeInSeconds);
 998             }
 999         }
1000 
1001         /// <summary>
1002         /// Sets the audio volume
1003         /// </summary>
1004         /// <param name="volume">The target volume</param>
1005         /// <param name="fadeSeconds">How many seconds it needs for the audio to fade in/out to reach target volume. If passed, it will override the Audio's fade in/out seconds, but only for this transition</param>
1006         public void SetVolume(float volume, float fadeSeconds)
1007         {
1008             SetVolume(volume, fadeSeconds, this.volume);
1009         }
1010 
1011         /// <summary>
1012         /// Sets the audio volume
1013         /// </summary>
1014         /// <param name="volume">The target volume</param>
1015         /// <param name="fadeSeconds">How many seconds it needs for the audio to fade in/out to reach target volume. If passed, it will override the Audio's fade in/out seconds, but only for this transition</param>
1016         /// <param name="startVolume">Immediately set the volume to this value before beginning the fade. If not passed, the Audio will start fading from the current volume towards the target volume</param>
1017         public void SetVolume(float volume, float fadeSeconds, float startVolume) 
1018         {
1019             targetVolume = Mathf.Clamp01(volume);
1020             fadeInterpolater = 0;
1021             onFadeStartVolume = startVolume;
1022             tempFadeSeconds = fadeSeconds;
1023         }
1024 
1025         /// <summary>
1026         /// Sets the Audio 3D max distance
1027         /// </summary>
1028         /// <param name="max">the max distance</param>
1029         public void Set3DMaxDistance(float max)
1030         {
1031             audioSource.maxDistance = max;
1032         }
1033 
1034         /// <summary>
1035         /// Sets the Audio 3D min distance
1036         /// </summary>
1037         /// <param name="max">the min distance</param>
1038         public void Set3DMinDistance(float min)
1039         {
1040             audioSource.minDistance = min;
1041         }
1042 
1043         /// <summary>
1044         /// Sets the Audio 3D distances
1045         /// </summary>
1046         /// <param name="min">the min distance</param>
1047         /// <param name="max">the max distance</param>
1048         public void Set3DDistances(float min, float max)
1049         {
1050             Set3DMinDistance(min);
1051             Set3DMaxDistance(max);
1052         }
1053 
1054         public void Update()
1055         {
1056             if(audioSource == null)
1057             {
1058                 return;
1059             }
1060 
1061             activated = true;
1062 
1063             if (volume != targetVolume)
1064             {
1065                 float fadeValue;
1066                 fadeInterpolater += Time.deltaTime;
1067                 if (volume > targetVolume)
1068                 {
1069                     fadeValue = tempFadeSeconds != -1? tempFadeSeconds: fadeOutSeconds;
1070                 }
1071                 else
1072                 {
1073                     fadeValue = tempFadeSeconds != -1 ? tempFadeSeconds : fadeInSeconds;
1074                 }
1075 
1076                 volume = Mathf.Lerp(onFadeStartVolume, targetVolume, fadeInterpolater / fadeValue);
1077             }
1078             else if(tempFadeSeconds != -1)
1079             {
1080                 tempFadeSeconds = -1;
1081             }
1082 
1083             switch (audioType)
1084             {
1085                 case AudioType.Music:
1086                     {
1087                         audioSource.volume = volume * SoundManager.globalMusicVolume * SoundManager.globalVolume;
1088                         break;
1089                     }
1090                 case AudioType.Sound:
1091                     {
1092                         audioSource.volume = volume * SoundManager.globalSoundsVolume * SoundManager.globalVolume;
1093                         break;
1094                     }
1095                 case AudioType.UISound:
1096                     {
1097                         audioSource.volume = volume * SoundManager.globalUISoundsVolume * SoundManager.globalVolume;
1098                         break;
1099                     }
1100             }
1101 
1102             if (volume == 0f && stopping)
1103             {
1104                 audioSource.Stop();
1105                 stopping = false;
1106                 playing = false;
1107                 paused = false;
1108             }
1109 
1110             // Update playing status
1111             if (audioSource.isPlaying != playing)
1112             {
1113                 playing = audioSource.isPlaying;
1114             }
1115         }
1116     }
1117 }
View Code

相关文章:

  • 2021-12-14
  • 2021-04-03
  • 2021-05-25
  • 2022-12-23
  • 2021-07-07
  • 2022-01-07
  • 2021-05-19
猜你喜欢
  • 2022-12-23
  • 2021-11-12
  • 2021-06-28
  • 2022-12-23
  • 2021-06-21
  • 2022-12-23
  • 2022-02-22
相关资源
相似解决方案