每个 OnTrackingFound Unity + Vuforia 上的 C# ScaleUp Gameobj

问题描述 投票:0回答:1

我尝试了一切,但无法启动并运行。目前我正在使用 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 上激活和停用来实现所需的结果。

我真的很感激任何提示/帮助 - 这将是非常棒的。

最好的,米拉

c# unity-game-engine augmented-reality vuforia gameobject
1个回答
1
投票

要实现

OnTrackingFound
OnTrackingLost
DefaultObserverEventHandler
事件的行为,您可以执行以下步骤(请参阅 向目标 Vuforia Unity 添加内容

  1. 创建一个脚本,该脚本继承
    DefaultObserverEventHandler
  2. 将其附加到您的图像目标
  3. 在跟踪图像时引用您想要缩放的
    GameObject
    ,例如通过检查器作为
    public
    属性
  4. 覆盖
    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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.