Unity和Vuforia:目标图像ID和GUI Windows

时间:2017-02-16 10:10:53

标签: c# unity3d augmented-reality vuforia

我正在使用Unity和Vuforia为我的桌面RPG组制作一个秘密项目。现在我遇到了一个缺乏参考的问题,并删除了Vuforia网站上的网页。

目前,我的问题是:我想跟踪最多5个目标图像,并且在扫描时,让每个图像创建自己的个人GUI窗口,跟踪UI中的图像。我有一部分工作,我可以跟踪所有图像,但一次只出现一个窗口。我知道实际的图像是有效的,因为我有包含占位符的3d对象用于调试。

我用作GUI Windows基础的脚本:https://developer.vuforia.com/forum/faq/unity-how-can-i-popup-gui-button-when-target-detected

我认为我的问题在于OnTrackableStateChanged()(第19-32行链接;下面是我的代码28-43)。我需要改变它,以便它可以考虑多个目标图像。然后我再次出错,因为Vuforia的API网站或论坛上的任何引用都已被删除。有没有人对我能做些什么来实现我的目标有所了解?我目前正在考虑使用getID()函数,然后,不知何故,让OnTrackableStateChange()检查更改的ID是否与原始想法不同。但同样,我可能会忽略一个更简单的解决方案。

如果不清楚,我可以尝试更详细一点。下面是我正在使用的代码,它使用上面链接中的组件。感谢您的帮助。 :

using UnityEngine;
using System.Collections;

public class ButtonPopup : MonoBehaviour, Vuforia.ITrackableEventHandler
{

    private Vuforia.TrackableBehaviour mTrackableBehaviour;

    private bool mShowGUIWindow = false;
    private TargetScreenCoords coordinateScript;
    public int ID;
    private Rect mWindowRect;
    public string Name;
    public int Health;
    public string Status;
    public bool Villain;


    void Start()
    {
        mTrackableBehaviour = GetComponent<Vuforia.TrackableBehaviour>();
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);            
        }
    }

    public void OnTrackableStateChanged(
                                    Vuforia.TrackableBehaviour.Status previousStatus,
                                    Vuforia.TrackableBehaviour.Status newStatus)
    {

        if (newStatus == Vuforia.TrackableBehaviour.Status.DETECTED ||
            newStatus == Vuforia.TrackableBehaviour.Status.TRACKED)
        {
            mShowGUIWindow = true;
        }
        else
        {
            mShowGUIWindow = false;

        }
    }

    void OnGUI()
    {
        coordinateScript = GetComponent<TargetScreenCoords>();
        mWindowRect = new Rect(coordinateScript.screenPoint.x, Mathf.Abs(coordinateScript.screenPoint.y), 120, 100);

        if (Villain == true)
        {
            GUI.backgroundColor = Color.red;
        }
        if (Villain == false)
        {
            GUI.backgroundColor = Color.green;
        }
        if (mShowGUIWindow)
        {
            mWindowRect = GUI.Window(ID, mWindowRect, DoMyWindow, "ID:" + ID);
        }
    }

    void DoMyWindow(int windowID)
    {
        GUI.Label(new Rect(10, 20, 100, 60), new GUIContent("Name: " + Name + "\nHealth: " + Health + "\nStatus: " + Status));
        if (GUI.Button(new Rect(10, 70, 100, 20), "Edit Button"))
        {
            print("Got a click");
            Villain = !Villain;
        }

    }
}

再次感谢您的帮助/想法。

1 个答案:

答案 0 :(得分:0)

第一个问题是,如果你想同时追踪这5个目标?如果是,请记住您需要在ARCamera配置中指定它。在场景中的ARCamer对象下将Max Simultaneous Tracked Images设置为5。

在每个ImageTarget下,您还应该有一个Trackable Event Handler脚本。默认情况下为DefaultTrackableEventHandler。在此脚本中,您有2个私有方法OnTrackingFound()OnTrackingLost()。尝试添加第3个foreach循环,您将启用/禁用GUI对象类型(Canvas或类似的东西)。