C# 在Vuforia for Unity3D中渲染模型时播放音频
我尝试在Vuforia中渲染对象时播放声音片段。我在Vuforia论坛上找到了一个解决方案,但对我来说不起作用,事实上是Unity crahes 解决方案包括更改Vuforia源代码中的文件\Assets\Vuforia\Scripts\DefaultTrackableEventHandler.cs:C# 在Vuforia for Unity3D中渲染模型时播放音频,c#,unity3d,vuforia,C#,Unity3d,Vuforia,我尝试在Vuforia中渲染对象时播放声音片段。我在Vuforia论坛上找到了一个解决方案,但对我来说不起作用,事实上是Unity crahes 解决方案包括更改Vuforia源代码中的文件\Assets\Vuforia\Scripts\DefaultTrackableEventHandler.cs: private void OnTrackingFound() { Renderer[] rendererComponents = GetComponentsInChildren<Re
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");
}
private void OnTrackingFound()
{
Renderer[]rendererComponents=GetComponentsInChildren(true);
Collider[]colliderComponents=GetComponentsInChildren(true);
//***附加音频代码
foreach(变换中的变换子对象)
{
child.audio.Play();
}
//启用渲染:
foreach(渲染器组件中的渲染器组件)
{
component.enabled=true;
}
//启用碰撞器:
foreach(colliderComponents中的碰撞器组件)
{
component.enabled=true;
}
Debug.Log(“Trackable”+mtrackablebehavior.TrackableName+“found”);
}
私有无效OnTrackingLost()
{
Renderer[]rendererComponents=GetComponentsInChildren(true);
Collider[]colliderComponents=GetComponentsInChildren(true);
//***附加音频代码
foreach(变换中的变换子对象)
{
child.audio.Stop();
}
//禁用渲染:
foreach(渲染器组件中的渲染器组件)
{
component.enabled=false;
}
//禁用碰撞器:
foreach(colliderComponents中的碰撞器组件)
{
component.enabled=false;
}
Debug.Log(“Trackable”+mtrackablebehavior.TrackableName+“lost”);
}
它只添加了child.audio.Play()在OnTrackingFound()和child.audio.Stop()上调用在OnTrackingLost()上调用
这在理论上应该是可行的,我将音频文件作为图像目标的子文件添加,但由于“组件。音频”已被弃用,我不得不将其改为GetComponent()
。所以代码的结尾是这样的:
// *** Additional Audio code
foreach (Transform child in transform)
{
child.GetComponent<AudioSource>().Play();
}
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");
}
//***附加音频代码
foreach(变换中的变换子对象)
{
child.GetComponent().Play();
}
及
//***附加音频代码
foreach(变换中的变换子对象)
{
child.GetComponent().Stop();
}
为什么它不起作用
我是否使用了GetComponent()
错误
有替代方案吗?有一个非常简单的替代方案。将音频源添加到对象,并确保已选中“唤醒和循环播放”
在跟踪发现时,将游戏对象的活动设置为true;在跟踪丢失时,将其设置为false 我通过前面的答案解决了这个问题。我将音频资源添加到3D对象,并选中“唤醒时播放”。然后我让音频播放OnTrackingFound()访问图像目标的子对象,然后执行相反的OnTrackingFound()。代码的结尾如下:
// *** Additional Audio code
foreach (Transform child in transform)
{
child.GetComponent<AudioSource>().Play();
}
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");
}
private void OnTrackingFound()
{
Renderer[]rendererComponents=GetComponentsInChildren(true);
Collider[]colliderComponents=GetComponentsInChildren(true);
//启用渲染:
foreach(渲染器组件中的渲染器组件)
{
component.enabled=true;
}
//启用碰撞器:
foreach(colliderComponents中的碰撞器组件)
{
component.enabled=true;
}
//解决方案
if(mtrackablebhavior.gameObject.getComponentChildren()!=null)
{
mtrackablebhavior.gameObject.getComponentChildren().Play();
}
Debug.Log(“Trackable”+mtrackablebehavior.TrackableName+“found”);
}
私有无效OnTrackingLost()
{
Renderer[]rendererComponents=GetComponentsInChildren(true);
Collider[]colliderComponents=GetComponentsInChildren(true);
//禁用渲染:
foreach(渲染器组件中的渲染器组件)
{
component.enabled=false;
}
//禁用碰撞器:
foreach(colliderComponents中的碰撞器组件)
{
component.enabled=false;
}
//解决方案
if(mtrackablebhavior.gameObject.getComponentChildren()!=null)
{
mtrackablebhavior.gameObject.getComponentChildren().Stop();
}
Debug.Log(“Trackable”+mtrackablebehavior.TrackableName+“lost”);
}
这对我不起作用。无论检测状态如何,始终播放音频。是否将此audiosource对象作为目标的子对象。您需要使用imagtreacking found和imagtreacking lost函数打开和关闭它