将方法移动到另一个类时无法生成声音

本文关键字:声音 方法 移动 另一个 | 更新日期: 2023-09-27 17:56:34

所以对于初学者来说,我想说下面的代码是有效的。但它的结构不是我想要的:

public AudioClip pickup;
void OnTriggerEnter(Collider collider)
{
    //Trigger for pickups
    if (collider.gameObject.CompareTag("Pickup"))
    {
        AudioSource audio = GetComponent<AudioSource>();
        audio.PlayOneShot(pickup);
    }
}

但是我想将类一分为二,并让播放器控制器(上面写的一部分)用于调用名为"LevelClass"的新类中的函数,该函数将容纳拾取方法,如下所示:

public void collidePickup(Collider collider)
{
    collider.gameObject.SetActive(false);
    AudioSource audio = GetComponent<AudioSource>();
    audio.PlayOneShot(pickup);
}

并让播放器控制器像这样调用函数:

 level.collidePickup(collider);

我还将声音文件与脚本链接在一起,以便它可以播放声音。通过测试,我确定问题是由音频源部分引起的,因为它找不到要使用的音频源。我能做些什么,以便能够在关卡类而不是播放器控制器中使用音频源的实例?

将方法移动到另一个类时无法生成声音

您应该能够像这样将对音频源的引用传递到函数中。

public void collidePickup(Collider collider,ref AudioSource audio)
{
    collider.gameObject.SetActive(false)
    audio.PlayOneShot(pickup);
}

然后,您只需要在调用时将音频源传递给函数即可。

您应该知道,每个音频源都会根据其位置发出声音,并使用多普勒效应参数及其刚体相对速度。
另请注意,每个音频源一次只能播放一个剪辑。

解决方法之一是为要在游戏中播放的每个声音创建一个带有 AudioSource 的新游戏对象(从音频管理器对象的预制件或从代码),并立即销毁它,超时等于音频长度。

public void collidePickup(Collider collider) 
{
    collider.gameObject.SetActive(false);
    PlaySoundAt(pickup, collider.transform.position);
}
private static void PlaySoundAt(AudioClip sound, Vector3 position) 
{
    var go = new GameObject("PickupSound");
    go.transform.position = position;
    var source = go.AddComponent<AudioSource>();
    source.PlayOneShot(sound);
    Destroy(source, sound.length);
}