我是Unity和Vuforia的新手。我正在尝试创建增强现实体验,用户可以扫描目标标记,它将显示一个可以单击的按钮。
我能够使用子GameObject多维数据集设置ARCamera和ImageTarget。当我用iPad扫描我的标记时,我可以看到立方体悬停在我的标记上。大。
现在,我正在尝试让多维数据集成为可点击按钮,因此我尝试使用UI按钮。但是,创建任何UI对象意味着它也带有UI Canvas。所以,我希望能够扫描标记并显示按钮,但这不起作用。无论我是否扫描标记,按钮都只是在屏幕上。
我的层次结构应该是什么样的?
ARCamera
- >相机
ImageTarget
- >画布
- > - >按钮
- &GT - → - →;文本
或者它应该是:
ARCamera
- >相机
帆布
- > ImageTarget
- > - >按钮
- > - > - >文字
如何处理两个ImageTargets?我应该使用第一层次还是第二层次?
最后,我的画布渲染模式应该是什么?我目前把它作为“屏幕空间 - 叠加”。我试过“屏幕空间 - 相机”,但它并没有真正发挥那么大的作用。扫描标记时按钮仍未显示。
答案 0 :(得分:2)
当找到可追踪的“ImageTarget”时,您需要显示按钮。即按钮应该在可追踪的事件上弹出。
为此,您必须了解如何跟踪可跟踪事件, 例如可跟踪发现或可跟踪丢失。 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);
}
}