using System; using AK.Wwise; using UnityEngine; using Wwise.Wooduan.Core; using Wwise.Wooduan.Tools; namespace Wwise.Wooduan.Components { [RequireComponent(typeof(ParticleSystem))] public class ParticleSound : AkComponent { [Tooltip("The particle playback time to trigger sound")] public float notifyTime; public AK.Wwise.Event audioEvent; [Tooltip("If this component is used to trigger a multi position sound")] public bool syncWithMultiPositionEvent; private ParticleSystem _particle; private float _simulatedPlaybackTime; private bool _isParticleLooping, _soundAlreadyPlayed; private float _particleDuration; private void Awake() { _particle = GetComponent(); } private void OnEnable() { if (!_particle) return; var particle = _particle.main; _isParticleLooping = particle.loop; _particleDuration = particle.duration; } private void Update() { _simulatedPlaybackTime += Time.deltaTime; if (_simulatedPlaybackTime >= notifyTime) TriggerSound(); if (_isParticleLooping && _simulatedPlaybackTime >= _particleDuration) { _simulatedPlaybackTime = 0f; _soundAlreadyPlayed = false; } } private void TriggerSound() { if (audioEvent == null || _soundAlreadyPlayed) return; if (!syncWithMultiPositionEvent) AudioManager.PlaySound(audioEvent.Name, gameObject, AudioTriggerSource.ParticleSound); else { AkMultiPosEvent multiPosEvent; if (AkAmbient.multiPosEventTree.TryGetValue(audioEvent.Id, out multiPosEvent)) { foreach (var akAmbient in multiPosEvent.list) { akAmbient.PlaySound(); } } } if (_isParticleLooping) _soundAlreadyPlayed = true; else enabled = false; } public override bool IsValid() { return audioEvent.IsValid(); } } }