referencia puede propiedad método inicializador hacer estáticos campo c# .net oop member static

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:

Palabra clave estática en c #

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; } }