在 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");
}
我正在尝试在 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");
}