【问题标题】:Unity - How can I popup a GUI button when a target is detectedUnity - 检测到目标时如何弹出 GUI 按钮
【发布时间】:2021-05-05 05:40:24
【问题描述】:

我是 Unity 和 Vuforia 的新手。我正在尝试创建一种增强现实体验,用户可以在其中扫描目标标记,它会显示一个他们可以单击的按钮。我找到了几个程序,但它会引发与 ITrackableEventHandler 相关的错误。

错误:Assets\scripts\ButtonPopup.cs(5,43):错误 CS0246:找不到类型或命名空间名称“ITrackableEventHandler”(您是否缺少 using 指令还是程序集参考?)

using UnityEngine;
using System.Collections;

public class ButtonPopup : MonoBehaviour, ITrackableEventHandler {
    
    private TrackableBehaviour mTrackableBehaviour;
    
    private bool mShowGUIButton = false;
    private Rect mButtonRect = new Rect(50,50,120,60);
    
    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)
        {
            mShowGUIButton = true;
        }
        else
        {
            mShowGUIButton = false;
        }
    }
    
    void OnGUI() {
        if (mShowGUIButton) {
            // draw the GUI button
            if (GUI.Button(mButtonRect, "Hello")) {
                // do something on button click 
            }
        }
    }
}

【问题讨论】:

  • 你尝试了什么来解决这个非常清晰的错误消息(ITrackableEventHandler未知)?

标签: c# unity3d augmented-reality vuforia


【解决方案1】:
  • 我认为您可能缺少类似的命名空间

    using Vuforia;
    
  • afaik RegisterTrackableEventHandler 已弃用,现在它是 RegisterOnTrackableStatusChanged,不需要接口,也许它也已弃用)

  • OnGUI(也是IMGUI)几乎已经过时/遗留,主要仅用于编辑器脚本和非常非常快速和肮脏的原型设计......而不是使用"new" UI System (uGUI)使用UI package,然后只使用@987654329 @

因此,首先您需要在场景中的某个位置的Canvas 中设置Button。如果你通过Hierarchy View右键单击创建UIButton 这会自动创建一个新的@ 987654333@ 如果您目前还没有,请添加一个 Button。

而且代码有点像

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

public class ButtonPopup : MonoBehaviour
{    
    [SerializeField] private TrackableBehaviour _trackableBehaviour;
    
    // Reference your Button via the Inspector
    [SerializeField] private Button _button;
    
    private void Start () 
    {
        if(!_trackableBehaviour)
        {
            if(!TryGetComponent<TrackableBehaviour>(out  _trackableBehaviour))
        {
            Debug.LogError("No TrackableBehavior!", this);
            return;
        }

        _trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
    }
    
    private void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
    {
        _button.gameObject.SetActive(newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.TRACKED);
    }
}

当然,如果你真的有你的理由,你可以坚持使用 OnGUI .. 这真的不是最先进的 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    相关资源
    最近更新 更多