首先,对于初学者,我想说下面的代码有效。但它的结构并不是我想要的:
public AudioClip pickup;
void OnTriggerEnter(Collider collider)
{
//Trigger for pickups
if (collider.gameObject.CompareTag("Pickup"))
{
AudioSource audio = GetComponent<AudioSource>();
audio.PlayOneShot(pickup);
}
}
但是我想将这个类分成两部分并让玩家控制器(上面写的一部分)用来调用一个名为&#39; LevelClass&#39;的新类的函数。这将容纳拾取方法如下:
public void collidePickup(Collider collider)
{
collider.gameObject.SetActive(false);
AudioSource audio = GetComponent<AudioSource>();
audio.PlayOneShot(pickup);
}
让玩家控制器像这样调用函数:
level.collidePickup(collider);
我还将声音文件与脚本相关联,以便播放声音。从测试开始,我确定问题是在AudioSource部分引起的,因为它找不到要使用的音频源。有什么我可以这样做,以便我能够在levelclass而不是playercontroller中使用audiosource的实例?
答案 0 :(得分:0)
您应该能够将对音频源的引用传递给这样的函数。
public void collidePickup(Collider collider,ref AudioSource audio)
{
collider.gameObject.SetActive(false)
audio.PlayOneShot(pickup);
}
然后你只需要在调用它时将AudioSource传递给它。
答案 1 :(得分:0)
你应该知道,每个AudioSource根据它的位置发出声音,并使用多普勒效应参数及其刚体相对速度。
另请注意,每个AudioSource一次只能播放一个剪辑。
其中一个解决方案是在游戏中创建一个带有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);
}