Ссылка на объект требуется для доступа к нестационарному элементу

У меня возникла эта ошибка, и я не уверен, почему... Я пытался ее найти, люди говорят создать объект класса или создать методы как статические... но Я не уверен, как это сделать.

Вот мой код ниже:

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

Ответ 1

Вы должны сделать свои элементы audioSounds и minTime статическими:

public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;

Но я бы подумал вместо этого использовать вместо него элементы singleton:

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

    }
}

Ответ 2

Я предполагаю, что вы получили ошибку при доступе к audioSounds и minTime, правильно?

Проблема в том, что вы не можете получить доступ к instance members из static methods. Это означает, что статический метод - это метод, который существует только один раз и может использоваться всеми другими объектами (если это разрешает доступ к модификатору).

Члены экземпляра, с другой стороны, создаются для каждого экземпляра объекта. Итак, если вы создадите десять экземпляров, как бы среда выполнения узнала обо всех этих экземплярах, к какому списку audioSounds он должен иметь доступ?

Как и другие, сделайте свой статический текст audioSounds и minTime, или вы можете сделать свой метод методом экземпляра, если это позволяет его дизайн.

Ответ 3

playSound - это статический метод, который означает, что он существует, когда программа загружена. audioSounds и minTime - это переменная экземпляра SoundManager, то есть они будут существовать в экземпляре SoundManager. Вы не создали экземпляр SoundManager, поэтому audioSounds не существует (или он делает, но у вас нет ссылки на объект SoundManager, чтобы увидеть это).

Чтобы решить вашу проблему, вы можете либо сделать audioSounds static:

public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;

чтобы они были созданы и могут быть указаны так же, как и PlaySound. В качестве альтернативы вы можете создать экземпляр SoundManager из вашего метода:

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

Ответ 4

playSound - это статический метод в вашем классе, но вы имеете в виду такие элементы, как audioSounds или minTime, которые не объявлены static, поэтому для работы SoundManager sm = new SoundManager(); требуется sm.audioSounds или sm.minTime соответственно

Решение:

public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;

Ответ 5

Сделайте переменные audioSounds и minTime в качестве статических переменных, поскольку вы используете их в статическом методе (playSound).

Маркировка метода как static предотвращает использование нестатических (экземпляров) элементов в этом методе.

Чтобы понять больше, прочитайте этот SO Q:

Статическое ключевое слово в С#