You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity与Vuforia脚本报错修复及触屏音频控制需求

Vuforia触屏控制音频脚本报错修复及功能实现

现有脚本代码

using UnityEngine;
using Vuforia;

public class TouchInput_1 : MonoBehaviour, ITrackableEventHandler
{
    private TrackableBehaviour mTrackableBehaviour;
    public GameObject temploMaiaObject; // Reference to the 3D object named "Templo_Maia"
    private AudioSource audioSource;
    private bool isPlaying = false;

    void Start()
    {
        audioSource = temploMaiaObject.GetComponent<AudioSource>();

        // Register this script to trackable event handler
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
    }

    void OnDestroy()
    {
        // Unregister this script from trackable event handler
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.UnregisterTrackableEventHandler(this);
        }
    }

    public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            // Target is detected and being tracked
            Debug.Log("Target is detected!");

            // Enable touch input
            enabled = true;
        }
        else
        {
            // Target is lost or not being tracked
            Debug.Log("Target is lost!");

            // Disable touch input
            enabled = false;

            // Pause audio playback
            if (isPlaying)
            {

检测到的编译错误

SeverityCodeDescriptionProjectFileLineSuppression State
ErrorCS0246找不到类型或命名空间名称“ITrackableEventHandler”(是否缺少 using 指令或程序集引用?)Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs4Active
ErrorCS1513应包含 }Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs54Active
ErrorCS1513应包含 }Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs54Active
ErrorCS1513应包含 }Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs54Active
ErrorCS1513应包含 }Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs54Active
ErrorCS0246找不到类型或命名空间名称“TrackableBehaviour”(是否缺少 using 指令或程序集引用?)Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs6Active
ErrorCS0246找不到类型或命名空间名称“TrackableBehaviour”(是否缺少 using 指令或程序集引用?)Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs32Active
ErrorCS0246找不到类型或命名空间名称“TrackableBehaviour”(是否缺少 using 指令或程序集引用?)Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs32Active
ErrorCS0246找不到类型或命名空间名称“TrackableBehaviour”(是否缺少 using 指令或程序集引用?)Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs16Active
ErrorCS0103当前上下文中不存在名称“TrackableBehaviour”Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs34Active
ErrorCS0103当前上下文中不存在名称“TrackableBehaviour”Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs35Active
ErrorCS0103当前上下文中不存在名称“TrackableBehaviour”Assembly-CSharpM:\IS MOTION PROJECT\PROJETO\AR\Projeto_3D\Projeto_02\Assets\TouchInput_1.cs36Active

功能需求

实现通过触屏控制与Image Target关联的3D物体的音频播放和暂停功能。


解决方案

1. 修复代码未闭合问题

现有脚本存在多处代码块未闭合,补全所有缺失的}并补充暂停音频的逻辑:

// 补全else块内的if逻辑和所有闭合括号
if (isPlaying)
{
    audioSource.Pause();
    // 可选:如果需要在丢失目标时重置播放状态,取消注释下面一行
    // isPlaying = false;
}
} // 闭合if(isPlaying)块
} // 闭合else块
} // 闭合OnTrackableStateChanged方法
} // 闭合整个类

2. 解决Vuforia引用问题

  • 确认Unity项目已正确导入Vuforia AR包:打开Window > Package Manager,搜索Vuforia并安装/更新到稳定版本。
  • 确保脚本挂载在Vuforia Image Target对象上,而非普通GameObject,这样GetComponent<TrackableBehaviour>()才能获取到对应组件。
  • 若使用Vuforia 10+版本,部分API有调整,可尝试替换命名空间引用(仅适用于集成AR Foundation的场景):
    // 替换原using Vuforia;为:
    using UnityEngine.XR.ARFoundation;
    using UnityEngine.XR.ARSubsystems;
    // 同时将TrackableBehaviour替换为ARTrackable,ITrackableEventHandler替换为ITrackableChangedHandler
    

3. 添加触屏控制逻辑

在脚本中添加Update方法,处理触摸输入实现播放/暂停切换:

void Update()
{
    if (Input.touchCount <= 0) return;

    Touch touch = Input.GetTouch(0);
    if (touch.phase != TouchPhase.Began) return;

    Ray ray = Camera.main.ScreenPointToRay(touch.position);
    if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.gameObject == temploMaiaObject)
    {
        if (isPlaying)
        {
            audioSource.Pause();
            isPlaying = false;
        }
        else
        {
            audioSource.Play();
            isPlaying = true;
        }
    }
}

完整修复后的脚本

using UnityEngine;
using Vuforia;

public class TouchInput_1 : MonoBehaviour, ITrackableEventHandler
{
    private TrackableBehaviour mTrackableBehaviour;
    public GameObject temploMaiaObject;
    private AudioSource audioSource;
    private bool isPlaying = false;

    void Start()
    {
        audioSource = temploMaiaObject.GetComponent<AudioSource>();
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour != null)
        {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
    }

    void OnDestroy()
    {
        if (mTrackableBehaviour != null)
        {
            mTrackableBehaviour.UnregisterTrackableEventHandler(this);
        }
    }

    public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            Debug.Log("Target is detected!");
            enabled = true;
        }
        else
        {
            Debug.Log("Target is lost!");
            enabled = false;
            if (isPlaying)
            {
                audioSource.Pause();
                // isPlaying = false; // 可选:丢失目标时重置播放状态
            }
        }
    }

    void Update()
    {
        if (Input.touchCount <= 0) return;

        Touch touch = Input.GetTouch(0);
        if (touch.phase != TouchPhase.Began) return;

        Ray ray = Camera.main.ScreenPointToRay(touch.position);
        if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.gameObject == temploMaiaObject)
        {
            if (isPlaying)
            {
                audioSource.Pause();
                isPlaying = false;
            }
            else
            {
                audioSource.Play();
                isPlaying = true;
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Thales Willian Nogueira da Sil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:05:09