Files
ClearTheZone/Assets/SourceFiles/Scripts/MotionAudioController.cs
T

112 lines
3.2 KiB
C#

using UnityEngine;
using System.Collections;
[RequireComponent(typeof(AudioSource))]
public class MotionAudioController : MonoBehaviour
{
[SerializeField] private Transform targetTransform;
[SerializeField] private Animator animator;
[SerializeField] private AudioSource audioSource;
[SerializeField] private Vector3 lastPosition;
[SerializeField, Tooltip("Threshold for movement detection. Adjust as needed.")]
private float movementThreshold = 0.0001f;
[SerializeField, Tooltip("Duration of the fade-out effect in seconds")]
private float fadeOutDuration = 0.5f;
private bool wasMoving = false;
private Coroutine fadeCoroutine;
void Start()
{
// Get the AudioSource attached to this GameObject
audioSource = GetComponent<AudioSource>();
// Find the Animator in sibling or child objects
animator = GetComponentInParent<Animator>();
if (animator != null)
{
targetTransform = animator.transform;
}
else
{
Debug.LogError("No Animator component found in parent or its children.");
}
// Initialize last position
if (targetTransform != null)
{
lastPosition = targetTransform.position;
}
}
void Update()
{
if (targetTransform == null)
{
return;
}
// Check if the object has moved significantly
float movement = Vector3.Distance(targetTransform.position, lastPosition);
bool isMoving = movement > movementThreshold;
if (isMoving && !wasMoving)
{
// If there's a fade-out in progress, stop it
if (fadeCoroutine != null)
{
StopCoroutine(fadeCoroutine);
fadeCoroutine = null;
}
// Reset volume to full
audioSource.volume = 1f;
// Start playing audio only when movement starts
if (!audioSource.isPlaying)
{
audioSource.Play();
}
}
else if (!isMoving && wasMoving)
{
// Start fade-out when movement stops
if (audioSource.isPlaying)
{
// If there's already a fade-out in progress, stop it
if (fadeCoroutine != null)
{
StopCoroutine(fadeCoroutine);
}
fadeCoroutine = StartCoroutine(FadeOut());
}
}
// Update movement state
wasMoving = isMoving;
// Update last position for the next frame
lastPosition = targetTransform.position;
}
private IEnumerator FadeOut()
{
float startVolume = audioSource.volume;
float currentTime = 0;
while (currentTime < fadeOutDuration)
{
currentTime += Time.deltaTime;
audioSource.volume = Mathf.Lerp(startVolume, 0, currentTime / fadeOutDuration);
yield return null;
}
// Ensure volume is zero and stop the audio
audioSource.volume = 0;
audioSource.Stop();
fadeCoroutine = null;
}
}