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
相关产品推荐
相关产品推荐

