C# 在Vuforia for Unity3D中渲染模型时播放音频

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

我尝试在Vuforia中渲染对象时播放声音片段。我在Vuforia论坛上找到了一个解决方案,但对我来说不起作用,事实上是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");
}
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函数打开和关闭它