首页 文章

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

提问于
浏览
2

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

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

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

我的等级应该是什么样的?

ARCamera

  • 相机

ImageTarget

  • 画布

    • 按钮

      • 文字

或者应该是:

ARCamera

  • 相机

帆布

  • ImageTarget

    • 按钮

      • 正文

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

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

1 回答

  • 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按钮 .

    Here is the Script

    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);
        }
    
    }
    

相关问题