Я пытаюсь контролировать громкость первого аудиоисточника в массиве с помощью ползунка. Проблема в том, что он говорит мне, что нет определения «громкости» в audiosources[0].volume. Скрипт находится в AudioManager из туториала от Brackeys: Tutorial.
//Volumeslider
public void VolumeSlider(float newVolume)
{
Component[] audiosources;
audiosources = GetComponents(typeof(AudioSource));
audiosources[0].volume = newVolume;
Ошибка: «Компонент» не содержит определения для «тома», и не удалось найти доступный метод расширения «том», принимающий первый аргумент типа «Компонент» (вам не хватает директивы использования или ссылки на сборку?) [Сборка -CSharp]csharp(CS1061)
Это мой первый вопрос.





Несмотря на то, что вы правильно извлекли все компоненты AudioSource с помощью GetComponents, поскольку тип массива — Component[], это означает, что каждый отдельный элемент массива имеет тип Component.
Component не имеет определения громкости. Подумайте о чем-то вроде Animator или MeshFilter. Это также подклассы Component, поэтому их можно назначать элементам в вашем массиве. Что произойдет, если вы попытаетесь получить доступ к их volume свойствам?
Вместо этого вы должны быть как можно более конкретными — в этом весь смысл строго типизированного языка, такого как C#. Вы можете сделать это:
var audioSources = GetComponents<AudioSource>();
audioSources[0].volume = newVolume;
Основное отличие заключается в использовании «общей» версии GetComponents (та, что с <угловыми скобками>. Причина в том, что вы фактически получаете массив AudioSource[] правильного типа вместо базового типа Component, который A) не t есть поле, которое вы хотите, и B) необходимо привести к AudioSource, прежде чем вы сможете использовать его по своему усмотрению.
Другие улучшения, которые я сделал: camelCase для имен переменных, предполагаемый тип переменной (var, поэтому вам нужно изменить его только в одном месте, если вам нужно будет использовать другой тип компонента позже. Если вы наведете курсор на var, он скажет вам, что тип на самом деле AudioSource[]), присваивание в той же строке, что и объявление (меньше беспорядка).
Это означает, что индекс (0) не существовал в массиве. Если в массиве нет элемента с номером 0, это означает, что он пуст. Это означает, что ваш вызов GetComponents не вернул компонентов AudioSource. Это означает, что вы должны проверить, действительно ли они у вас есть на объекте. Вы можете сделать это во время выполнения с помощью оператора if, но вам также, вероятно, следует просто посмотреть на игровой объект в инспекторе и убедиться, что он настроен так, как вы ожидаете.
@joseph, в документации (docs.unity3d.com/ScriptReference/GameObject.GetComponents.html) пример: Component[] шарнирные соединения; шарнирные соединения = GetComponents (typeof (HingeJoint)); foreach (шарнирное соединение в шарнирных соединениях) Joint.useSpring = false;
Вы сказали: даже если вы правильно извлекли все компоненты AudioSource с помощью GetComponents, поскольку тип массива — Component[], это означает, что каждый отдельный элемент массива имеет тип Component. Компонент не имеет определения объема. Подумайте о чем-то вроде Animator или MeshFilter. Это также подклассы Component, поэтому их можно назначать элементам в вашем массиве. Что произойдет, если вы попытаетесь получить доступ к свойствам их тома?
Вот мое сомнение: в примере документации они итерировали массив, используя цикл foreach и обращались к элементам массива как HingeJoint и отключали свойство spring HingeJoint. Я новичок, поэтому я в замешательстве. Не могли бы вы развеять мои сомнения, пожалуйста?
Трюк в этом документе — это foreach, который отбрасывает объект. Если вы не используете foreach, вам придется выполнять приведение вручную, например (HingeJoint)component[0]. Это приведение может потерпеть неудачу, и вы можете получить исключение. Им это сходит с рук, потому что они собирают компоненты непосредственно перед сборкой и уверены в их типе.
Спасибо, ваше объяснение действительно помогло мне лучше понять это, но теперь у меня есть ошибка, когда я меняю ползунок, говоря: IndexOutOfRangeException: индекс был за пределами массива. Я не знаю, как это возможно, потому что громкость audioSource[0] и моего ползунка начинаются с 0,2, и возникает ошибка, если я изменю его даже на малейшую величину.