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