using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Invector.vCharacterController.AI { public class vAINoiseManager : MonoBehaviour { static vAINoiseManager _instance; public static vAINoiseManager Instance { get { if (_instance == null) _instance = FindObjectOfType(); if (_instance == null) { var noiseManager = new GameObject("AI Noise Manager"); var newInstance = noiseManager.AddComponent(); newInstance.noises = new List(); _instance = newInstance; } return _instance; } } public delegate void NoiseOperator(vNoise noise); public event NoiseOperator OnAddNoise; public event NoiseOperator OnRemoveNoise; /// /// List of all noises that is listening /// public List noises;// { get; protected set; } public List noiseListeners = new List(); public void AddListener(vAINoiseListener listener) { if (!noiseListeners.Contains(listener)) { OnAddNoise += listener.AddNoise; OnRemoveNoise += listener.RemoveNoise; noiseListeners.Add(listener); } } public void RemoveListener(vAINoiseListener listener) { if(noiseListeners.Contains(listener)) { OnAddNoise -= listener.AddNoise; OnRemoveNoise -= listener.RemoveNoise; noiseListeners.Remove(listener); } } public void AddNoise(vNoise noise) { if (noises==null) noises = new List(); if (noises.Contains(noise)) { noises[noises.IndexOf(noise)].AddDuration(noise.duration); } else { noise.onFinishNoise.AddListener(RemoveNoise); noises.Add(noise); OnAddNoise?.Invoke(noise); } if (!noise.isPlaying) StartCoroutine(noise.Play()); } public void RemoveNoise(vNoise noise) { if (noises == null) noises = new List(); if (noises.Contains(noise)) { OnRemoveNoise?.Invoke(noise); noises.Remove(noise); } } protected virtual void OnDestroy() { _instance = null; } } }