J'ai cette erreur et je ne sais pas trop pourquoi ... J'ai essayé de la chercher, les gens disent de créer un objet de la classe ou de créer des méthodes statiques ... mais je suis Je ne sais pas comment.
Voici mon code ci-dessous:
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);
}
}
}
Vous devriez rendre vos membres audioSounds et minTime statiques:
public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
Mais je considérerais plutôt d'utiliser des objets singleton au lieu de membres statiques:
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);
}
}
}
Je suppose que vous obtenez l'erreur en accédant à audioSounds
et minTime
, n'est-ce pas?
Le problème est que vous ne pouvez pas accéder à instance members
de static methods
. Cela signifie qu'une méthode statique est une méthode qui n'existe qu'une seule fois et qui peut être utilisée par tous les autres objets (si son modificateur d'accès le permet).
Les membres d'instance, en revanche, sont créés pour chaque instance de l'objet. Ainsi, si vous créez dix instances, comment le moteur d’exécution pourra-t-il connaître la liste audioSounds
à laquelle il doit accéder?
Comme d’autres l’ont dit, associez audioSounds
à minTime
ou faites de votre méthode une méthode d’instance si votre conception le permet.
playSound est une méthode statique, c'est-à-dire qu'elle existe lorsque le programme est chargé. audioSounds et minTime sont des variables d'instance SoundManager, ce qui signifie qu'elles existeront dans une instance de SoundManager. Comme vous n'avez pas créé d'instance de SoundManager, audioSounds n'existe pas (ou bien, mais vous ne disposez pas d'une référence à un objet SoundManager pour le voir).
Pour résoudre votre problème, vous pouvez soit rendre audioSounds statique:
public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
ils seront donc créés et pourront être référencés de la même manière que PlaySound. Vous pouvez également créer une instance de SoundManager à partir de votre méthode:
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;
}
}
playSound est une méthode statique dans votre classe, mais vous vous référez à des membres tels que audioSounds
ou minTime
qui ne sont pas déclarés static
. Ils auraient donc besoin d'un SoundManager sm = new SoundManager();
. fonctionner comme sm.audioSounds
ou sm.minTime
respectivement
Solution:
public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
Faites de vos variables audioSounds
et minTime
des variables statiques, comme vous les utilisez dans une méthode statique (playSound
).
Le marquage d'une méthode par static
empêche l'utilisation de membres (instances) non statiques dans cette méthode.
Pour en savoir plus, lisez ceci SO QA: