Estoy tratando de hacer un reproductor de audio en Unity. Primero creé un ResourceManager, que tiene una matriz AudioClip[] .
public class ResourceManager : MonoBehaviour { public AudioSource audioSrc; public AudioClip[] clips; private int trackNum = 0; public void Awake() { audioSrc = GetComponent<AudioSource>(); audioSrc.Stop(); ...omitted... public void LoadClip() { audioSrc.clip = clips[trackNum]; } } Para que aparezcan en el cuadro de arrastrar y soltar Clips .
Sin embargo, quiero que la matriz AudioClip sea estática en ResourceManager , de modo que otras secuencias de comandos (por ejemplo, PlayPause.cs ) puedan acceder a los clips forma estática (a través de llamadas a funciones). Pero el problema es que una vez que hago los clips estáticos, el arrastrar y soltar desaparece. .
¿Hay alguna manera de arreglar eso? ¿O hay algunos mejores patrones de diseño? Gracias.
Puede, por ejemplo, simplemente hacer
public class ResourceManager : MonoBehaviour { ... // This is the one in the Inspector // Usually I keep the Inspector private and only provide public access // where needed via properties [SerializeField] private AudioClip[] clips; // This will be set in Awake to the ones from the Inspector // readonly for others, only this class can assign it public static AudioClip[] Clips { get; private set; } public void Awake() { Clips = clips; ... } } La alternativa sugerida es hacer que ResourceManager sea el llamado singleton como, por ejemplo,
public class ResourceManager : MonoBehaviour { // Here you store your own instance reference // and provide public readonly access public static ResourceManager Instance { get; private set; } [SerializeField] private AudioClip[] clips; public AudioClip[] Clips => clips; ... public void Awake() { // Make sure only one instance exists at a time if(Instance && Instance != this) { Destroy(gameObject); return; } _instance = this; // optional: Don't destroy this instance when the scene is switched // Careful: Make sure this applies also to the AudioSource instance! // For now I assume it is either attached to this object or a child // if not simply do the same DontDestroyOnLoad on it as well DontDestroyOnLoad (this.gameObject); ... } public void LoadClip() { audioSrc.clip = clips[trackNum]; } } Y luego acceda a todas partes ReaourcesManager.Instance.Clips
O una alternativa integrada al singleton es usar FindObjectOfType para que cualquier otra secuencia de comandos en la Escena pueda simplemente acceder
FindObjectOfType<ResourcesManager>().clipssin que tengas que cambiar nada ;)
Excepto como dije que lo haría
[SerializeField] private AudioClip[] clips; public IReadonlyList<AudioClip> Clips => clips;dependiendo un poco, por supuesto, de qué es exactamente lo que quiere hacer con los clips, pero de esta manera la matriz no puede ser alterada por ningún otro script