puede - static c#
Se requiere una referencia de objeto para acceder a un miembro no estático (5)
Convierta sus variables audioSounds
y minTime
como variables estáticas, ya que las está utilizando en un método estático ( playSound
).
Marcar un método como static
evita el uso de miembros no estáticos (instancia) en ese método.
Para entender más, por favor lea este SO QA:
Recibo este error y no estoy seguro de por qué ... Traté de buscarlo, la gente está diciendo que cree un objeto de la clase o cree los métodos como estáticos ... pero yo inseguro de cómo
Aquí está mi código a continuación:
public class SoundManager : MonoBehaviour {
public List<AudioSource> audioSounds = new List<AudioSource>();
public double minTime = 0.5;
public static void playSound(AudioClip sourceSound, Vector3 objectPosition, int volume, float audioPitch, int dopplerLevel)
{
bool playsound = false;
foreach (AudioSource sound in audioSounds) // Loop through List with foreach
{
if (sourceSound.name != sound.name && sound.time <= minTime)
{
playsound = true;
}
}
if(playsound) {
AudioSource.PlayClipAtPoint(sourceSound, objectPosition);
}
}
}
Debes hacer que tus miembros de audioSounds y minTime sean estáticos:
public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
Pero consideraría usar objetos singleton en lugar de miembros estáticos:
public class SoundManager : MonoBehaviour
{
public List<AudioSource> audioSounds = new List<AudioSource>();
public double minTime = 0.5;
public static SoundManager Instance { get; private set; }
void Awake()
{
Instance = this;
}
public void playSound(AudioClip sourceSound, Vector3 objectPosition, int volume, float audioPitch, int dopplerLevel)
{
bool playsound = false;
foreach (AudioSource sound in audioSounds) // Loop through List with foreach
{
if (sourceSound.name != sound.name && sound.time <= minTime)
{
playsound = true;
}
}
if(playsound) {
AudioSource.PlayClipAtPoint(sourceSound, objectPosition);
}
}
}
Supongo que obtienes el error al acceder a audioSounds
y minTime
, ¿verdad?
El problema es que no se puede acceder a los instance members
de static methods
instance members
desde static methods
. Lo que esto significa es que, un método estático es un método que existe solo una vez y puede ser usado por todos los demás objetos (si el modificador de acceso lo permite).
Los miembros de instancia, por otro lado, se crean para cada instancia del objeto . Entonces, si crea diez instancias, ¿cómo sabría el tiempo de ejecución de todas estas instancias, a qué lista de audioSounds
debería acceder?
Como han dicho otros, haga que sus audioSounds
y minTime
estáticos, o podría hacer que su método sea un método de instancia, si su diseño lo permite.
playSound es un método estático en su clase, pero se refiere a miembros como audioSounds
o minTime
que no se declaran static
por lo que requerirían un SoundManager sm = new SoundManager();
para operar como sm.audioSounds
o sm.minTime
respectivamente
Solución:
public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
playSound es un método estático que significa que existe cuando se carga el programa. audioSounds y minTime son variables de instancia de SoundManager, lo que significa que existirán dentro de una instancia de SoundManager. No ha creado una instancia de SoundManager, por lo que no existe audioSounds (o sí, pero no tiene una referencia a un objeto SoundManager para verlo).
Para resolver su problema, puede hacer que los sonidos de audio sean estáticos:
public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
por lo tanto, se crearán y podrán ser referenciados de la misma manera que lo será PlaySound. Alternativamente, puede crear una instancia de SoundManager desde su método:
SoundManager soundManager = new SoundManager();
foreach (AudioSource sound in soundManager.audioSounds) // Loop through List with foreach
{
if (sourceSound.name != sound.name && sound.time <= soundManager.minTime)
{
playsound = true;
}
}