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

Unity中基于Vuforia图像识别的文本切换功能C#代码求助

实现Unity+Vuforia切换Image Target时同步更新文本面板

没问题,我来帮你搞定这个需求!核心思路就是监听每个Image Target的识别状态变化,当某个目标被成功识别时,自动切换文本面板的内容到对应配置的文本。下面是完整的实现方案:

第一步:编写C#核心脚本

这个脚本会作为一个中心管理器,监听所有Image Target的状态,并根据配置映射更新文本。你可以选择使用UGUI的Text组件或者更流行的TextMeshPro,我会在代码里标注两种情况:

using UnityEngine;
using Vuforia;
using UnityEngine.UI;
// 如果用TextMeshPro,请取消下面的注释并导入TMPro包
// using TMPro;

public class TargetTextUpdater : MonoBehaviour
{
    // 用于配置「Image Target名称-对应文本」的映射关系
    [System.Serializable]
    public class TargetTextPair
    {
        public string targetObjectName; // 填写Image Target的GameObject名称
        [TextArea(3, 5)] // 让输入框更友好,支持多行文本
        public string targetDisplayText;
    }

    [Header("配置区域")]
    public List<TargetTextPair> targetTextMappings;
    public Text uiTextPanel; // 拖入你的UGUI文本面板
    // public TextMeshProUGUI tmproTextPanel; // 如果用TMPro就用这个

    private Dictionary<string, string> textLookupTable; // 优化查找效率的字典

    private void Start()
    {
        // 初始化查找字典,把List转成Dictionary提升性能
        textLookupTable = new Dictionary<string, string>();
        foreach (var pair in targetTextMappings)
        {
            if (!textLookupTable.ContainsKey(pair.targetObjectName))
                textLookupTable.Add(pair.targetObjectName, pair.targetDisplayText);
        }

        // 给所有Image Target注册状态变化监听
        var allTrackables = FindObjectsOfType<TrackableBehaviour>();
        foreach (var trackable in allTrackables)
        {
            trackable.OnTrackableStateChanged += OnTrackableStateChanged;
        }

        // 初始状态显示提示文本
        UpdateDisplayText("等待识别图像目标...");
    }

    private void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
    {
        // 当目标从未识别状态切换到稳定识别状态时
        if ((newStatus == TrackableBehaviour.Status.TRACKED || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) &&
            previousStatus != TrackableBehaviour.Status.TRACKED && previousStatus != TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            string targetName = trackable.gameObject.name; // 用GameObject名称匹配,更直观
            
            // 查找对应文本并更新
            if (textLookupTable.TryGetValue(targetName, out string targetText))
            {
                UpdateDisplayText(targetText);
            }
            else
            {
                UpdateDisplayText($"未找到「{targetName}」的对应文本");
            }
        }
        // 当所有目标都丢失识别时,恢复初始提示
        else if (previousStatus == TrackableBehaviour.Status.TRACKED && newStatus == TrackableBehaviour.Status.NOT_FOUND)
        {
            // 检查是否还有其他目标被识别
            bool hasActiveTarget = false;
            foreach (var trackable in FindObjectsOfType<TrackableBehaviour>())
            {
                if (trackable.CurrentStatus == TrackableBehaviour.Status.TRACKED || 
                    trackable.CurrentStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
                {
                    hasActiveTarget = true;
                    break;
                }
            }

            if (!hasActiveTarget)
            {
                UpdateDisplayText("等待识别图像目标...");
            }
        }
    }

    // 统一更新文本的方法,兼容UGUI和TMPro
    private void UpdateDisplayText(string textContent)
    {
        if (uiTextPanel != null)
            uiTextPanel.text = textContent;
        
        // if (tmproTextPanel != null)
        //     tmproTextPanel.text = textContent;
    }
}

第二步:配置使用脚本

  1. 创建文本面板:在Unity中创建一个UGUI Text(或TextMeshPro - Text)组件,调整好位置、字体大小和样式,放在你想要显示的位置。
  2. 创建管理器对象:新建一个空GameObject,命名为TargetTextManager,把上面的脚本拖到这个对象上。
  3. 配置映射关系:在Inspector的Target Text Updater组件里,点击Target Text Mappings的+号,添加你需要的条目:
    • Target Object Name:填写你场景中Image Target的GameObject名称(必须完全一致,大小写敏感)
    • Target Display Text:填写该目标被识别时要显示的文本
  4. 关联文本面板:把你创建的文本面板组件拖到脚本的Ui Text Panel(或Tmpro Text Panel)字段上。
  5. 测试运行:确保Vuforia的AR Camera配置正确,运行场景,切换不同的Image Target,文本面板就会自动同步更新了!

一些优化和注意事项

  • 性能优化:用Dictionary代替List.Find来查找文本,在目标数量多的时候会更高效。
  • 多目标识别处理:如果你的场景允许多个Image Target同时被识别,当前脚本会显示最后一个被激活的目标文本。如果需要优先显示某个特定目标,可以在状态判断里增加优先级逻辑。
  • 状态判断:脚本里只监听了TRACKED和EXTENDED_TRACKED状态(稳定识别的状态),如果需要在目标刚被检测到(DETECTED状态)就更新文本,可以修改状态判断条件。
  • 文本动画:如果想给文本切换加上动画效果,可以在UpdateDisplayText方法里添加淡入淡出、滑动等动画逻辑。

内容的提问来源于stack exchange,提问作者user11619842

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:23:19