• Unity3d简便的声音管理方案


    本方法是对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
    ZSAudioController
    
      1 using System;
      2 using System.Collections.Generic;
      3 using UnityEngine;
      4 using ZStudio.SoundManager;
      5 using Object = UnityEngine.Object;
      6 
      7 public class ZSAudioControllerStub : MonoBehaviour
      8 {
      9     public List<AudioSett> audioSetts;
     10     public AudioGlobalSett audioGlobalSett = new AudioGlobalSett();
     11 
     12     public AudioSett GetAudio(string an)
     13     {
     14         return audioSetts.Find(aud => aud.name == an);
     15     }
     16 }
     17 
     18 [Serializable]
     19 public class AudioGlobalSett
     20 {
     21     public float uiVolome;
     22     public float fxVolume;
     23     public float soundVolume;
     24 
     25     public bool ignoreDuplicateMusic;
     26     public bool ignoreDuplicateSounds;
     27     public bool ignoreDuplicateUISounds;
     28 
     29     public AudioGlobalSett()
     30     {
     31         uiVolome = 1;
     32         fxVolume = 1;
     33         soundVolume = 1;
     34 
     35         ignoreDuplicateMusic = false;
     36         ignoreDuplicateSounds = false;
     37         ignoreDuplicateUISounds = false;
     38     }
     39 }
     40 
     41 [Serializable]
     42 public class AudioSett
     43 {
     44     public Audio.AudioType type;
     45 
     46     public string name;
     47     public AudioClip clip;
     48     public float volume;
     49     public bool loop;
     50     public bool persist;
     51     public float fadeInSec;
     52     public float fadeOutSec;
     53 
     54     public AudioSett()
     55     {
     56         volume = 1;
     57         loop = false;
     58         persist = false;
     59         fadeInSec = 0;
     60         fadeOutSec = 0;
     61     }
     62 }
     63 
     64 public class ZSAudioController : Singleton<ZSAudioController>
     65 {
     66     private static ZSAudioControllerStub stub;
     67 
     68     public enum RangeType
     69     {
     70         Music,
     71         Sound,
     72         UISound,
     73         All
     74     }
     75 
     76     private static void  InitStub()
     77     {
     78         var stubs = Object.FindObjectsOfType<ZSAudioControllerStub>();
     79         if (stubs.Length > 1)
     80         {
     81             Debug.LogWarning("More than one ZSAudioControllerStub in scene.");
     82             foreach (var st in stubs)
     83             {
     84                 Object.DestroyObject(st.gameObject);
     85             }
     86         }
     87         else if (stubs.Length == 1) stub = stubs[0];
     88 
     89         if (stub == null)
     90             stub = Object.Instantiate(Resources.Load<ZSAudioControllerStub>("AudioController"));
     91         Object.DontDestroyOnLoad(stub.gameObject);
     92     }
     93 
     94     public static void Play(string audid, Action<Audio> onPlayed = null)
     95     {
     96         if (stub == null) InitStub();
     97 
     98         AudioSett _ass = stub.GetAudio(audid);
     99         if (_ass != null)
    100         {
    101             if (_ass.type == Audio.AudioType.Music)
    102             {
    103                 SoundManager.PlayMusic(_ass.clip, _ass.volume, _ass.loop, _ass.persist, _ass.fadeInSec,
    104                     _ass.fadeOutSec, onPlayed);
    105             }
    106             else if (_ass.type == Audio.AudioType.Sound)
    107             {
    108                 SoundManager.PlaySound(_ass.clip, _ass.volume, _ass.loop, null, onPlayed);
    109             }
    110             else if (_ass.type == Audio.AudioType.UISound)
    111             {
    112                 SoundManager.PlayUISound(_ass.clip, _ass.volume, onPlayed);
    113             }          
    114         }
    115     }
    116 
    117     public static void Stop(string audid)
    118     {
    119         if (stub == null) InitStub();
    120 
    121         AudioSett _ass = stub.GetAudio(audid);
    122         if (_ass != null)
    123         {
    124             Audio _audio = SoundManager.GetAudio(_ass.clip);
    125             if (_audio != null) _audio.Stop();
    126         }
    127     }
    128 
    129     public static void Pause(string audid)
    130     {
    131         if (stub == null) InitStub();
    132 
    133         AudioSett _ass = stub.GetAudio(audid);
    134         if (_ass != null)
    135         {
    136             Audio _audio = SoundManager.GetAudio(_ass.clip);
    137             if (_audio != null) _audio.Pause();
    138         }
    139     }
    140 
    141     public static void Resume(string audid)
    142     {
    143         if (stub == null) InitStub();
    144 
    145         AudioSett _ass = stub.GetAudio(audid);
    146         if (_ass != null)
    147         {
    148             Audio _audio = SoundManager.GetAudio(_ass.clip);
    149             if (_audio != null) _audio.Resume();
    150         }
    151     }
    152 
    153     public static void Stop(RangeType range)
    154     {
    155         if (range == RangeType.Music) SoundManager.StopAllMusic();
    156         if (range == RangeType.Sound) SoundManager.StopAllSounds();
    157         if (range == RangeType.UISound) SoundManager.StopAllUISounds();
    158         if (range == RangeType.All) SoundManager.StopAll();
    159     }
    160 
    161     public static void Pause(RangeType range)
    162     {
    163         if (range == RangeType.Music) SoundManager.PauseAllMusic();
    164         if (range == RangeType.Sound) SoundManager.PauseAllSounds();
    165         if (range == RangeType.UISound) SoundManager.PauseAllUISounds();
    166         if (range == RangeType.All) SoundManager.PauseAll();
    167     }
    168 
    169     public static void Resume(RangeType range)
    170     {
    171         if (range == RangeType.Music) SoundManager.ResumeAllMusic();
    172         if (range == RangeType.Sound) SoundManager.ResumeAllSounds();
    173         if (range == RangeType.UISound) SoundManager.ResumeAllUISounds();
    174         if (range == RangeType.All) SoundManager.ResumeAll();
    175     }
    176 }
    ZSAudioControllerEditor
    
      1 using UnityEditor;
      2 using UnityEngine;
      3 using ZStudio.SoundManager;
      4 
      5 [CustomEditor(typeof(ZSAudioControllerStub))]
      6 [CanEditMultipleObjects]
      7 public class ZSAudioControllerEditor : Editor
      8 {
      9     private SerializedProperty ass;
     10     private SerializedProperty ags;
     11     private Audio.AudioType audioType;
     12 
     13     private bool showAudio = true;
     14     private bool showGlobal = true;
     15     private int deleteIndex = -1;
     16     private int selectedIndex = 0;
     17 
     18     private GUIStyle labelStyle;
     19     private GUIStyle foldoutStyle;
     20 
     21     // 当对象已启用并处于活动状态时调用此函数
     22     private void OnEnable()
     23     {
     24         ass = serializedObject.FindProperty("audioSetts");
     25         ags = serializedObject.FindProperty("audioGlobalSett");
     26     }
     27 
     28     private void SetStyles()
     29     {
     30         foldoutStyle = new GUIStyle(EditorStyles.foldout);
     31         Color color = new Color(0, 0, 0.2f);
     32         foldoutStyle.onNormal.background = EditorStyles.boldLabel.onNormal.background;
     33         foldoutStyle.onFocused.background = EditorStyles.boldLabel.onNormal.background;
     34         foldoutStyle.onActive.background = EditorStyles.boldLabel.onNormal.background;
     35         foldoutStyle.onHover.background = EditorStyles.boldLabel.onNormal.background;
     36         foldoutStyle.normal.textColor = color;
     37         foldoutStyle.focused.textColor = color;
     38         foldoutStyle.active.textColor = color;
     39         foldoutStyle.hover.textColor = color;
     40         foldoutStyle.fixedWidth = 1000f;
     41 
     42         labelStyle = new GUIStyle(EditorStyles.foldout);
     43         color = new Color(0, 0, 0.5f);
     44         labelStyle.onNormal.background = EditorStyles.boldLabel.onNormal.background;
     45         labelStyle.onFocused.background = EditorStyles.boldLabel.onNormal.background;
     46         labelStyle.onActive.background = EditorStyles.boldLabel.onNormal.background;
     47         labelStyle.onHover.background = EditorStyles.boldLabel.onNormal.background;
     48         labelStyle.font = EditorStyles.boldFont;
     49         labelStyle.normal.textColor = color;
     50         labelStyle.focused.textColor = color;
     51         labelStyle.active.textColor = color;
     52         labelStyle.hover.textColor = color;
     53         labelStyle.fixedWidth = 1000f;
     54     }
     55 
     56     public override void OnInspectorGUI()
     57     {
     58         SetStyles();
     59         serializedObject.Update();
     60 
     61         // 全局设定
     62         GlobalSetting();
     63 
     64         //GUILayout.Label("添加/删除音乐", foldoutStyle);
     65         EditorGUILayout.Foldout(true, "添加音乐", foldoutStyle);
     66         GUILayout.BeginVertical("Box");
     67         GUILayout.BeginHorizontal("Box");
     68         audioType = (Audio.AudioType) EditorGUILayout.EnumPopup(audioType, GUILayout.MinWidth(65));
     69         GUILayout.Label("", GUILayout.MaxWidth(1000));
     70         GUILayout.EndHorizontal();
     71         GUILayout.BeginHorizontal("box");
     72         if (GUILayout.Button("Add", GUILayout.Width(50)))
     73         {
     74             AddAudio(audioType);
     75         }
     76         GUILayout.Label("", GUILayout.MaxWidth(1000));
     77         if (GUILayout.Button("ClearAll", GUILayout.MinWidth(80)))
     78         {
     79             ass.ClearArray();
     80         }
     81         GUILayout.EndHorizontal();
     82         GUILayout.EndVertical();
     83         GUILayout.Space(10);
     84 
     85         // 移除项
     86         if (deleteIndex > -1)
     87         {
     88             RemoveAudio(deleteIndex);
     89             deleteIndex = -1;
     90         }
     91 
     92         showAudio = EditorGUILayout.Foldout(showAudio, new GUIContent("音乐列表"), foldoutStyle);
     93         if (showAudio)
     94         {   
     95             PopupAudio();
     96             if (ass.arraySize > selectedIndex)
     97             {
     98                 var audio = ass.GetArrayElementAtIndex(selectedIndex);
     99                 DrawAudio(audio, selectedIndex);
    100             }
    101         }
    102 
    103         serializedObject.ApplyModifiedProperties();
    104     }
    105 
    106     private void GlobalSetting()
    107     {
    108         GUILayout.BeginVertical();
    109         showGlobal = EditorGUILayout.Foldout(showGlobal, "Global Settings", foldoutStyle);
    110         if (showGlobal)
    111         {
    112             var uiv = ags.FindPropertyRelative("uiVolome");
    113             EditorGUILayout.Slider(uiv, 0, 1, "UI Volume:");
    114             var fxv = ags.FindPropertyRelative("fxVolume");
    115             EditorGUILayout.Slider(fxv, 0, 1, "Fx Volume:");
    116             var sdv = ags.FindPropertyRelative("soundVolume");
    117             EditorGUILayout.Slider(sdv, 0, 1, "Sound Volume:");
    118             GUILayout.EndVertical();
    119         }
    120     }
    121 
    122     private void PopupAudio()
    123     {
    124         string[] names = new string[ass.arraySize];
    125         for (int i = 0; i < ass.arraySize; i++)
    126         {
    127             SerializedProperty _ass = ass.GetArrayElementAtIndex(i);
    128             string _name = _ass.FindPropertyRelative("name").stringValue;
    129             names[i] = _name;
    130         }
    131 
    132         GUILayout.BeginHorizontal(new GUIStyle(EditorStyles.whiteBoldLabel));
    133         selectedIndex = EditorGUILayout.Popup("Audio:", selectedIndex, names);
    134         GUILayout.EndHorizontal();
    135     }
    136 
    137     private void DrawAudio(SerializedProperty audio, int index)
    138     {
    139         GUILayout.BeginVertical("Box");
    140 
    141         GUILayout.BeginHorizontal();
    142         EditorGUILayout.LabelField("Type:", GUILayout.MaxWidth(40));
    143         SerializedProperty _type = audio.FindPropertyRelative("type");
    144         EditorGUILayout.PropertyField(_type, new GUIContent(""), GUILayout.MaxWidth(200));
    145         GUILayout.Label("", GUILayout.MaxWidth(1000));
    146         if (GUILayout.Button("-", GUILayout.MaxWidth(25)))
    147         {
    148             deleteIndex = index;
    149         }
    150         GUILayout.EndHorizontal();
    151 
    152         SerializedProperty _clip = audio.FindPropertyRelative("clip");
    153         EditorGUILayout.PropertyField(_clip, new GUIContent("Audio Clip:"));
    154         SerializedProperty _name = audio.FindPropertyRelative("name");
    155         EditorGUILayout.PropertyField(_name, new GUIContent("Audio Name:"));
    156         SerializedProperty _volume = audio.FindPropertyRelative("volume");
    157         EditorGUILayout.Slider(_volume, 0, 1, "Volume:");
    158         SerializedProperty _loop = audio.FindPropertyRelative("loop");
    159         EditorGUILayout.PropertyField(_loop, new GUIContent("Loop:"));
    160         SerializedProperty _persist = audio.FindPropertyRelative("persist");
    161         EditorGUILayout.PropertyField(_persist, new GUIContent("Persist:"));
    162         GUILayout.BeginHorizontal();
    163         SerializedProperty _fadeInSec = audio.FindPropertyRelative("fadeInSec");
    164         EditorGUILayout.PropertyField(_fadeInSec, new GUIContent("Fade-In:"));
    165         GUILayout.Label("Sec");
    166         GUILayout.EndHorizontal();
    167         GUILayout.BeginHorizontal();
    168         SerializedProperty _fadeOutSec = audio.FindPropertyRelative("fadeOutSec");
    169         EditorGUILayout.PropertyField(_fadeOutSec, new GUIContent("Fade-Out:"));
    170         GUILayout.Label("Sec");
    171         GUILayout.EndHorizontal();
    172 
    173         GUILayout.EndVertical();       
    174     }
    175 
    176     private void AddAudio(Audio.AudioType type)
    177     {
    178         AudioClip[] clips = GetSelectedAudioClips();
    179         for (int i = 0; i < clips.Length; i++)
    180         {
    181             ass.arraySize += 1;
    182             var _audio = ass.GetArrayElementAtIndex(ass.arraySize - 1);
    183             _audio.FindPropertyRelative("clip").objectReferenceValue = clips[i];
    184             _audio.FindPropertyRelative("name").stringValue = clips[i].name;
    185             _audio.FindPropertyRelative("type").enumValueIndex = (int)type;
    186             _audio.FindPropertyRelative("volume").floatValue = 1;
    187             _audio.FindPropertyRelative("loop").boolValue = false;
    188             _audio.FindPropertyRelative("persist").boolValue = false;
    189             _audio.FindPropertyRelative("fadeInSec").floatValue = 0;
    190             _audio.FindPropertyRelative("fadeOutSec").floatValue = 0;
    191         }
    192         serializedObject.ApplyModifiedProperties();
    193     }
    194 
    195     private void RemoveAudio(int index)
    196     {
    197         if (index >= ass.arraySize || index < 0)
    198         {
    199             Debug.LogWarning("invalid index in DeleteArrayElement: " + index);
    200         }
    201         else
    202         {
    203             ass.DeleteArrayElementAtIndex(index);
    204             // 最后一个元素被删除
    205             if (selectedIndex >= ass.arraySize - 1)
    206             {
    207                 selectedIndex -= 1;
    208                 if (selectedIndex < 0) selectedIndex = 0;
    209             }
    210         }
    211     }
    212 
    213     // 获取选中的音乐或者文件夹下面的音乐
    214     private AudioClip[] GetSelectedAudioClips()
    215     {
    216         var filtered = Selection.GetFiltered<AudioClip>(SelectionMode.DeepAssets);
    217         return filtered;
    218     }
    219 }
    • 测试播放

    1 // TODEBUG 测试声音播放
    2 ZSAudioController.Play("0");

    添加音乐只需要在资源视图中选中音乐或者音乐文件夹,点击Add.

  • 相关阅读:
    python numpty 中shape的用法
    卷积神经网络中参数的计算
    linux学习
    数据结构排序算法总结
    剑指offer 刷题 01
    30-大道至简——随机森林如何将分类器由弱变强
    29-用python构造一棵决策树
    28-决策树算法——简单有效的概率模型
    27-如何度量分类算法的性能好坏(Scoring metrics for classification)
    26-史上最简单的分类算法——KNN
  • 原文地址:https://www.cnblogs.com/linxmouse/p/8669069.html
Copyright © 2020-2023  润新知