将方法移动到另一个班级

时间:2016-07-12 22:54:34

标签: c# audio unity3d

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

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的实例?

2 个答案:

答案 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);
}