首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >探戈/统一-用户界面不阻止屏幕上的触摸

探戈/统一-用户界面不阻止屏幕上的触摸
EN

Stack Overflow用户
提问于 2017-04-01 00:45:58
回答 1查看 3.7K关注 0票数 2

我们正在构建一个类似于"Kitten -在AR中放置虚拟对象“的示例,如下所示:

https://developers.google.com/tango/apis/unity/unity-howto-placing-objects

基本上,当你触摸屏幕时,一只小猫出现在现实世界的平面(地板)上。

在我们的应用程序中,我们有一个边菜单,有几个按钮,每个按钮显示一个不同的游戏对象。我们希望在屏幕上的任何地方检测触摸,除了有UI的地方。我们希望UI阻止在Tango中的触摸,并且只允许touches实例化屏幕上没有UI元素的相关游戏对象。

特定于触摸的代码如下:

代码语言:javascript
复制
void Update() {
    if (Input.touchCount == 1) {
        // Trigger placepictureframe function when single touch ended.
        Touch t = Input.GetTouch(0);
        if (t.phase == TouchPhase.Ended) {
            PlacePictureFrame(t.position);
        }
    }
}

( PlacePictureFrame()将一个画框对象放置在触摸位置。)

我找不到任何探戈的例子,其中有触摸和UI的结合。我尝试过一种名为LeanTouch的资产来阻止UI元素后面的触摸,但它似乎没有具体地与Tango一起工作。请帮帮我!

我试过使用方法5,如下所示:

How to detect events on UI and GameObjects with the new EventSystem API

虽然它确实向PhysicsRaycaster添加了一个TangoARCamera (标记为MainCamera),但不管您在哪里触摸屏幕,OnPointerDown方法都不会生成调试日志。探戈是一个特例,所以这不是一个重复的问题。见下文:

代码语言:javascript
复制
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class PictureFrameUIController : MonoBehaviour, IPointerClickHandler {

    public GameObject m_pictureFrame;
    private TangoPointCloud m_pointCloud;

    void Start() {
        m_pointCloud = FindObjectOfType<TangoPointCloud>();
        addPhysicsRaycaster();
    }

    void addPhysicsRaycaster() {
        PhysicsRaycaster physicsRaycaster = GameObject.FindObjectOfType<PhysicsRaycaster>();
        if (physicsRaycaster == null) {
            Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
        }
    }

    public void OnPointerClick(PointerEventData eventData) {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
        PlacePictureFrame(eventData.pointerCurrentRaycast.screenPosition);
    }


    //void Update() {
    //  if (Input.touchCount == 1) {
    //      // Trigger placepictureframe function when single touch ended.
    //      Touch t = Input.GetTouch(0);
    //      if (t.phase == TouchPhase.Ended) {
    //          PlacePictureFrame(t.position);
    //      }
    //  }
    //}

    void PlacePictureFrame(Vector2 touchPosition) {
        // Find the plane.
        Camera cam = Camera.main;
        Vector3 planeCenter;
        Plane plane;
        if (!m_pointCloud.FindPlane(cam, touchPosition, out planeCenter, out plane)) {
            Debug.Log("cannot find plane.");
            return;
        }

        // Place picture frame on the surface, and make it always face the camera.
        if (Vector3.Angle(plane.normal, Vector3.up) > 60.0f && Vector3.Angle(plane.normal, Vector3.up) < 140.0f) {
            Vector3 forward = plane.normal;
            // Vector3 right = Vector3.Cross(plane.normal, cam.transform.forward).normalized;
            // Vector3 forward = Vector3.Cross(right, plane.normal).normalized;
            Instantiate(m_pictureFrame, planeCenter, Quaternion.LookRotation(forward, Vector3.up));
        } else {
            Debug.Log("surface is not steep enough for picture frame to be placed on.");
        }
    }

    public void DeleteAllFrames() {
        GameObject[] frames = GameObject.FindGameObjectsWithTag("Frame");
        if (frames == null) {
            return;
        }
        foreach (GameObject frame in frames) {
            Destroy(frame);
        }
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2017-04-01 02:33:30

如果您想在屏幕上的任何地方检测到单击,除了有UI控件/组件的位置之外,您必须检查指针是否在带有EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)的UI上。

如果在桌面上,请使用EventSystem.current.IsPointerOverGameObject()。你用的是探戈所以EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)。应该被使用。

代码语言:javascript
复制
void Update()
{
    if (Input.touchCount == 1)
    {
        //Trigger placepictureframe function when single touch ended.
        Touch t = Input.GetTouch(0);
        if (t.phase == TouchPhase.Ended)
        {
            //Make sure that pointer is not over UI before calling  PlacePictureFrame
            if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            {
                PlacePictureFrame(t.position);
            }
        }
    }
}

编辑:

这似乎只适用于TouchPhase.Began

更改t.phase == TouchPhase.Ended to t.phase == TouchPhase.Began,这应该会像预期的那样工作。确保用移动设备/探戈来测试,而不是用鼠标。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43151553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档