本方法是对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 }