检测到目标时带有 vuforia 的 Unity3d 显示二维图像

Unity3d with vuforia showing 2d image when targed is detected

我对如何在检测到的标记顶部显示简单的二维图像的方式有疑问。我按照一些教程来展示 3d 模型并且效果很好。 3d没问题。 当我想添加普通的 2d object->sprite 时,问题就开始了。当我添加简单的精灵时,我无法添加纹理,当我插入 UI 图像时,它与 canvas 一起添加,并且当目标是时不显示 检测到。 editor 上的原图放得很远,很难找到。 如果有人能指出正确的方向,我将不胜感激。

我需要让这张图片像按钮一样对触摸敏感。单击它必须显示新场景(我有它,但在 GUI.Button 下)。最好的方法是替换原来的标记,但我也可以让新的精灵变大以隐藏它下面的标记。

为了帮助理解答案,这里简要介绍了 Vuforia 如何处理标记检测。如果您看一下 DefaultTrackableEventHandler 脚本附加到 ImageTarget prefab,您会发现有些事件会在跟踪系统找到或丢失图像。

这些是 OnTrackingFound(第 67 行)和 OnTrackingLost(第 88 行)在 DefaultTrackableEventHandler.cs

如果您想在跟踪时显示 Sprite,您需要做的就是放置 Image Target 预制件(或任何其他)并使 Sprite 成为预制件的子项.启用和禁用应该自动发生。

但是,如果您想做更多的事情,这里有一些经过编辑的代码。

DefaultTrackableEventHandler.cs

//Assign this in the inspector. This is the GameObject that 
//has a SpriteRenderer and Collider2D component attached to it
public GameObject spriteGameObject ;

将以下行添加到 OnTrackingFound

    //Enable both the Sprite Renderer, and the Collider for the sprite
    //upon Tracking Found. Note that you can change the type of 
    //collider to be more specific (such as BoxCollider2D)
    spriteGameObject.GetComponent<SpriteRenderer>().enabled = true;
    spriteGameObject.GetComponent<Collider2D>().enabled = true;

    //EDIT 1
    //Have the sprite inherit the position and rotation of the Image
    spriteGameObject.transform.position = transform.position;
    spriteGameObject.transform.rotation = transform.rotation;

下面是OnTrackingLost

    //Disable both the Sprite Renderer, and the Collider for the sprite
    //upon Tracking Lost. 
    spriteGameObject.GetComponent<SpriteRenderer>().enabled = false;
    spriteGameObject.GetComponent<Collider2D>().enabled = false;



接下来,您的问题是关于检测对此 Sprite 的点击。 Unity的Monobehaviour触发了很多鼠标事件,比如OnMouseUpOnMouseDown

Link to Monobehaviour on Unity's API docs
您需要的是一个名为 OnMouseUpAsButton

的事件

创建一个名为 HandleClicks.cs 的新脚本,并向其中添加以下代码。将此脚本作为组件附加到您为上述分配的 spriteGameObject

public class HandleClicks : MonoBehaviour {

    //Event fired when a collider receives a mouse down
    //and mouse up event, like the interaction with a button
    void OnMouseUpAsButton () {
        //Do whatever you want to
        Application.LoadLevel("myOtherLevel");
    }

}