中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

嘉善建設(shè)工程質(zhì)量監(jiān)督站網(wǎng)站瀏覽器2345網(wǎng)址導(dǎo)航下載安裝

嘉善建設(shè)工程質(zhì)量監(jiān)督站網(wǎng)站,瀏覽器2345網(wǎng)址導(dǎo)航下載安裝,手機商城下載app,網(wǎng)站開發(fā)流程 百度文庫需求描述 在游戲開發(fā)中,音頻資源是不可或缺的,通常情況下音頻資源隨機分布,各個音頻的操作和管理都是各自負責(zé),同時對于音頻的很多操作邏輯都是大同小異的,這就造成了許多冗余代碼的堆疊,除此之外在獲取各類…

需求描述

? ? ? ? 在游戲開發(fā)中,音頻資源是不可或缺的,通常情況下音頻資源隨機分布,各個音頻的操作和管理都是各自負責(zé),同時對于音頻的很多操作邏輯都是大同小異的,這就造成了許多冗余代碼的堆疊,除此之外在獲取各類音頻資源的時候也會造成不必要的開銷。所以解決資源分散的問題最直接的方式就是集中管理和分配,通過統(tǒng)一的渠道和特有標識即可獲取或操作對應(yīng)的音頻資源。所以本篇文章將圍繞這個方案進行嘗試。

功能描述

? ? ? ? 在Unity中我們導(dǎo)入的音頻資源都會轉(zhuǎn)換為AudioClip,音頻的設(shè)置和管理則由AudioSource負責(zé),AudioListener負責(zé)監(jiān)聽音頻。我們可以在此基礎(chǔ)上去封裝,從而打造一個音頻管理器。

????????音頻管理器負責(zé)管理音頻信息以及操作音頻,比如音頻信息的增加和刪除,音頻的播放和暫停等;

????????音頻信息可以使用一個單獨的實體類來記錄,用于記錄AudioSource組件中的信息,之所以單獨用一個實體類來記錄音頻信息而不直接采用AudioSource,主要是可以通過業(yè)務(wù)需求去動態(tài)調(diào)整所要記錄的音頻信息,我們的實際開發(fā)中并非需要AudioSource中所有的信息,有時候僅僅需要其中的一部分,同時音頻信息可能涉及存儲,直接采用AudioSource可能無法與已經(jīng)開發(fā)好的存儲系統(tǒng)相互兼容,而實體類可以為其添加接口或繼承來兼容存儲系統(tǒng);

????????AudioSource組件的管理可以通過一個組件池進行管理,我們知道AudioSource也是等同于一個音頻實體類,但是其同時也是一種組件,組件同樣作為一種資源,通常情況下相比簡單的實體類而言會帶來更大的開銷,例如一個場景中有十個游戲?qū)ο笥胁シ乓纛l的需求,那么按照傳統(tǒng)情況就需要每個游戲?qū)ο髵燧d一個AudioSource組件,但是實際運行中十個游戲?qū)ο蟛⒉灰欢ㄐ枰瑫r播放音頻,它們或許都存在各自觸發(fā)音頻播放的條件,我們只需要在游戲?qū)ο笮枰シ乓纛l時為其分配一個AudioSource組件即可,組件池則負責(zé)維護AudioSource組件的生產(chǎn)、獲取和歸還,進而減少資源開銷。

? ? ? ? 本質(zhì)上,AudioSource組件承擔(dān)的工作就是記錄音頻信息和操作音頻,我們現(xiàn)在將記錄工作分擔(dān)給音頻信息實體類,而操作音頻的工作則分擔(dān)給音頻管理器,例如音頻管理器的播放依舊是調(diào)用AudioSource的播放方法,在播放之前由音頻管理器去獲取AudioSource組件并且為之配置音頻信息,其它的音頻操作邏輯同理。

