Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

[EditorWindow] Al modificar una lista estática de Audioclips no guarda cambios

Iniciado por Yawin, Julio 18, 2016, 01:54:06 AM

Tema anterior - Siguiente tema
¡Hola a todos!
 
Estoy haciendo una ventana de Unit***itor para gestionar la lista de AudioClips de mi SoundManager. Tengo hecha la ventana, tengo hecho que cuando yo asigne un audioclip se guarde en la lista; pero al darle a play se borra la lista. ¿Qué puedo hacer?
 
 
 
------------------------------------------------------------------------------------------------------
 
Estos son los códigos que se ven afectados:
 
 
 
SoundManagerEditor.cs
 

using Unit***itor;
using UnityEngine;
using System.Collections;
public class SoundManagerEditor : EditorWindow
{
[MenuItem("Window/Red Fez Studios/Sound Manager")]
public static void ShowWindow()
{
   EditorWindow.GetWindow(typeof(SoundManagerEditor), false, "Sound Manager");
}
void Update()
{
   Repaint();
}
public int songsArraySize;
public bool songsCollapsed = true;
void OnGUI()
{
   EditorGUILayout.Space();
   EditorGUILayout.Space();
   EditorGUILayout.LabelField("Music List");
   songsArraySize = SoundManager.Songs.Count;
   songsArraySize = EditorGUILayout.IntField("Size", songsArraySize);
   
   if(songsArraySize != SoundManager.Songs.Count)
   {
      while(songsArraySize > SoundManager.Songs.Count)
      {
         SoundManager.Songs.Add(new AudioClip());
      }
      while(songsArraySize < SoundManager.Songs.Count)
      {
         SoundManager.Songs.RemoveAt(SoundManager.Songs.Count-1);
      }
   }
   for(int i = 0; i < SoundManager.Songs.Count; i++)
   {
      SoundManager.Songs = EditorGUILayout.ObjectField("Song "+i,SoundManager.Songs, typeof(AudioClip),false) as AudioClip;
   }
}
}

 
SoundManager.cs
 

public class SoundManager
{
private static Snd_FX instance;
public static List<AudioClip> Songs = new List<AudioClip>(1);
public static void PlayFX(params AudioClip[] clips)
{
   int randomIndex = Random.Range(0, clips.Length);
   GameObject sndFX = new GameObject();
   sndFX.AddComponent<AudioSource>();
   sndFX.AddComponent<Snd_FX>();
   sndFX.transform.name = "SndFX";
   sndFX.GetComponent<Snd_FX>().Play(clips[randomIndex]);
}
public static void PlaySong(int songID)
{
   if(null == instance)
   {
      GameObject sndFX = new GameObject();
      sndFX.AddComponent<AudioSource>();
      sndFX.AddComponent<Snd_FX>();
      sndFX.transform.name = "SndSong";
      Object.DontDestroyOnLoad(sndFX);
      instance = sndFX.GetComponent<Snd_FX>();
   }
   instance.ChangeMusic(SoundManager.Songs[songID]);
}
}

 
 

Los tipos estáticos no pueden ser Serializados, por lo tanto Unity no guardara los Cambios. Te recomiendo no hacer estática la lista, y utilzar un Singleton. 

Hola @Yawin
 
Como te dice francoe, con las variables estaticas no se puede. Pero yo iria un poco mas alla y te diria que "molestarse" en utilizar la libreria Unit***itor (ya sea para crear una ventana o modificar la vista del inspector), si tu unico objetivo es poder modificar los elementos de una simple lista, es una tonteria y perdida de tiempo ... a no ser que tu intencion sea aprender a trabajar con esas clases y hayas empezado con un ejemplo muuuu simple, aunque en este caso tambien tendras que tener en cuenta que debes quitar el modificador static de la variable.

A ver, os cuento:
 
Lo que estoy haciendo es un "plugin" o, mejor dicho, un conjunto de scripts que faciliten a mi equipo de desarrollo la tarea de hacer el videojuego. Mi filosofía al hacer esto es a través de clases con miembros estáticos. Así, por ejemplo, puedes poner "FadeTransition.FadeTo("Escena 1", 5.0f, Color.Black);" y el juego cambia a Escena 1 haciendo un fade a negro. Del mismo modo, ahora mismo hacemos "SoundManager.PlaySong(AudioClip);" para lanzar una canción. Mi idea es que los programadores tengan que poner "SoundManager.PlaySong("w1.scene1");" y este Sound Manager busque en una lista de canciones la que se llame así y la ejecute. De este modo, el sonidista, todo lo que tiene que hacer es abrir el editor del Sound Manager y añadir los AudioClips a medida que los vaya añadiendo al proyecto.
 
Utilizar singletons van totalmente en contra de la filosofía que estoy empleando para hacer esta api. Ni mi script de localización, ni el de guardado/carga de partidas, ni el FadeTransition, ni el SoundManager mantienen nada instanciado durante toda la ejecución para mantener algo cargado en memoria. Para eso ya están los miembros estáticos.
 
Lo que podría hacer es guardar en un fichero el contenido de la lista a medida que el editor la modifique y cargarla al iniciar la ejecución.
 
 
 
Edit: Vale, aunque no he solucionado lo que preguntaba, he obtenido una resolución satisfactoria a mis necesidades. En la carpeta Resources he creado una carpeta llamada Audio y dentro he metido los audios. Luego, hago un Resources.Load<AudioClip>("nombre del audio"); y solucionado.

Etiquetas: