在 Vuforia for Unity3D 中渲染模型时播放音频

Play audio when model renders in Vuforia for Unity3D

我正在尝试在 Vuforia 中渲染对象时播放声音片段。我在 Vuforia 论坛上找到了一个 solution,但对我不起作用,事实上 Unity crahes。

解决方案包括从 Vuforia 的源代码中更改文件 \Assets\Vuforia\Scripts\DefaultTrackableEventHandler.cs

private void OnTrackingFound()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
    Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

    // *** Additional Audio code 
    foreach (Transform child in transform)
    {
        child.audio.Play();
    }

    // Enable rendering:
    foreach (Renderer component in rendererComponents)
    {
        component.enabled = true;
    }

    // Enable colliders:
    foreach (Collider component in colliderComponents)
    {
        component.enabled = true;
    }

    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
}


private void OnTrackingLost()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
    Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

    // *** Additional Audio code
    foreach (Transform child in transform)
    {
        child.audio.Stop();
    }

    // Disable rendering:
    foreach (Renderer component in rendererComponents)
    {
        component.enabled = false;
    }

    // Disable colliders:
    foreach (Collider component in colliderComponents)
    {
        component.enabled = false;
    }

    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}

它只是添加 child.audio.Play();OnTrackingFound()[ 上调用=50=]();OnTrackingLost()

上调用

这在理论上应该可行,我将音频文件添加为图像目标的子文件,但因为“Component.audio”已被弃用,我不得不更改它改为 GetComponent<AudioSource>()。所以代码是这样结束的:

    // *** Additional Audio code
    foreach (Transform child in transform)
    {
        child.GetComponent<AudioSource>().Play();
    }

    // *** Additional Audio code
    foreach (Transform child in transform)
    {
        child.GetComponent<AudioSource>().Stop();
    }

为什么它不起作用?

我是不是用错了GetComponent<AudioSource>()

有其他选择吗?

有一个非常简单的替代方法。将音频源添加到对象并确保选中唤醒播放和循环播放。

并且在跟踪找到时将您的游戏对象设置为 active true,在跟踪丢失时将其设置为 false。

我在之前的回答的帮助下解决了这个问题。我将音频资源添加到选中“唤醒播放”的 3D 对象。然后我让音频播放 OnTrackingFound() 访问 Image Targer 的子项,并执行相反的操作 OnTrackingLost()。代码是这样结束的:

private void OnTrackingFound()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
    Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

    // Enable rendering:
    foreach (Renderer component in rendererComponents)
    {
            component.enabled = true;
    }

    // Enable colliders:
    foreach (Collider component in colliderComponents)
    {
        component.enabled = true;
    }

    // SOLUTION
    if (mTrackableBehaviour.gameObject.GetComponentInChildren<AudioSource>() != null)
    {
        mTrackableBehaviour.gameObject.GetComponentInChildren<AudioSource>().Play();
    }
    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
}


private void OnTrackingLost()
{
    Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
    Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

    // Disable rendering:
    foreach (Renderer component in rendererComponents)
    {
        component.enabled = false;
    }

    // Disable colliders:
    foreach (Collider component in colliderComponents)
    {
        component.enabled = false;
    }

    // SOLUTION
    if (mTrackableBehaviour.gameObject.GetComponentInChildren<AudioSource>() != null)
    {
        mTrackableBehaviour.gameObject.GetComponentInChildren<AudioSource>().Stop();
    }
    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}