SoundPlayer.cs 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. using UnityEngine;
  3. using Random = UnityEngine.Random;
  4. namespace HQFPSWeapons
  5. {
  6. [Serializable]
  7. public class SoundPlayer : ICloneable
  8. {
  9. public int ClipCount { get { return m_Clips.Count; } }
  10. [SerializeField]
  11. [Reorderable]
  12. private AudioClipList m_Clips = null;
  13. [SerializeField]
  14. [MinMax(0f,1f)]
  15. private Vector2 m_VolumeRange = new Vector2(0.5f, 0.75f);
  16. [SerializeField]
  17. [MinMax(0.5f, 1.5f)]
  18. private Vector2 m_PitchRange = new Vector2(0.9f, 1.1f);
  19. [SerializeField]
  20. [Range(0f, 1f)]
  21. private float m_VolumeMultiplier = 1f;
  22. private int m_LastClipPlayed = -1;
  23. public object Clone()
  24. {
  25. return MemberwiseClone();
  26. }
  27. public void Play(AudioSource audioSource, float volume = 1f)
  28. {
  29. Play(ItemSelection.Method.RandomExcludeLast, audioSource, volume);
  30. }
  31. public void Play(ItemSelection.Method selectionMethod, AudioSource audioSource, float volume = 1f)
  32. {
  33. if(!audioSource || m_Clips.Count == 0)
  34. return;
  35. if(m_LastClipPlayed >= m_Clips.Count || m_LastClipPlayed <= -1)
  36. m_LastClipPlayed = m_Clips.Count - 1;
  37. AudioClip clipToPlay = m_Clips.List.Select(ref m_LastClipPlayed, selectionMethod);
  38. var finalVolume = GetVolume() * volume;
  39. audioSource.pitch = Random.Range(m_PitchRange.x, m_PitchRange.y);
  40. audioSource.PlayOneShot(clipToPlay, finalVolume);
  41. }
  42. /// <summary>
  43. /// Will use the AudioSource.PlayClipAtPoint() method, which doesn't include pitch variation.
  44. /// </summary>
  45. public void PlayAtPosition(ItemSelection.Method selectionMethod, Vector3 position, float volume = 1f)
  46. {
  47. if(m_Clips.Count == 0)
  48. return;
  49. AudioClip clipToPlay = m_Clips.List.Select(ref m_LastClipPlayed, selectionMethod);
  50. AudioSource.PlayClipAtPoint(clipToPlay, position, GetVolume() * volume);
  51. }
  52. public void Play2D(ItemSelection.Method selectionMethod = ItemSelection.Method.RandomExcludeLast, float volume = 1f)
  53. {
  54. if(m_Clips.Count == 0)
  55. return;
  56. AudioClip clipToPlay = m_Clips.List.Select(ref m_LastClipPlayed, selectionMethod);
  57. AudioUtils.Instance.Play2D(clipToPlay, GetVolume() * volume);
  58. }
  59. private float GetVolume()
  60. {
  61. return Random.Range(m_VolumeRange.x, m_VolumeRange.y) * m_VolumeMultiplier;
  62. }
  63. }
  64. }