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#
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;
|
||
|
}
|
||
|
}
|