我尝试了一切,但无法启动并运行。目前我正在使用 Unity3d 2021.3.9f 和 Vuforia 10.14.4 进行测试。
我的目标是跟踪 ImageTarget,每次找到 ImageTarget 时,显式的 GameObjects 应该缩放到预定义的值(GameObjects 平滑地缩放,而不仅仅是在那里)。当 ImageTarget 丢失时,游戏对象应该消失并且脚本应该重置/停止。当再次找到 ImageTarget 时,游戏对象应该再次缩放,就像第一次一样。
但是...
当我在 GameObject 上添加 C# 脚本(在更新中它从 value1 缩放到 value2)时,脚本会在 Unity 启动后立即启动 - 无论是否找到 ImageTarget。而且它永远不会重置值,因此当再次找到 ImageTarget 时,脚本不会从头开始执行,并且不再执行 GameObject 的缩放动画。
我真的不知道如何处理这个问题。是否有任何教程讨论新的 DefaultObserverEventHandler 。我还尝试嵌入(待缩放的)GameObject,并将其 ScaleUP 脚本附加在 DefaultObserverEventHandler(在 INSPECTOR 中)中,但无法通过在 FOUND 或 LOST 上激活和停用来实现所需的结果。
我真的很感激任何提示/帮助 - 这将是非常棒的。
最好的,米拉
要实现
OnTrackingFound
的 OnTrackingLost
和 DefaultObserverEventHandler
事件的行为,您可以执行以下步骤(请参阅 向目标 Vuforia Unity 添加内容
DefaultObserverEventHandler
GameObject
,例如通过检查器作为 public
属性OnTrackingFound
类中的 OnTrackingLost
和 DefaultObserverEventHandler
方法并实现您的行为对于缩放,我建议使用协程而不是
Update
函数。但是,将 bool
与 Update
结合使用也应该有效。我还没有测试过这段代码,但它可能看起来像这样:
using UnityEngine;
using Vuforia;
using System.Collections;
public class ImgTargetHandler: DefaultObserverEventHandler
{
// Object to be put on image target and scaled
public GameObject targetObj;
// Target scale (Set in inspector)
public Vector3 targetScale = new Vector3(2.0f, 2.0f, 2.0f);
// Default scale of object
public Vector3 defaultScale = new Vector3(1.0f, 1.0f, 1.0f);
// Duration of scaling (Set in inspector)
public float duration = 2.0f;
// Overwrite OnTrackingFound
protected override void OnTrackingFound()
{
base.OnTrackingFound();
// Custom behavior when tracking found (e.g. spawn object and scale)
StartCoroutine(ScaleObject());
}
// Overwrite OnTrackingLost
protected override void OnTrackingLost()
{
base.OnTrackingLost();
// Custom behavior when tracking lost (e.g. make obj disappear)
targetObj.SetActive(false);
}
// Coroutine to scale the object over time
IEnumerator ScaleObject()
{
// Enable object again
targetObj.SetActive(true);
// Reset to default scale
targetObj.localScale = defaultScale;
// Track passed time
float elapsedTime = 0.0f;
// As long as passed time smaller than specified duration
while (elapsedTime < duration)
{
// Calculate the current scale based on the elapsed time and set it
float t = elapsedTime / duration;
targetObj.localScale = Vector3.Lerp(defaultScale, targetScale, t);
// Increased elapsed time
elapsedTime += Time.deltaTime;
yield return null;
}
// Set the final scale as lerp does not hit final value exactly
targetObj.localScale = targetScale;
}
}