using System; using System.Linq; using UnityEngine; using Wwise.Wooduan.Config; using Wwise.Wooduan.Core; using Wwise.Wooduan.Tools; namespace Wwise.Wooduan.Components { [Serializable] public class AnimationAudioEvent { public AnimationClip clip; public AK.Wwise.Event audioEvent; public float time; public AnimationAudioState triggerOn = AnimationAudioState.All; } [AddComponentMenu("Wwise/AnimationSound")] [DisallowMultipleComponent] public class AnimationSound : AkComponent { public GameObject emitter; public AnimationAudioEvent[] animationAudioEvents; private AnimationAudioState _currentAudioState = AnimationAudioState.All; public void PostAkEvent(AnimationEvent evt) { var matchingAudioState = (AnimationAudioState) evt.intParameter; if ((matchingAudioState & _currentAudioState) == AnimationAudioState.None) return; AudioManager.PostEvent(evt.stringParameter, emitter, AudioTriggerSource.AnimationSound); } private void Start() { if (!emitter) emitter = gameObject; foreach (var data in animationAudioEvents) { if (!data.clip || data.audioEvent == null) continue; var currentEvents = data.clip.events.ToList(); var newEvent = new AnimationEvent { time = data.time, functionName = "PostAkEvent", stringParameter = data.audioEvent.Name, intParameter = (int)data.triggerOn }; currentEvents.Add(newEvent); data.clip.events = currentEvents.ToArray(); } } public override bool IsValid() { return animationAudioEvents.Any(e => e.audioEvent.IsValid()); } } }