在Unity增强现实中显示屏幕UI按钮

时间:2015-11-21 05:54:49

标签: unity3d vuforia

我是Unity和Vuforia的新手。我正在尝试创建增强现实体验,用户可以扫描目标标记,它将显示一个可以单击的按钮。

我能够使用子GameObject多维数据集设置ARCamera和ImageTarget。当我用iPad扫描我的标记时,我可以看到立方体悬停在我的标记上。大。

现在,我正在尝试让多维数据集成为可点击按钮,因此我尝试使用UI按钮。但是,创建任何UI对象意味着它也带有UI Canvas。所以,我希望能够扫描标记并显示按钮,但这不起作用。无论我是否扫描标记,按钮都只是在屏幕上。

我的层次结构应该是什么样的?

ARCamera

- >相机

ImageTarget

- >画布

- > - >按钮

- &GT - → - →;文本

或者它应该是:

ARCamera

- >相机

帆布

- > ImageTarget

- > - >按钮

- > - > - >文字

如何处理两个ImageTargets?我应该使用第一层次还是第二层次?

最后,我的画布渲染模式应该是什么?我目前把它作为“屏幕空间 - 叠加”。我试过“屏幕空间 - 相机”,但它并没有真正发挥那么大的作用。扫描标记时按钮仍未显示。

1 个答案:

答案 0 :(得分:2)

当找到可追踪的“ImageTarget”时,您需要显示按钮。即按钮应该在可追踪的事件上弹出。

  • 如果你在任何地方创建这样简单的UI,无论你把它放在哪里 等级。无论标记检测如何,它都会一直显示。
  • 您首先需要知道是否使用方法检测到标记 由Vuforia提供,然后必须用语法创建按钮。
  • 为此,您必须了解如何跟踪可跟踪事件, 例如可跟踪发现或可跟踪丢失。 Vuforia让这很容易 为我们提供一个名为的模板脚本 DefaultTrackableEventHandler。

  • 此脚本默认附加到任何ImageTarget预制件。您可以使用此脚本或类似脚本,如下所示。

      

    if(newStatus == TrackableBehaviour.Status.DETECTED ||               newStatus == TrackableBehaviour.Status.TRACKED ||               newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)

您必须编写C#脚本并将其附加到“ImageTarget”

下面的脚本描述了如何使用Vuforia SDK的thre Unity扩展显示(弹出)覆盖在3D视图顶部以响应目标检测事件的GUI按钮。

这是脚本

using UnityEngine;
using System.Collections;
using Vuforia;
using System;

public class ButtonPopup : MonoBehaviour, ITrackableEventHandler {

    float native_width= 1920f;
    float native_height= 1080f;
    public Texture btntexture;
    public Texture LogoTexture;
    public Texture MobiliyaTexture;


    private TrackableBehaviour mTrackableBehaviour;

    private bool mShowGUIButton = false;


    void Start () {


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

    public void OnTrackableStateChanged(
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            mShowGUIButton = true;
        }
        else
        {
            mShowGUIButton = false;
        }
    }

    void OnGUI() {

        //set up scaling
        float rx = Screen.width / native_width;
        float ry = Screen.height / native_height;

        GUI.matrix = Matrix4x4.TRS (new Vector3(0, 0, 0), Quaternion.identity, new Vector3 (rx, ry, 1));

        Rect mButtonRect = new Rect(1920-215,5,210,110);
        GUIStyle myTextStyle = new GUIStyle(GUI.skin.textField);
        myTextStyle.fontSize = 50;
        myTextStyle.richText=true;

        GUI.DrawTexture(new Rect(5,1080- 115,350,110),LogoTexture); 
        GUI.DrawTexture (new Rect (1530, 970, 350, 110), MobiliyaTexture);


        if (!btntexture) // This is the button that triggers AR and UI camera On/Off
        {
            Debug.LogError("Please assign a texture on the inspector");
            return;
        }

        if (mShowGUIButton) {

            GUI.Label(new Rect(40, 25, 350, 70), "<b> G E  9 1 0 0 C </b>",myTextStyle);

            //GUI.Box (new Rect (0,0,100,50), "Top-left");
            //GUI.Box (new Rect (1920 - 100,0,100,50), "Top-right");
            //GUI.Box (new Rect (0,1080- 50,100,50), "Bottom-left");
            //GUI.Box (new Rect (Screen.width - 100,Screen.height - 50,100,50), "Bottom right");

            // draw the GUI button
            if (GUI.Button(mButtonRect, btntexture)) {
                // do something on button click 
                OpenVideoActivity();
            }
        }
    }

    public void OpenVideoActivity()
    {
        var androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var jo = androidJC.GetStatic<AndroidJavaObject>("currentActivity");
        // Accessing the class to call a static method on it
        var jc = new AndroidJavaClass("com.mobiliya.gepoc.StartVideoActivity");
        // Calling a Call method to which the current activity is passed
        jc.CallStatic("Call", jo);
    }

}