Ссылка на объект требуется для доступа к нестационарному элементу
У меня возникла эта ошибка, и я не уверен, почему... Я пытался ее найти, люди говорят создать объект класса или создать методы как статические... но Я не уверен, как это сделать.
Вот мой код ниже:
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:
Статическое ключевое слово в С#