C# 当用户点击屏幕时,检测画布中是否有按钮

C# 当用户点击屏幕时,检测画布中是否有按钮,c#,unity3d,augmented-reality,C#,Unity3d,Augmented Reality,我正在构建一个AR应用程序,当用户在地平面上点击屏幕时,它会生成一个3d模型 但我面临的问题是,我在屏幕底部放置了一个按钮来截图。单击按钮时,它会截图,但也会在按钮下方生成一个图像 我怎样才能避免这种情况?我可以使用光线投射来检测按钮,而不在那里生成对象吗 下面是我用来放置对象的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.ARFound

我正在构建一个AR应用程序,当用户在地平面上点击屏幕时,它会生成一个3d模型

但我面临的问题是,我在屏幕底部放置了一个按钮来截图。单击按钮时,它会截图,但也会在按钮下方生成一个图像

我怎样才能避免这种情况?我可以使用光线投射来检测按钮,而不在那里生成对象吗

下面是我用来放置对象的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.Experimental.XR;
using System;

public class ArTapToPlace : MonoBehaviour
{
    public GameObject objectToPlace;
    public GameObject placementIndicator;

    private ARSessionOrigin arOrigin;
    private Pose placementPose;
    private bool placementPoseIsValid = false;

    void Start()
    {
        arOrigin = FindObjectOfType<ARSessionOrigin>();
    }

    void Update()
    {
        UpdatePlacementPose();
        UpdatePlacementIndicator();

        if (placementPoseIsValid && Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            PlaceObject();
        }
    }

    private void PlaceObject()
    {
        Instantiate(objectToPlace, placementPose.position, placementPose.rotation);
    }

    private void UpdatePlacementIndicator()
    {
        print(placementIndicator);
        if (placementPoseIsValid)
        {
            placementIndicator.SetActive(true);
            placementIndicator.transform.SetPositionAndRotation(placementPose.position, placementPose.rotation);
        }
        else
        {
            placementIndicator.SetActive(false);
        }
    }

    private void UpdatePlacementPose()
    {
        var screenCenter = Camera.current.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
        var hits = new List<ARRaycastHit>();
        arOrigin.GetComponent<ARRaycastManager>().Raycast(screenCenter, hits, UnityEngine.XR.ARSubsystems.TrackableType.Planes);
        print(hits.Count);
        print(hits);


        placementPoseIsValid = hits.Count > 0;
        if (placementPoseIsValid)
        {
            placementPose = hits[0].pose;

            var cameraForward = Camera.current.transform.forward;
            var cameraBearing = new Vector3(cameraForward.x, 0, cameraForward.z).normalized;
            placementPose.rotation = Quaternion.LookRotation(cameraBearing);
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.XR.ARFoundation;
使用UnityEngine.Experimental.XR;
使用制度;
公共类艺术场所:单一行为
{
公共游戏对象objectToPlace;
公共游戏对象放置指示器;
私人纵火;
私人姿势放置姿势;
private bool placementPoseIsValid=false;
void Start()
{
arOrigin=FindObjectOfType();
}
无效更新()
{
UpdatePlacementPose();
UpdatePlacementIndicator();
if(placementPoseIsValid&&Input.touchCount>0&&Input.GetTouch(0.phase==TouchPhase.Start)
{
PlaceObject();
}
}
私有void PlaceObject()
{
实例化(objectToPlace、placementPose.position、placementPose.rotation);
}
私有void UpdatePlacementIndicator()
{
打印(位置指示器);
如果(placementPoseIsValid)
{
placementIndicator.SetActive(真);
placementIndicator.transform.SetPositionAndRotation(placementPose.position,placementPose.rotation);
}
其他的
{
placementIndicator.SetActive(设置激活)(假);
}
}
私有void UpdatePlacementPose()
{
var screenCenter=Camera.current.ViewportToScreenPoint(新矢量3(0.5f,0.5f));
var hits=新列表();
arOrigin.GetComponent().Raycast(屏幕中心、点击、UnityEngine.XR.ARSubsystems.TrackableType.Planes);
打印(点击次数);
打印(点击次数);
placementPoseIsValid=hits.Count>0;
如果(placementPoseIsValid)
{
placementPose=点击次数[0]。姿势;
var camerafroward=Camera.current.transform.forward;
var cameraBearing=新矢量3(camerafroward.x,0,camerafroward.z)。标准化;
placementPose.rotation=四元数.LookRotation(cameraBearing);
}
}
}

根据用户界面的设置方式,您可能可以使用它来检查指针是否位于用户界面元素上,并在这种情况下跳过放置

if (placementPoseIsValid && Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
    if(EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))) return;

    PlaceObject();
}

如何检测平面上的点击?arOrigin.GetComponent().Raycast(屏幕中心,hits,UnityEngine.XR.ARSubsystems.TrackableType.Planes);我已经添加了用于将对象放置到地平面@derHugoyeahs上的代码,我可以看到您只收集
UnityEngine.XR.ARSubsystems.TrackableType.Planes
,因此,这样做您将永远不会知道您以前是只击中了该平面还是其他平面。我不知道这种类型,但也许你可以将其限制为只点击一次,然后检查它是平面还是按钮,或者更确切地说,如果平面是唯一的东西,则使用法线和仅定位,否则可能也会有帮助,这取决于UI在项目中的实现方式