-1

Google Tango 和 Unity 相关问题。

使用 教程,我们可以通过点击屏幕将对象放置在表面上。

这是代码:

using UnityEngine;
using System.Collections;

public class KittyUIController : MonoBehaviour
{
    public GameObject m_kitten;
    private TangoPointCloud m_pointCloud;

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

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

    void PlaceKitten(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 kitten on the surface, and make it always face the camera.
        if (Vector3.Angle(plane.normal, Vector3.up) < 30.0f)
        {
            Vector3 up = plane.normal;
            Vector3 right = Vector3.Cross(plane.normal, cam.transform.forward).normalized;
            Vector3 forward = Vector3.Cross(right, plane.normal).normalized;
            Instantiate(m_kitten, planeCenter, Quaternion.LookRotation(forward, up));
        }
        else
        {
            Debug.Log("surface is too steep for kitten to stand on.");
        }
    }
}

我在屏幕上有按钮,当我按下它们时,我还会在它后面的表面上放置一个对象。

我怎样才能避免它?所以如果我按下一个按钮,我不想同时放置一个对象。

如果我有一个在我点击屏幕时执行的功能,如果我点击屏幕上的一个按钮,如何阻止它执行?

4

2 回答 2

1

实现此目的的一种方法是向按钮添加标签,在触摸时投射光线,并查看光线是否与带有按钮标签的对象发生碰撞。

    if (Input.touchCount == 1)
    {
        // Trigger place kitten function when single touch ended.
        Touch t = Input.GetTouch(0);
        Ray ray = Camera.main.ScreenPointToRay(t.position);
        RaycastHit hit;

        if(t.phase == TouchPhase.Ended && Physics.Raycast(ray,out hit,100))
        {
            if(hit.collider.tag == "button")
            {
                //do button stuff
            }
            else
            {
                PlaceKitten(t.position);
            }
        }
    }
于 2017-07-11T17:24:55.927 回答
1

我之前已经回答过这个问题,但找不到重复项来关闭这个问题。当我找到它时,我会关闭它。

在将其视为有效点击之前,您需要检查鼠标位置是否位于 UI 上方。

这是通过IsPointerOverGameObject函数完成的。

void Update()
{
    if (Input.touchCount == 1)
    {
        // Trigger place kitten function when single touch ended.
        Touch t = Input.GetTouch(0);
        if (t.phase == TouchPhase.Ended)
        {
            //Make sure we are not over the UI
            if (!UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
            {
                Debug.Log("Clicked outside the UI");
                PlaceKitten(t.position);
            }
        }
    }
}

对于触摸屏设备,您必须将fingerId传递给函数:

void Update()
{
    if (Input.touchCount == 1)
    {
        // Trigger place kitten function when single touch ended.
        Touch t = Input.GetTouch(0);
        if (t.phase == TouchPhase.Ended)
        {
            //Make sure we are not over the UI
            if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            {
                Debug.Log("Touched outside the UI");
                PlaceKitten(t.position);
            }
        }
    }
}
于 2017-07-11T19:22:17.867 回答