将方法移动到另一个类时无法生成声音
本文关键字:声音 方法 移动 另一个 | 更新日期: 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);
}