web-dev-qa-db-fra.com

Une référence d'objet est requise pour accéder à un membre non statique

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);
    }
}
}
21
James Eaton

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

    }
}
32
Max Yankov

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.

7
ath

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

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;
2
devnull69

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:

mot clé statique en c #

1
VS1