using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using Random = UnityEngine.Random; [AddComponentMenu("KFAttachments/Utils/Animation Random Sound")] public class AnimationRandomSound : MonoBehaviour, ISerializationCallbackReceiver { [SerializeField] public List audioSourcesEditor; [NonSerialized] private List audioSources; [HideInInspector] [SerializeField] private List list_groupnames; [HideInInspector] [SerializeField] private List list_clips; [HideInInspector] [SerializeField] private List list_sources; [HideInInspector] [SerializeField] private List list_clip_indices; [HideInInspector] [SerializeField] private int serializedCount = 0; public void OnAfterDeserialize() { audioSources = new List(); for (int i = 0; i < serializedCount; i++) { int index = (i == 0 ? 0 : list_clip_indices[i - 1]); int count = list_clip_indices[i] - index; audioSources.Add(new AudioSourceGroup() { groupName = list_groupnames[i], clips = list_clips.Skip(index).Take(count).ToArray(), source = list_sources[i], }); } } public void OnBeforeSerialize() { if (audioSourcesEditor != null && audioSourcesEditor.Count > 0) { serializedCount = 0; list_groupnames = new List(); list_clips = new List(); list_clip_indices = new List(); list_sources = new List(); for (int i = 0; i < audioSourcesEditor.Count; i++) { list_groupnames.Add(audioSourcesEditor[i].groupName); list_clips.AddRange(audioSourcesEditor[i].clips); list_sources.Add(audioSourcesEditor[i].source); list_clip_indices.Add(list_clips.Count); serializedCount++; } } } public void PlayRandomClip(string group) { if (audioSources == null) return; //#if NotEditor // Log.Out($"play random clip {group}, groups: {string.Join("| ", audioSources.Select(g => g.groupName + $"clips: {string.Join(", ", g.clips.Select(c => c.name))}"))}"); //#endif AudioSourceGroup asg = null; foreach (var audioSourceGroup in audioSources) { if (audioSourceGroup.groupName == group) { asg = audioSourceGroup; break; } } if (asg == null) { return; } int random = Random.Range(0, asg.clips.Length); //asg.source.clip = asg.clips[random]; asg.source.PlayOneShot(asg.clips[random]); //#if NotEditor // Log.Out($"play clip {asg.clips[random].name}"); //#endif } }