2016-04-28 50 views
1

我想在Vuforia中渲染對象時播放聲音剪輯。我在Vuforia的論壇中發現了一個solution,但它並不適合我,實際上Unity就是這樣。當模型在Vuforia Unity3D渲染時播放音頻

的解決方案包括在改變文件\資產\ Vuforia \腳本\ DefaultTrackableEventHandler.cs從Vuforia的源代碼:

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() and child.audio.Stop();被叫做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>()錯了嗎?

是否有替代方案?

回答

1

有一個非常簡單的替代方案。將audiosource添加到對象,並確保在喚醒和循環播放時進行檢查。

並且在跟蹤發現設置您的gameobject活躍真實,在跟蹤丟失將它設置爲false。

0

我在前一個答案的幫助下解決了這個問題。我選中Play on Awake添加了音頻資源到3D對象。然後我使音頻播放OnTrackingFound()訪問圖像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"); 
}