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

Unity+Vuforia:ImageTarget识别时GameObject平滑缩放问题求助

解决思路与代码实现

1. 重构缩放脚本(核心修改)

把原来在Update里自动执行的缩放逻辑改成外部触发式,添加启动、重置方法,避免启动后自动运行:

using UnityEngine;

public class SmoothScale : MonoBehaviour
{
    // 预设缩放参数
    public Vector3 startScale = Vector3.one * 0.5f;
    public Vector3 targetScale = Vector3.one;
    public float scaleSpeed = 2f;

    private bool isScaling = false;
    private Vector3 currentScale;

    void Awake()
    {
        // 初始隐藏物体并设置初始缩放
        gameObject.SetActive(false);
        currentScale = startScale;
        transform.localScale = currentScale;
    }

    void Update()
    {
        // 仅在缩放状态开启时执行平滑缩放
        if (isScaling)
        {
            currentScale = Vector3.Lerp(currentScale, targetScale, scaleSpeed * Time.deltaTime);
            transform.localScale = currentScale;

            // 接近目标值时停止缩放(避免无限循环)
            if (Vector3.Distance(currentScale, targetScale) < 0.01f)
            {
                isScaling = false;
                transform.localScale = targetScale;
            }
        }
    }

    // 外部调用:开始缩放流程
    public void StartScaling()
    {
        gameObject.SetActive(true);
        currentScale = startScale;
        transform.localScale = currentScale;
        isScaling = true;
    }

    // 外部调用:重置并隐藏物体
    public void ResetAndHide()
    {
        isScaling = false;
        gameObject.SetActive(false);
        currentScale = startScale;
        transform.localScale = currentScale;
    }
}

2. 绑定ImageTarget的追踪状态

不需要直接修改DefaultObserverEventHandler的Inspector激活/失活,而是通过监听追踪事件来调用缩放脚本的方法,有两种方式:

方式一:重写DefaultObserverEventHandler

创建一个继承自DefaultObserverEventHandler的脚本,挂载到ImageTarget上:

using UnityEngine;
using Vuforia;

public class ImageTargetScaleHandler : DefaultObserverEventHandler
{
    public SmoothScale targetScaleScript;

    protected override void OnTrackingFound()
    {
        base.OnTrackingFound();
        // 识别到目标时启动缩放
        targetScaleScript?.StartScaling();
    }

    protected override void OnTrackingLost()
    {
        base.OnTrackingLost();
        // 丢失目标时重置并隐藏
        targetScaleScript?.ResetAndHide();
    }
}

方式二:直接绑定UnityEvent(新版Vuforia支持)

如果不想写继承脚本,打开ImageTarget上的DefaultObserverEventHandler Inspector面板,找到On Target Found和On Target Lost这两个UnityEvent:

  • 点击+号,把挂载了SmoothScale脚本的GameObject拖进去
  • 在下拉菜单里选择SmoothScale -> StartScaling()(对应识别到的事件)
  • 同样操作,在On Target Lost里选择SmoothScale -> ResetAndHide()

3. 为什么之前的激活/失活方式无效?

  • 激活GameObject时,脚本的currentScale变量保留了上次缩放的进度,没有重置到初始值,导致再次缩放时直接从中间状态开始
  • 原来的缩放脚本在Update里无条件执行,即使物体隐藏,只要脚本启用就会跑逻辑(虽然物体看不见,但变量一直在变)

关于新版DefaultObserverEventHandler的使用

新版Vuforia的DefaultObserverEventHandler已经把追踪事件封装成了可直接绑定的UnityEvent,不需要复杂教程:

  • 核心就是利用On Target Found和On Target Lost两个回调,直接关联需要执行的方法
  • 如果需要更复杂的逻辑,就继承它重写OnTrackingFound()和OnTrackingLost()方法即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:35:10