大家好,我目前正在使用 unity 和 vuforia sdk 创建我的第一个 AR 应用程序。我已经了解 AR 的一些基础知识,您需要一个图像目标来显示 3D 对象或与图像目标相关的信息。我有这个 AR 旋转立方体
此示例应用程序在找到有效的图像目标时工作,并且将显示 3D 立方体并开始旋转。我的问题是,当手机扫描图像目标时,应该有一条消息说“正在扫描图像目标”,当找到它时,它会显示“找到图像目标”,并且会显示一个弹出按钮“显示”,按下该按钮时会出现立方体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateScript : MonoBehaviour {
public int speed;
//Update is called once per frame
void Update () {
transform.Rotate (new Vector3 (0, Time.deltaTime * speed, 0));
}
}
更新:
我找到了这个脚本并对其进行了一些修改以在屏幕上方显示 UI 文本,我打算在未检测到图像目标时将文本更改为“图像目标丢失”,在存在图像目标时将文本更改为“找到图像目标”。我将脚本放在图像目标预制件上,但它显示错误UI Text Error。关于我哪里做错了的任何建议。谢谢
示例代码
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using Vuforia;
public class TextScript : MonoBehaviour, ITrackableEventHandler {
private TrackableBehaviour mTrackableBehaviour;
//Declares a UI text
Text uiText;
void Start () {
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
//uiText = gameObject.GetComponent<Text> ();
}
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED)
{
uiText.text = "Image Target Found";
}
else
{
uiText.text = "Image Target Lost";
}
}
}
更新(10/30/2017)
如果我更新晚了,我很抱歉,我已经尝试了你们提供的所有解决方案,但仍然不起作用。代码的名称是 TextScript,我已将其附加到图像目标,但结果仍然不成功。这是示例代码。
文本脚本
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using Vuforia;
public class TextScript : MonoBehaviour, ITrackableEventHandler {
private TrackableBehaviour mTrackableBehaviour;
//Declares a UI text
public Text uiText;
void Start () {
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
uiText = gameObject.GetComponent<Text> ();
}
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
OnTrackingFound();
uiText.text = "Image Target Found";
}
else
{
OnTrackingLost();
//uiText.text = "Image Target Lost";
}
}
private void OnTrackingFound()
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
// Enable rendering:
foreach (Renderer component in rendererComponents)
{
uiText.text = "Image Target Found";
component.enabled = true;
}
// Enable colliders:
foreach (Collider component in colliderComponents)
{
uiText.text = "Image Target Found";
component.enabled = true;
}
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
}
private void OnTrackingLost()
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
// Disable rendering:
foreach (Renderer component in rendererComponents)
{
uiText.text = "Image Target Lost";
component.enabled = false;
}
// Disable colliders:
foreach (Collider component in colliderComponents)
{
uiText.text = "Image Target Lost";
component.enabled = false;
}
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}
}
P.S
我已经将文本 UI 命名为“扫描”,因此当我按下播放时,文本已经显示了上述单词。但是当它找到图像目标时,文本不会改变。请各位,我非常需要你们的帮助,如果有不需要的代码,请随时编辑或评论,以便我可以删除它。谢谢
也许你应该研究一下这个方法OnTrackingFound()在vuforia/scripts/defaulttrackable.cs
// Enable rendering:
foreach (Renderer component in rendererComponents)
{
component.enabled = true;
}
// Enable colliders:
foreach (Collider component in colliderComponents)
{
component.enabled = true;
}
您可以使用布尔值来管理何时渲染立方体。
请参阅给定链接中的 TrackableBehaviour 的属性: https://library.vuforia.com/content/vuforia-library/en/reference/unity/classVuforia_1_1TrackableBehaviour.html
当图像目标为检测到时将文本设置为“扫描”, 在 OnTrackingFound() 方法上将 TEXT 设置为“Found”并将按钮对象可见设置为 true,Onbuttonclik 事件实例化 Cube 对象
On OntrackingLost() 方法设置 Button 对象可见 false
希望这有帮助。
在你的脚本中,你刚刚声明了 uiText 但没有初始化它。应该是这样的
public Text uiText;
然后将相关的文本游戏对象从项目窗口拖到检查器中的 TextScript 脚本中,或者像这样在 onStart() 中初始化它
uiText = GameObject.Find("<your_text_object_name>").GetComponent<Text>();
不建议使用第二个选项,因为文本初始化次数等于数据库中的图像目标计数。
希望有帮助。
“您的帖子让我对增强现实的未来感到兴奋!全面的解释和 AR 发展的当前趋势令人鼓舞。感谢您分享如此富有洞察力的信息!” 印度增强现实应用程序开发公司