You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.3 KiB
C#

6 months ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[HelpURL("https://app.gitbook.com/s/5zKO0EvOjzUDeT2aiFk3/auto-hand/extras/collision-sounds")]
public class CollisionSound : MonoBehaviour{
[Tooltip("The layers that cause the sound to play")]
public LayerMask collisionTriggers = ~0;
[Tooltip("Source to play sound from")]
public AudioSource source;
[Tooltip("Source to play sound from")]
public AudioClip clip;
[Space]
[Tooltip("Source to play sound from")]
public AnimationCurve velocityVolumeCurve = AnimationCurve.Linear(0, 0, 1, 1);
public float volumeAmp = 0.8f;
public float velocityAmp = 0.5f;
public float soundRepeatDelay = 0.2f;
Rigidbody body;
bool canPlaySound = true;
Coroutine playSoundRoutine;
private void Start() {
body = GetComponent<Rigidbody>();
//So the sound doesn't play when falling in place on start
StartCoroutine(SoundPlayBuffer(1f));
}
private void OnDisable(){
if (playSoundRoutine != null)
StopCoroutine(playSoundRoutine);
}
void OnCollisionEnter(Collision collision) {
if (body == null)
return;
if(canPlaySound && collisionTriggers == (collisionTriggers | (1 << collision.gameObject.layer))) {
if(source != null && source.enabled){
if (collision.collider.attachedRigidbody == null || collision.collider.attachedRigidbody.mass > 0.0000001f){
if(clip != null || source.clip != null)
source.PlayOneShot(clip == null ? source.clip : clip, velocityVolumeCurve.Evaluate(collision.relativeVelocity.magnitude * velocityAmp) * volumeAmp);
if (playSoundRoutine != null)
StopCoroutine(playSoundRoutine);
playSoundRoutine = StartCoroutine(SoundPlayBuffer());
}
}
}
}
IEnumerator SoundPlayBuffer() {
canPlaySound = false;
yield return new WaitForSeconds(soundRepeatDelay);
canPlaySound = true;
playSoundRoutine = null;
}
IEnumerator SoundPlayBuffer(float time) {
canPlaySound = false;
yield return new WaitForSeconds(time);
canPlaySound = true;
playSoundRoutine = null;
}
}