首页 > 解决方案 > 创建声音管理器阵列以供多次使用

问题描述

我正在尝试创建音频管理器,这样我就可以轻松地将音频音效添加到我想要的任何脚本中。我有 3 个脚本,一个坐在空游戏对象 (SoundManager) 上,另一个是 unmono 脚本,它只有我想要更改的音频数据,第三个是我正在尝试应用的脚本AudioSource 到它(现在它只是我的角色攻击)我一直在尝试使用我在网上找到的一些教程。他们中的大多数使用“查找”组件,我知道这不是使用它们的最佳方式。我试图不让音频源组件显示在声音管理器游戏对象上,我试图在我想要使用 SoundManager Array ref 的特定字符上创建它。

SoundData 脚本

using UnityEngine.Audio;
using UnityEngine;

[System.Serializable]
public class Sound{


public string name;
public AudioClip clip;

[HideInInspector]
public AudioSource source;

public bool loop;
public bool playOnstart;

[Range(0f,1f)]
public int spatialBlend;

public int minDistance;
public int maxDistance;
public AudioRolloffMode audioMode;
}

SoundManager 脚本

 using UnityEngine.Audio;
 using UnityEngine;
 using System;

public class SoundManager : MonoBehaviour
{
public Sound[] sounds;
 //  public AudioSource audioSource;


private void Awake()
{
    foreach (Sound s in sounds)
    {
       
       //     audioSource = gameObject.AddComponent<AudioSource>();
            //s.source = gameObject.AddComponent<AudioSource>();
            s.source.clip = s.clip;
            s.source.playOnAwake = s.playOnstart;
            s.source.loop = s.loop;
            s.source.spatialBlend = s.spatialBlend;
            s.source.minDistance = s.minDistance;
            s.source.maxDistance = s.maxDistance;
            s.source.rolloffMode = s.audioMode;
        

  
    }
}

public void Play()
{
    //right now i dont have anything that workd


    
}

}

在我试图引用 Soundmanager 并尝试 Getcommponent 音频脚本的第三个脚本中,但它在大多数情况下都给了我 NullArgumant

标签: c#unity3daudio

解决方案


您不需要在第二个脚本的开头引用 AudioSource 组件,我相信这里发生的是 Unity 找不到将 AudioSource 组件附加到的游戏对象。因此,要解决此问题,您可以使用:

在您的 SoundData 脚本中;

using UnityEngine.Audio;
using UnityEngine;

[System.Serializable]
public class Sound{


public string name;
public AudioClip clip;

[HideInInspector]
// Took out the AudioSource = source; instead...
// ...used a GameObject so we can add the component.
public GameObject sourceGameObject;

public bool loop;
public bool playOnstart;

[Range(0f,1f)]
public int spatialBlend;

public int minDistance;
public int maxDistance;
public AudioRolloffMode audioMode;

在您的 SoundManager 脚本中。

public Sound[] sounds;

void Awake(){
    foreach (Sound s in sounds){
        s.sourceGameObject = someGameObject;
        AudioSource audioSource = s.sourceGameObject.AddComponent<AudioSource>();
        // rest of your code.
    }
}

您可以改用 audioSource 变量来编写其余代码。

希望这可以解决您的问题。


推荐阅读