【问题标题】:Changing volume of one AudioSource in an array with a slider in Unity在 Unity 中使用滑块更改数组中一个 AudioSource 的音量
【发布时间】:2020-12-20 07:53:03
【问题描述】:

我正在尝试使用滑块控制阵列中第一个音频源的音量。问题是它告诉我在 audiosources[0].volume 中没有“音量”的定义。该脚本位于来自 Brackeys 的教程的 AudioManager 中:Tutorial

//Volumeslider
    public void VolumeSlider(float newVolume)
    {
        Component[] audiosources;
        audiosources = GetComponents(typeof(AudioSource));
        audiosources[0].volume = newVolume;

错误:“组件”不包含“卷”的定义,并且找不到接受“组件”类型的第一个参数的可访问扩展方法“卷”(您是否缺少 using 指令或程序集引用? ) [Assembly-CSharp]csharp(CS1061)

这是我的第一个问题。

【问题讨论】:

    标签: c# unity3d visual-studio-code


    【解决方案1】:

    即使您已经正确检索到带有GetComponents 的所有AudioSource 组件,由于数组的类型是Component[],这意味着数组的每个单独元素都是Component 类型。

    Component 没有音量定义。想想AnimatorMeshFilter 之类的东西。这些也是Component 的子类,因此可以将它们分配给数组中的元素。如果您尝试访问他们的 volume 属性会怎样?

    你应该做的是,尽可能具体——这就是像 C# 这样的强类型语言的全部意义所在。你可以这样做:

    var audioSources = GetComponents<AudioSource>();
    audioSources[0].volume = newVolume;
    

    主要区别在于使用GetComponents 的“通用”版本(带有 的那个。原因是,您实际上得到了一个数组,AudioSource[] 的类型正确,而不是基本的@ 987654333@ 类型,其中 A) 没有你想要的字段,B) 需要转换为 AudioSource 才能使用它。

    我做的其他改进:变量名称的驼峰式,推断变量类型(var,因此如果您以后需要使用另一种组件,则只需在一个地方更改它。如果您将鼠标悬停在var它会告诉你类型实际上是AudioSource[]),赋值与声明在同一行(不那么混乱。)

    【讨论】:

    • 谢谢,您的解释确实帮助我更好地理解它,但现在我在更改滑块时出现错误:IndexOutOfRangeException: Index was outside the bounds of the array。我不知道这是怎么可能的,因为 audioSource[0] 的音量和我的滑块都从 0.2 开始,如果我稍微改变它就会出现错误。
    • 这意味着数组中不存在索引(0)。如果数组在 0 处没有元素,则表示它为空。这意味着您的 GetComponents 调用没有返回任何 AudioSource 组件。这意味着你必须检查你是否真的在对象上有任何东西。您可以在运行时使用 if 语句执行此操作,但您也应该只查看检查器中的游戏对象并确保其设置符合您的预期。
    • @joseph,在文档中 (docs.unity3d.com/ScriptReference/GameObject.GetComponents.html) 示例:组件 [] 铰链接头;铰链接头 = GetComponents(类型(铰链接头)); foreach (HingeJoint 中的铰链关节) joint.useSpring = false;
    • 您说:即使您已经使用 GetComponents 正确检索了所有 AudioSource 组件,但由于数组的类型是 Component[],这意味着数组的每个单独元素都是 Component 类型。组件没有体积的定义。想想像 Animator 或 MeshFilter 这样的东西。这些也是 Component 的子类,因此可以将它们分配给数组中的元素。如果您尝试访问它们的卷属性会发生什么?
    • 该文档中的技巧是foreach,它会转换对象。如果您不使用 foreach,则必须手动进行转换,例如 (HingeJoint)component[0]。那个演员可能会失败,你会得到一个例外。他们侥幸逃脱,因为他们在之前收集了组件并且对类型有把握。
    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2022-10-24
    • 1970-01-01
    • 2020-12-07
    • 2018-03-13
    • 1970-01-01
    相关资源
    最近更新 更多