簡體   English   中英

在 Vuforia for Unity3D 中渲染模型時播放音頻

[英]Play audio when model renders in Vuforia for Unity3D

我正在嘗試在 Vuforia 中渲染對象時播放聲音剪輯。 我在 Vuforia 論壇中找到了解決方案,但對我不起作用,實際上 Unity 崩潰了。

解決方案包括更改 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()child.audio.Stop()調用 OnTrackingLost()調用

這在理論上應該有效,我將音頻文件添加為 Image Target 的子文件,但由於“ 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,在跟蹤丟失時將其設置為 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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM