[英]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.