From db7df3ba69364a80ef71265d377c947314fa0d6b Mon Sep 17 00:00:00 2001 From: Ben Vinegar <2153+benvinegar@users.noreply.github.com> Date: Wed, 25 Sep 2024 11:58:57 -0400 Subject: [PATCH] Sounds effects for pickups (#37) * Use OneShot, multiple audio clips * Pickup prefabs specify sound effects to play when picked up --- Assets/Prefabs/Pickups/HotdogPickup.prefab | 3 ++- Assets/Prefabs/Pickups/MoneyPickup.prefab | 1 + Assets/Prefabs/Pickups/MozartPickup.prefab | 3 ++- .../Prefabs/Pickups/SkateboardPickup.prefab | 1 + Assets/Prefabs/Pickups/UmbrellaPickup.prefab | 3 ++- Assets/Scenes/BattleScene.unity | 4 ++- Assets/Scripts/Managers/SoundManager.cs | 19 ++++++++++++--- Assets/Scripts/Pickups/PickupBase.cs | 6 +++++ Assets/Sounds/damageTaken.mp3.meta | 2 +- Assets/Sounds/pickup.wav | Bin 0 -> 15538 bytes Assets/Sounds/pickup.wav.meta | 23 ++++++++++++++++++ Assets/Sounds/powerUp.wav | Bin 0 -> 26488 bytes Assets/Sounds/powerUp.wav.meta | 23 ++++++++++++++++++ 13 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 Assets/Sounds/pickup.wav create mode 100644 Assets/Sounds/pickup.wav.meta create mode 100644 Assets/Sounds/powerUp.wav create mode 100644 Assets/Sounds/powerUp.wav.meta diff --git a/Assets/Prefabs/Pickups/HotdogPickup.prefab b/Assets/Prefabs/Pickups/HotdogPickup.prefab index 530768f..a155f3b 100644 --- a/Assets/Prefabs/Pickups/HotdogPickup.prefab +++ b/Assets/Prefabs/Pickups/HotdogPickup.prefab @@ -46,9 +46,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c95e69fb4311c48dbb4e870057afff87, type: 3} m_Name: m_EditorClassIdentifier: + _pickupSound: {fileID: 8300000, guid: 9f38fc745c8b64043b4a6a8d9ab8deab, type: 3} _scoreValue: 50 _effectDuration: 0 - _pickupType: 0 + _effectText: _healAmount: 30 --- !u!212 &2235537914035941605 SpriteRenderer: diff --git a/Assets/Prefabs/Pickups/MoneyPickup.prefab b/Assets/Prefabs/Pickups/MoneyPickup.prefab index e158a3c..7d37b0a 100644 --- a/Assets/Prefabs/Pickups/MoneyPickup.prefab +++ b/Assets/Prefabs/Pickups/MoneyPickup.prefab @@ -46,6 +46,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3fac4098d86d04d2184062b7557edeff, type: 3} m_Name: m_EditorClassIdentifier: + _pickupSound: {fileID: 8300000, guid: 9f38fc745c8b64043b4a6a8d9ab8deab, type: 3} _scoreValue: 5000 _effectDuration: 0 _effectText: +5000 points! diff --git a/Assets/Prefabs/Pickups/MozartPickup.prefab b/Assets/Prefabs/Pickups/MozartPickup.prefab index d1a3f41..9a35d54 100644 --- a/Assets/Prefabs/Pickups/MozartPickup.prefab +++ b/Assets/Prefabs/Pickups/MozartPickup.prefab @@ -46,9 +46,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d09e6ada1b1694a018fc52fac6c953da, type: 3} m_Name: m_EditorClassIdentifier: + _pickupSound: {fileID: 8300000, guid: 4a45c3d67edb843519890127da0f36f3, type: 3} _scoreValue: 25 _effectDuration: 0 - _pickupType: 4 + _effectText: --- !u!212 &2235537914035941605 SpriteRenderer: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Pickups/SkateboardPickup.prefab b/Assets/Prefabs/Pickups/SkateboardPickup.prefab index 9e14db9..ddc45e3 100644 --- a/Assets/Prefabs/Pickups/SkateboardPickup.prefab +++ b/Assets/Prefabs/Pickups/SkateboardPickup.prefab @@ -46,6 +46,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: caa06202f60e64f4f941f50f13d10dd8, type: 3} m_Name: m_EditorClassIdentifier: + _pickupSound: {fileID: 8300000, guid: 4a45c3d67edb843519890127da0f36f3, type: 3} _scoreValue: 50 _effectDuration: 10 _effectText: diff --git a/Assets/Prefabs/Pickups/UmbrellaPickup.prefab b/Assets/Prefabs/Pickups/UmbrellaPickup.prefab index 8263694..bac6c68 100644 --- a/Assets/Prefabs/Pickups/UmbrellaPickup.prefab +++ b/Assets/Prefabs/Pickups/UmbrellaPickup.prefab @@ -46,9 +46,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f1a09b23dd4b74942ae1cb83b2a925d2, type: 3} m_Name: m_EditorClassIdentifier: + _pickupSound: {fileID: 8300000, guid: 4a45c3d67edb843519890127da0f36f3, type: 3} _scoreValue: 150 _effectDuration: 10 - _pickupType: 2 + _effectText: _damageReduction: 0.5 --- !u!212 &2235537914035941605 SpriteRenderer: diff --git a/Assets/Scenes/BattleScene.unity b/Assets/Scenes/BattleScene.unity index 6a22310..32026fa 100644 --- a/Assets/Scenes/BattleScene.unity +++ b/Assets/Scenes/BattleScene.unity @@ -30320,6 +30320,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 8a84c6500790949f9ac1a9421f7c7876, type: 3} m_Name: m_EditorClassIdentifier: + _enemyHitSound: {fileID: 8300000, guid: f7b9b52a0dd6e49ebb93103f2f4c8e9f, type: 3} + _pickupSound: {fileID: 8300000, guid: 9f38fc745c8b64043b4a6a8d9ab8deab, type: 3} _hitSoundCooldown: 0.1 --- !u!4 &1686016597 Transform: @@ -30346,7 +30348,7 @@ AudioSource: m_Enabled: 1 serializedVersion: 4 OutputAudioMixerGroup: {fileID: 0} - m_audioClip: {fileID: 8300000, guid: f7b9b52a0dd6e49ebb93103f2f4c8e9f, type: 3} + m_audioClip: {fileID: 0} m_PlayOnAwake: 0 m_Volume: 0.4 m_Pitch: 1 diff --git a/Assets/Scripts/Managers/SoundManager.cs b/Assets/Scripts/Managers/SoundManager.cs index 20b6e14..63f79fd 100644 --- a/Assets/Scripts/Managers/SoundManager.cs +++ b/Assets/Scripts/Managers/SoundManager.cs @@ -4,7 +4,11 @@ public class SoundManager : MonoBehaviour { - private AudioSource _enemyHitSound; + private AudioSource _audioSource; + + [SerializeField] + private AudioClip _enemyHitSound; + private float _timeOfLastHitSound = 0f; [SerializeField] @@ -30,7 +34,12 @@ void Awake() public void Init() { - _enemyHitSound = GetComponent(); + _audioSource = GetComponent(); + } + + public void PlayPickupSound(AudioClip clip) + { + _audioSource.PlayOneShot(clip); } public void PlayHitSound() @@ -41,7 +50,11 @@ public void PlayHitSound() return; } - _enemyHitSound.Play(); + // NOTE: don't use PlayOneShot on hit sounds because so many hits can + // happen that it can cause the audio source to die (no more sound for + // remainder of game session). Better to play manually. + _audioSource.clip = _enemyHitSound; + _audioSource.Play(); _timeOfLastHitSound = Time.time; } } diff --git a/Assets/Scripts/Pickups/PickupBase.cs b/Assets/Scripts/Pickups/PickupBase.cs index 1ad2676..b9229c8 100644 --- a/Assets/Scripts/Pickups/PickupBase.cs +++ b/Assets/Scripts/Pickups/PickupBase.cs @@ -3,6 +3,9 @@ public class PickupBase : MonoBehaviour { + [SerializeField] + protected AudioClip _pickupSound; + [SerializeField] [Tooltip("How much score this pickup is worth")] protected int _scoreValue = 50; @@ -28,6 +31,9 @@ private void OnTriggerEnter2D(Collider2D other) OnCollect(player); + if (_pickupSound != null) + SoundManager.Instance.PlayPickupSound(_pickupSound); + Player.Instance.SpawnPlayerText(GetEffectText()); // Destroy the pickup diff --git a/Assets/Sounds/damageTaken.mp3.meta b/Assets/Sounds/damageTaken.mp3.meta index 7709183..c7186aa 100644 --- a/Assets/Sounds/damageTaken.mp3.meta +++ b/Assets/Sounds/damageTaken.mp3.meta @@ -11,7 +11,7 @@ AudioImporter: compressionFormat: 1 quality: 1 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Sounds/pickup.wav b/Assets/Sounds/pickup.wav new file mode 100644 index 0000000000000000000000000000000000000000..21ec260171fab3165fe2a24311029fcdea6d63e6 GIT binary patch literal 15538 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 literal 0 HcmV?d00001 diff --git a/Assets/Sounds/pickup.wav.meta b/Assets/Sounds/pickup.wav.meta new file mode 100644 index 0000000..e289cfd --- /dev/null +++ b/Assets/Sounds/pickup.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 9f38fc745c8b64043b4a6a8d9ab8deab +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 1 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Sounds/powerUp.wav b/Assets/Sounds/powerUp.wav new file mode 100644 index 0000000000000000000000000000000000000000..ae629cb4f386681a16fa1f213de41aa2bcb94adf GIT binary patch literal 26488 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 YXNv<