Advertisement
Staggart

Snap Audio Emitter To Spline (Unity)

Feb 28th, 2024 (edited)
782
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.46 KB | Gaming | 0 0
  1. using UnityEngine;
  2. using UnityEngine.Splines;
  3.  
  4. public class SnapAudioEmitterToSpline : MonoBehaviour
  5. {
  6.     public SplineContainer splineContainer;
  7.     public AudioSource audioSource;
  8.    
  9.     private AudioListener audioListener;
  10.     private float m_audioDistanceNormalized;
  11.    
  12.     private void Reset()
  13.     {
  14.         audioSource = GetComponentInParent<AudioSource>();
  15.     }
  16.    
  17.     private void Update()
  18.     {
  19.         if (audioSource)
  20.         {
  21.             UpdateAudio();
  22.         }
  23.     }
  24.    
  25.     private void UpdateAudio()
  26.     {
  27.         if (!audioListener) audioListener = FindObjectOfType<AudioListener>();
  28.         if (!audioListener) return;
  29.  
  30.         if (!splineContainer) return;
  31.  
  32.         Vector3 earPosition = audioListener.transform.position;
  33.  
  34.         //Ear position in the spline's local-space
  35.         earPosition = splineContainer.transform.InverseTransformPoint(earPosition);
  36.        
  37.         SplineUtility.GetNearestPoint(splineContainer.Spline, earPosition, out var nearestPoint, out _, SplineUtility.PickResolutionMin, 1);
  38.  
  39.         audioSource.dopplerLevel = 0;
  40.         audioSource.transform.position = splineContainer.transform.TransformPoint(nearestPoint);
  41.     }
  42.    
  43.     private void OnDrawGizmosSelected()
  44.     {
  45.         if (audioSource)
  46.         {
  47.             Gizmos.DrawSphere(audioSource.transform.position, 1f);
  48.             Gizmos.DrawWireSphere(audioSource.transform.position, audioSource.maxDistance);
  49.         }
  50.     }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement