2016-04-28 75 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"); 
}