代碼展示(C#)

AudioManager.cs

using System.Linq;
using System;
using System.Collections.Generic;
using UnityEngine;namespace Tools.AudioManagerAPI
{/// <summary>/// 音頻管理器/// </summary>[DisallowMultipleComponent]public class AudioManager : MonoBehaviour{[Header("必要屬性")][Tooltip("音頻總音量,默認為1(值屬于[0,1]),該值將影響所有音頻的音量,例如該值為0則所有音頻音量變?yōu)樵幸袅康?%,若為1則所有音頻音量保持不變,即該值將基于所有音頻的當前音量進行影響,而不是直接統(tǒng)一所有音頻的音量為該值")][Range(0, 1), SerializeField] private float TotalVolume = 1;/// <summary>/// 音頻總音量,默認為1(值屬于[0,1])/// <para>聲明:該值將影響所有音頻的音量,例如該值為0則所有音頻音量變?yōu)樵幸袅康?%,若為1則所有音頻音量保持不變,即該值將基于所有音頻的當前音量進行影響,而不是直接統(tǒng)一所有音頻的音量為該值</para>/// </summary>public float mTotalVolume{get { return TotalVolume; }set{if (value >= 0 && value <= 1 && TotalVolume != value){TotalVolume = value;mTotalVolumeChangedEvents?.Invoke(value);}}}/// <summary>/// 是否啟用音頻信息覆蓋,默認為true/// </summary>public bool mIsOverWrite { get => isOverWrite; set => isOverWrite = value; }/// <summary>/// 音頻管理器中所存儲的音頻數(shù)量/// </summary>public int mCount { get => audioInfos.Count; }/// <summary>/// 總音量更改事件回調(diào)/// </summary>public event Action<float> mTotalVolumeChangedEvents;/// <summary>/// 音頻信息名稱合集/// </summary>public string[] mAudioInfoNames { get => audioInfos.Keys.ToArray(); }private Dictionary<string, AudioInfo> audioInfos;//音頻信息集合private bool isInit;//是否完成了初始化private bool isOverWrite;//是否啟用音頻信息覆蓋private static AudioSourcePool audioSourcePool = AudioSourcePool.GetInstance();//AudioSource組件池/// <summary>/// 播放指定名稱的音頻/// <para>p_audioName:音頻名稱</para>/// </summary>public void Play(string p_audioName){if (isInit){if (audioInfos.ContainsKey(p_audioName)){AudioInfo ai = audioInfos[p_audioName];AudioSource v_audioSource = audioSourcePool.Get(ai);ai.mAudioSource = v_audioSource;ai.Play();}}}/// <summary>/// 播放指定名稱的音頻并開啟立體聲過渡/// <para>p_audioName:音頻名稱</para>/// <para>聲明:該方法要求已啟用立體聲過渡且已設(shè)置好立體聲過渡的相關(guān)屬性</para>/// </summary>public void PlayWithStereoTransition(string p_audioName){if (isInit){if (audioInfos.ContainsKey(p_audioName)){AudioInfo ai = audioInfos[p_audioName];AudioSource v_audioSource = audioSourcePool.Get(ai);ai.mAudioSource = v_audioSource;StartCoroutine(ai.mStereoPanTransitionCoroutine);ai.Play();}}}/// <summary>/// 播放指定名稱的音頻并開啟立體聲過渡/// <para>p_audioName:音頻名稱</para>/// <para>p_stereoTransitionValues:立體聲過渡值集合</para>/// <para>p_stereoTimeSpan:立體聲過渡每幀時間間隔</para>/// </summary>public void PlayWithStereoTransition(string p_audioName, float[] p_stereoTransitionValues, float p_stereoTimeSpan){if (isInit){if (audioInfos.ContainsKey(p_audioName)){AudioInfo ai = audioInfos[p_audioName];AudioSource v_audioSource = audioSourcePool.Get(ai);ai.mAudioSource = v_audioSource;ai.mStereoTransition = true;ai.mStereoTransitionValues = p_stereoTransitionValues;ai.mStereoTransitionTimeSpan = p_stereoTimeSpan;StartCoroutine(ai.mStereoPanTransitionCoroutine);ai.Play();}}}/// <summary>/// 暫停播放指定名稱的音頻/// <para>p_audioName:音頻名稱</para>/// </summary>public void Pause(string p_audioName){if (isInit){if (audioInfos.ContainsKey(p_audioName)){AudioInfo ai = audioInfos[p_audioName];StopCoroutine(ai.mStereoPanTransitionCoroutine);ai.Pause();audioSourcePool.Return(ai.mAudioSource);}}}/// <summary>/// 添加音頻信息/// <para>p_audioInfo:音頻信息</para>/// <para>聲明1:若啟用了音頻信息覆蓋,當存在相同名稱的音頻時,新的音頻信息將覆蓋舊的音頻信息</para>/// <para>聲明2:默認啟用了音頻信息覆蓋,可通過mIsOverWrite屬性設(shè)置禁用</para>/// </summary>public void AddAudioInfo(AudioInfo p_audioInfo){if (isInit) DoAddAudioInfo(p_audioInfo);}/// <summary>/// 刪除音頻信息/// <para>p_audioName:音頻名稱</para>/// <para>返回值:若刪除成功則返回true,否則返回false</para>/// </summary>public bool DeleteAudioInfo(string p_audioName){if (isInit) return DoDeleteAudioInfo(p_audioName);return false;}private void Awake(){isInit = false;if (InitParameters()) isInit = true;}//添加音頻信息的執(zhí)行邏輯private void DoAddAudioInfo(AudioInfo p_audioInfo){if (p_audioInfo != null && !String.IsNullOrEmpty(p_audioInfo.mAudioName)){string v_audioName = p_audioInfo.mAudioName;p_audioInfo.BindAudioManager(this);if (isOverWrite) audioInfos[v_audioName] = p_audioInfo;else if (!audioInfos.ContainsKey(v_audioName)) audioInfos.Add(v_audioName, p_audioInfo);}}//刪除音頻信息的執(zhí)行邏輯private bool DoDeleteAudioInfo(string p_audioName){if (!String.IsNullOrEmpty(p_audioName) && audioInfos.ContainsKey(p_audioName)){audioInfos[p_audioName].BindAudioManager(null);return audioInfos.Remove(p_audioName);}return false;}//對音頻管理器相關(guān)參數(shù)進行初始化private bool InitParameters(){audioInfos = new Dictionary<string, AudioInfo>();isOverWrite = true;audioSourcePool.BindAudioManager(this);
#if UNITY_EDITORforeach (AudioInfo ai in AudioInfos)DoAddAudioInfo(ai);
#endifreturn true;}#if UNITY_EDITOR/// <summary>/// 在當前Inspector面板中的AudioInfos中的元素數(shù)量/// </summary>public int mAudioInfoCount { get => AudioInfos?.Length > 0 ? AudioInfos.Length : 0; }[SerializeField] private AudioInfo[] AudioInfos;//存儲Inspector面板中/// <summary>/// 在當前Inspector面板中的AudioInfos中添加一個元素/// </summary>public void Add(){AudioInfo v_audioInfo = new AudioInfo();if (AudioInfos?.Length > 0){AudioInfo[] v_audioInfos = new AudioInfo[AudioInfos.Length + 1];AudioInfos.CopyTo(v_audioInfos, 0);v_audioInfos[v_audioInfos.Length - 1] = v_audioInfo;AudioInfos = new AudioInfo[v_audioInfos.Length];v_audioInfos.CopyTo(AudioInfos, 0);}else AudioInfos = new AudioInfo[] { v_audioInfo };v_audioInfo.ValidateCheck();}/// <summary>/// 在當前Inspector面板中的AudioInfos中刪除一個元素/// </summary>public void Delete(int p_index){if (AudioInfos?.Length == 1) AudioInfos = Array.Empty<AudioInfo>();else if (AudioInfos?.Length > 1){AudioInfo[] v_audioInfos = new AudioInfo[AudioInfos.Length - 1];int v_index = 0;for (int i = 0; i < AudioInfos.Length; i++){if (i != p_index) v_audioInfos[v_index++] = AudioInfos[i];}AudioInfos = new AudioInfo[v_audioInfos.Length];v_audioInfos.CopyTo(AudioInfos, 0);}}private void OnValidate(){foreach (AudioInfo audioInfo in AudioInfos){audioInfo?.ValidateCheck();}}
#endif}
}

AudioInfo.cs

using UnityEngine;
using System.Collections;
using System.Linq;
using System;namespace Tools.AudioManagerAPI
{/// <summary>/// 音頻信息/// </summary>[System.Serializable]public class AudioInfo{[Header("必要組件")][Tooltip("AudioClip組件"), SerializeField] private AudioClip TheAudioClip;[Header("必要屬性")][Tooltip("音頻名稱"), SerializeField] private string AudioName;[Tooltip("音頻音量,默認為1(值屬于[0,1])"), Range(0, 1), SerializeField] private float Volume = 1;[Tooltip("音頻播放速度,默認為1(值屬于[-3,3])"), Range(-3, 3), SerializeField] private float Pitch = 1;[Tooltip("立體聲位置,默認為0(值屬于[-1,1]),若為-1則完全為左聲道,若為1則完全為右聲道"), Range(-1, 1), SerializeField] private float StereoPan = 0;[Tooltip("音頻優(yōu)先級,默認為128(值屬于[0,256])"), Range(0, 256), SerializeField] private int Priority = 128;[Tooltip("是否在場景啟動時進行播放,默認為true"), SerializeField] private bool PlayOnAwake = true;[Tooltip("是否循環(huán)播放,默認為false"), SerializeField] private bool Loop;[Tooltip("是否忽略總音量影響,默認為false"), SerializeField] private bool IgnoreTotalVolume;[Header("立體聲過渡屬性")][Tooltip("是否啟用立體聲過渡,默認為false"), SerializeField] private bool StereoTransition;[Tooltip("立體聲過渡的每幀時間間隔,默認為0.5(值屬于[0.1,5])"), Range(.1f, 5), SerializeField] private float StereoTransitionTimeSpan = 0.5f;[Tooltip("立體聲過渡值集合"), SerializeField] private float[] StereoTransitionValues;/// <summary>/// 音頻名稱/// </summary>public string mAudioName { get => AudioName; set => AudioName = value; }/// <summary>/// 音頻音量,默認為1(值屬于[0,1])/// </summary>public float mVolume{get { return Volume; }set { if (value >= 0 && value <= 1) Volume = value; }}/// <summary>/// 音頻播放速度,默認為1(值屬于[-3,3])/// </summary>public float mPitch{get { return Pitch; }set { if (value >= -3 && value <= 3) Pitch = value; }}/// <summary>/// 立體聲位置,默認為0(值屬于[-1,1]),若為-1則完全為左聲道,若為1則完全為右聲道/// </summary>public float mStereoPan{get { return StereoPan; }set { if (value >= -1 && value <= 1) StereoPan = value; }}/// <summary>/// 音頻優(yōu)先級,默認為128(值屬于[0,256])/// </summary>public int mPriority{get { return Priority; }set { if (value >= 0 && value <= 256) Priority = value; }}/// <summary>/// 是否在場景啟動時進行播放,默認為true/// </summary>public bool mPlayOnAwake { get => PlayOnAwake; set => PlayOnAwake = value; }/// <summary>/// 是否循環(huán)播放,默認為false/// </summary>public bool mLoop { get => Loop; set => Loop = value; }/// <summary>/// 是否啟用立體聲過渡,默認為false/// </summary>public bool mStereoTransition { get => StereoTransition; set => StereoTransition = value; }/// <summary>/// 立體聲過渡的每幀時間間隔,默認為0.5(值屬于[0.1,5])/// </summary>public float mStereoTransitionTimeSpan{get { return StereoTransitionTimeSpan; }set { if (value >= 0.1f && value <= 5) StereoTransitionTimeSpan = value; }}/// <summary>/// 立體聲過渡值集合/// </summary>public float[] mStereoTransitionValues{get => StereoTransitionValues;set => StereoTransitionValues = value;}/// <summary>/// AudioSource組件/// </summary>public AudioSource mAudioSource { get => audioSource; set => audioSource = value; }/// <summary>/// 立體聲過渡協(xié)程/// </summary>public IEnumerator mStereoPanTransitionCoroutine { get => stereoPanTransitionCoroutine; }/// <summary>/// 是否忽略總音量影響,默認為false/// </summary>public bool mIgnoreTotalVolume { get => IgnoreTotalVolume; set => IgnoreTotalVolume = value; }private AudioSource audioSource;//AudioSource組件private AudioManager audioManager;//音頻管理器private bool isInit;//是否完成初始化private IEnumerator stereoPanTransitionCoroutine;//立體聲過渡協(xié)程private float actualVolume;//實際音量private Action<float> totalVolumeChangedEvent;//總音量更改事件對象/// <summary>/// 將指定的AudioSource組件信息記錄在新的AudioInfo實例中并返回它/// <para>p_audioSource:指定的AudioSource組件</para>/// <para>返回值:新的AudioInfo實例</para>/// </summary>public static AudioInfo Record(AudioSource p_audioSource){AudioInfo v_audioInfo = new AudioInfo();if (p_audioSource != null){v_audioInfo.TheAudioClip = p_audioSource.clip;v_audioInfo.Volume = p_audioSource.volume;v_audioInfo.Pitch = p_audioSource.pitch;v_audioInfo.StereoPan = p_audioSource.panStereo;v_audioInfo.Priority = p_audioSource.priority;v_audioInfo.PlayOnAwake = p_audioSource.playOnAwake;v_audioInfo.Loop = p_audioSource.loop;v_audioInfo.audioSource = p_audioSource;}return v_audioInfo;}public AudioInfo(){isInit = false;InitToDefault();}/// <summary>/// 播放音頻/// </summary>public void Play(){if (audioSource != null && !audioSource.isPlaying){if (!IgnoreTotalVolume){if (actualVolume < 0 || actualVolume > 1) actualVolume = Volume;audioSource.volume = actualVolume;}else actualVolume = -1;audioSource.Play();}}/// <summary>/// 暫停音頻播放/// </summary>public void Pause(){if (audioSource != null && audioSource.isPlaying){audioSource.Pause();audioSource.volume = Volume;}}/// <summary>/// 綁定音頻管理器/// <para>p_audioManager:音頻管理器</para>/// <para>聲明1:若有需要可通過該方法將當前的AudioInfo與指定的音頻管理器進行綁定</para>/// <para>聲明2:綁定后將自動向指定的音頻管理器添加當前的AudioInfo</para>/// </summary>public void BindAudioManager(AudioManager p_audioManager){audioManager = p_audioManager;if (audioManager != null){audioManager.mTotalVolumeChangedEvents -= totalVolumeChangedEvent;audioManager.mTotalVolumeChangedEvents += totalVolumeChangedEvent;}}/// <summary>/// 初始化為默認值/// </summary>public void InitToDefault(){if (!isInit){TheAudioClip = null;AudioName = "Audio";Volume = 1;Pitch = 1;StereoPan = 0;StereoTransitionValues = null;StereoTransitionTimeSpan = 0.5f;Priority = 128;StereoTransition = false;PlayOnAwake = true;Loop = false;audioSource = null;stereoPanTransitionCoroutine = StereoPanTransition();totalVolumeChangedEvent = (val) => TotalVolumeChangedEvent(val);actualVolume = -1;}}/// <summary>/// 將當前AudioInfo實例中的信息配置給指定的AudioSource組件/// <para>p_audioSource:指定的AudioSource組件</para>/// </summary>public void ShareTo(AudioSource p_audioSource){if (p_audioSource != null){p_audioSource.clip = TheAudioClip;p_audioSource.volume = Volume;p_audioSource.pitch = Pitch;p_audioSource.panStereo = StereoPan;p_audioSource.priority = Priority;p_audioSource.playOnAwake = PlayOnAwake;p_audioSource.loop = Loop;}}/// <summary>/// 將指定的AudioSource組件信息存儲在當前AudioInfo實例中/// <para>p_audioSource:指定的AudioSource組件</para>/// </summary>public void SelfRecord(AudioSource p_audioSource){if (p_audioSource != null){TheAudioClip = p_audioSource.clip;Volume = p_audioSource.volume;Pitch = p_audioSource.pitch;StereoPan = p_audioSource.panStereo;Priority = p_audioSource.priority;PlayOnAwake = p_audioSource.playOnAwake;Loop = p_audioSource.loop;audioSource = p_audioSource;}}// 總音量更改事件// p_totalVolume:總音量// 若不忽略總音量影響,通過調(diào)用該事件將基于總音量和當前音量換算實際音量數(shù)值// 當TotleVolume為0時,實際音量為0;// 當TotleVolume為1或不屬于[0,1)時,實際音量為Volume;// 當TotleVolume屬于(0,1)時,實際音量為Volume * TotalVolumeprivate void TotalVolumeChangedEvent(float p_totalVolume){if (!IgnoreTotalVolume){if (p_totalVolume == 0) actualVolume = 0;else if (p_totalVolume > 0 && p_totalVolume < 1) actualVolume = Volume * p_totalVolume;else actualVolume = Volume;//運行時修改AudioSource音量if (audioSource != null) audioSource.volume = actualVolume;}else actualVolume = -1;}//立體聲過渡協(xié)程private IEnumerator StereoPanTransition(){int currentIndex = 0;while (true){if (audioSource == null || !StereoTransition || StereoTransitionValues == null || StereoTransitionValues.Length == 0)yield break;audioSource.panStereo = StereoTransitionValues[currentIndex];yield return new WaitForSeconds(StereoTransitionTimeSpan);currentIndex = (currentIndex + 1) % StereoTransitionValues.Length;if (currentIndex == 0) StereoTransitionValues = StereoTransitionValues.Reverse().ToArray<float>();}}#if UNITY_EDITOR[NonSerialized] private bool isAudioClipLog;private bool isAudioNameLog;/// <summary>/// Inspector面板的數(shù)據(jù)更改檢測/// </summary>public void ValidateCheck(){AudioClipCheck();AudioNameCheck();}//AudioClip檢測private void AudioClipCheck(){if (TheAudioClip == null){if (!isAudioClipLog){Debug.LogWarning("Component: <b><color=orange>TheAudioClip</color></b> is null.");isAudioClipLog = true;}}else isAudioClipLog = false;}//AudioName檢測private void AudioNameCheck(){if (String.IsNullOrEmpty(AudioName)){if (!isAudioNameLog){Debug.LogWarning("Property: <b><color=orange>AudioName</color></b> is empty.");isAudioNameLog = true;}}else isAudioNameLog = false;}
#endif}
}

AudioSourcePool.cs?

using System.Collections.Generic;
using UnityEngine;namespace Tools.AudioManagerAPI
{/// <summary>/// AudioSource組件池/// </summary>public class AudioSourcePool{/// <summary>/// 空閑的AudioSource數(shù)量/// </summary>public int mFreeCount { get => audioSources.Count; }private Stack<AudioSource> audioSources;//AudioSource組件集合private AudioManager audioManager;//AudioManager組件private AudioInfo defaultAudioInfo;//默認的AudioInfo/// <summary>/// 獲取實例(單例模式)/// </summary>public static AudioSourcePool GetInstance(){return Handler.instance;}/// <summary>/// 綁定音頻管理器/// <para>p_audioManager:音頻管理器</para>/// </summary>public void BindAudioManager(AudioManager p_audioManager){if (p_audioManager != null) audioManager = p_audioManager;}/// <summary>/// 獲取AudioSource組件/// <para>返回值:AudioSource組件</para>/// </summary>public AudioSource Get(){return DoGet();}/// <summary>/// 獲取AudioSource組件并按照指定的AudioInfo為之配置屬性/// <para>p_audioInfo:指定的AudioInfo</para>/// <para>返回值:AudioSource組件</para>/// </summary>public AudioSource Get(AudioInfo p_audioInfo){AudioSource v_audioSource = DoGet();p_audioInfo?.ShareTo(v_audioSource);return v_audioSource;}/// <summary>/// 歸還指定的AudioSource組件/// <para>p_audioSource:指定的AudioSource組件</para>/// </summary>public void Return(AudioSource p_audioSource){if (p_audioSource != null){CleanAudioSource(p_audioSource);audioSources.Push(p_audioSource);}}class Handler{public static AudioSourcePool instance = new AudioSourcePool();}private AudioSourcePool(){audioSources = new Stack<AudioSource>();defaultAudioInfo = new AudioInfo();}//獲取AudioSource組件的執(zhí)行邏輯private AudioSource DoGet(){if (audioManager == null) return null;AudioSource v_audioSource = null;while (v_audioSource == null){if (audioSources.Count == 0) GenerateAudioSource();v_audioSource = audioSources.Pop();}return v_audioSource;}//生成AudioSource組件private void GenerateAudioSource(){if (audioManager?.gameObject != null){AudioSource v_audioSource = audioManager.gameObject.AddComponent<AudioSource>();audioSources.Push(v_audioSource);}}//清洗AudioSource組件private void CleanAudioSource(AudioSource p_audioSource){defaultAudioInfo.ShareTo(p_audioSource);}}
}

NumberRange.cs

using System.Collections.Generic;
using System.Linq;namespace Tools.AudioManagerAPI
{/// <summary>/// 數(shù)值范圍數(shù)組工具類/// </summary>public static class NumberRange{/// <summary>/// 獲取指定范圍內(nèi)指定步長的Float數(shù)值數(shù)組/// <para>p_start:起始值</para>/// <para>p_end:終點值</para>/// <para>p_step:步長值</para>/// <para>[ContainsEnd]:是否包括終點值,默認為false</para>/// <para>返回值:Float[]</para>/// </summary>public static float[] FloatRange(float p_start, float p_end, float p_step, bool ContainsEnd = false){if (!ContainsEnd) return DoFloatRange(p_start, p_end, p_step).ToArray();else{List<float> result = DoFloatRange(p_start, p_end, p_step).ToList();result.Add(p_end);return result.ToArray();}}//獲取指定范圍內(nèi)指定步長的Float數(shù)值數(shù)組的執(zhí)行邏輯static IEnumerable<float> DoFloatRange(float p_start, float p_end, float p_step){for (float i = p_start; i <= p_end; i += p_step){yield return i;}}}
}

界面展示

演示效果

自定義Unity組件AudioManager

資源下載

GitHub_AudioManager? ??百度網(wǎng)盤

如果這篇文章對你有幫助,請給作者點個贊吧!?

http://m.risenshineclean.com/news/65799.html

相關(guān)文章:

  • 個人網(wǎng)站公安備案流程seo技巧是什么
  • 怎樣進行公司網(wǎng)站建設(shè)企業(yè)網(wǎng)站模板源碼
  • 施工企業(yè)資質(zhì)包括哪些優(yōu)化大師手機版下載安裝app
  • 知名網(wǎng)站制作全包怎么建自己的網(wǎng)站?
  • 文化建設(shè)的具體措施seo是什么崗位簡稱
  • 重慶哪家在做網(wǎng)站建設(shè)競價廣告
  • 網(wǎng)站在哪里搜索北京seo包年
  • 鎮(zhèn)江網(wǎng)站建設(shè)找思創(chuàng)網(wǎng)絡(luò)今日頭條熱榜
  • 南京越城建設(shè)集團有限公司網(wǎng)站小紅書kol推廣
  • 佛山網(wǎng)站排名推廣有沒有永久免費crm
  • 個人網(wǎng)站備案容易嗎最近最新新聞
  • 萬網(wǎng)網(wǎng)站空間服務(wù)范圍及費用seo的形式有哪些
  • 拉薩網(wǎng)站制作公司新余seo
  • 長沙市網(wǎng)站推廣公司推廣計劃書范文
  • 網(wǎng)站抓取壓力高重慶排名優(yōu)化整站優(yōu)化
  • 全國哪個餐飲品牌的網(wǎng)站做的好處百度關(guān)鍵詞屏蔽
  • 國內(nèi)互聯(lián)網(wǎng)大廠有哪些合肥seo建站
  • 短視頻素材網(wǎng)站免費大推薦短視頻seo營銷系統(tǒng)
  • 學(xué)校網(wǎng)站建設(shè)方案模板下載表白網(wǎng)站制作
  • 網(wǎng)站建設(shè)需要編程嗎個人怎么注冊自己的網(wǎng)站
  • asp網(wǎng)站跳轉(zhuǎn)瀏覽器如何給公司做網(wǎng)絡(luò)推廣
  • 做pc端的網(wǎng)站首頁尺寸是多少網(wǎng)絡(luò)營銷渠道類型有哪些
  • 青島做視頻的網(wǎng)站設(shè)計引擎優(yōu)化seo是什么
  • 響應(yīng)式網(wǎng)站用什么技術(shù)做百度搜索廣告
  • 11108給換成119333做網(wǎng)站太原高級seo主管
  • 昆明免費網(wǎng)站制作網(wǎng)絡(luò)運營工作內(nèi)容
  • 蘇州網(wǎng)站建設(shè)價格seo排名優(yōu)化關(guān)鍵詞
  • 怎么查看網(wǎng)站誰做的北京網(wǎng)絡(luò)推廣有哪些公司
  • wordpress博客美化百度關(guān)鍵詞優(yōu)化系統(tǒng)
  • 做爰全國網(wǎng)站金融網(wǎng)站推廣圳seo公司