diff --git a/Assets/Prefab/PlayerController.prefab b/Assets/Prefab/PlayerController.prefab index dd5d86c..d41516d 100644 --- a/Assets/Prefab/PlayerController.prefab +++ b/Assets/Prefab/PlayerController.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c84566b5ca89a9d052f943353c73777bbe5c5f0e95c9abf13cd20ffdd974ca18 -size 45794 +oid sha256:085084d72bb04099824ed788d05e72e012248b66dec77318c22644255679b5ac +size 46689 diff --git a/Assets/Scripts/BoatController.cs b/Assets/Scripts/BoatController.cs index 239158f..4f5994e 100644 --- a/Assets/Scripts/BoatController.cs +++ b/Assets/Scripts/BoatController.cs @@ -19,6 +19,10 @@ public class BoatController : MonoBehaviour [SerializeField] private bool m_usedebugkeys; + [SerializeField] + private AudioClip[] m_bonkClips; + + void Awake() { rigidBody = GetComponent(); @@ -103,7 +107,7 @@ public class BoatController : MonoBehaviour Debug.Log($"Hitting: {collision.gameObject} Foce: {collision.impulse * ObstacleBounce}"); rigidBody.AddForce(collision.impulse * ObstacleBounce, ForceMode.Impulse); - + SFXPlayer.Play(m_bonkClips); } diff --git a/Assets/Scripts/Player/BoatRowController.cs b/Assets/Scripts/Player/BoatRowController.cs index 6868a09..fc12580 100644 --- a/Assets/Scripts/Player/BoatRowController.cs +++ b/Assets/Scripts/Player/BoatRowController.cs @@ -16,6 +16,8 @@ public class BoatRowController : MonoBehaviour public UnityEvent m_OnRow; public UnityEvent m_OnBrake; public int velocityOverFrames = 8; + + public AudioClip[] m_rowClips; #endregion Inspector Fields #region Private Fields @@ -109,6 +111,7 @@ public class BoatRowController : MonoBehaviour else { //Debug.Log($"Row! ({averageVelocity})"); + SFXPlayer.Play(m_rowClips); m_OnRow.Invoke(averageVelocity); } } diff --git a/Assets/Scripts/SFXPlayer.cs b/Assets/Scripts/SFXPlayer.cs new file mode 100644 index 0000000..67373bb --- /dev/null +++ b/Assets/Scripts/SFXPlayer.cs @@ -0,0 +1,151 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using NaughtyAttributes; +using System.Linq; + +/// +/// +/// +public class SFXPlayer : MonoBehaviour +{ + + private static SFXPlayer instance; + + + #region Inspector Fields + + [SerializeField, MinMaxSlider(-1, 1)] + public Vector2 pitchRange = new Vector2(-0.1f, 0.1f); + + [SerializeField, MinMaxSlider(-1, 1)] + public Vector2 volumeRange = new Vector2(-0.1f, 0.1f); + + + #endregion Inspector Fields + + #region Private Fields + private List m_playingClips = new List(); + #endregion Private Fields + + #region Getters + + #endregion Getters + + + + #region MonoBehaviour Functions + /// + /// OnEnable is called when the object becomes enabled and active. + /// + private void OnEnable() + { + instance = this; + DontDestroyOnLoad(transform.root.gameObject); + } + + /// + /// OnDisable is called when the behaviour becomes disabled. + /// + private void OnDisable() + { + + } + + private void OnDestroy() + { + instance= null; + } + + /// + /// Update is called once per frame + /// + private void Update() + { + + } + + #endregion MonoBehaviour Functions + + #region Class Functionality + + public static void Play(params AudioClip[] clip) + { + CreateInstace(); + instance?.PlaySoundClip(clip); + } + + + public static bool isPlaying(params AudioClip[] clips) + { + + if (instance == null) + return false; + + foreach (AudioClip clip in clips) + if (instance.m_playingClips.Contains(clip)) + return true; + return false; + } + + private static void CreateInstace() + { + if (instance != null) + return; + + GameObject gameObject = new GameObject("SFX Player"); + gameObject.AddComponent(); + } + + + public void PlaySoundClip(params AudioClip[] clips) + { + + + if (clips.Length == 0 || isPlaying(clips)) + return; + + AudioClip selectedClip = clips[Random.Range(0, clips.Length)]; + + GameObject gameObject = new GameObject(selectedClip.name); + gameObject.transform.parent = transform; + + AudioSource source = gameObject.AddComponent(); + source.clip = selectedClip; + + source.volume = 0.8f + Random.Range(volumeRange.x, volumeRange.y); + source.pitch = 1 + Random.Range(pitchRange.y, pitchRange.x); + source.spatialBlend = 0; + + + m_playingClips.AddRange(clips); + source.Play(); + + + StartCoroutine(DestroyAfter(selectedClip.length,gameObject , clips)); + + + } + + private IEnumerator DestroyAfter(float t,GameObject gameObject, params AudioClip[] clips) + { + yield return new WaitForSeconds(t); + m_playingClips.RemoveAll(p => clips.Contains(p)); + Destroy(gameObject); + } + + + + #endregion Class Functionality + + #region Editor Functions + /// + /// Called when the Component is created or Reset from the Inspector + /// + private void Reset() + { + //useful for finding components on creation + } + #endregion Editor Functions + +} \ No newline at end of file diff --git a/Assets/Scripts/SFXPlayer.cs.meta b/Assets/Scripts/SFXPlayer.cs.meta new file mode 100644 index 0000000..c9ec82f --- /dev/null +++ b/Assets/Scripts/SFXPlayer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0a1619328788c745a081292a258f7a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: