C# 如何使用画布元素(屏幕空间覆盖)使光线投射命中

C# 如何使用画布元素(屏幕空间覆盖)使光线投射命中,c#,unity3d,raycasting,C#,Unity3d,Raycasting,由于某些原因,当3D对象工作正常时,我的2D覆盖不会对光线投射命中作出反应。我已经在互联网上搜索了很长一段时间,但仍然找不到解决办法。(我对C#和Unity都有点陌生,所以我的知识有限) 如果有人能对我的这个问题有所了解,我将不胜感激 这里的问题是,当我单击2D覆盖时,我希望光标显示一条控制台消息。3D对象工作并在控制台中显示相关消息,但由于某些原因,2D图形未检测到光线投射命中 using System.Collections; using System.Collections.Generic

由于某些原因,当3D对象工作正常时,我的2D覆盖不会对光线投射命中作出反应。我已经在互联网上搜索了很长一段时间,但仍然找不到解决办法。(我对C#和Unity都有点陌生,所以我的知识有限)

如果有人能对我的这个问题有所了解,我将不胜感激

这里的问题是,当我单击2D覆盖时,我希望光标显示一条控制台消息。3D对象工作并在控制台中显示相关消息,但由于某些原因,2D图形未检测到光线投射命中

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

public class rayCast_Test : MonoBehaviour
{
    [SerializeField]
    public GameObject TutorialUI;

    public Canvas gameChara2D;
    [SerializeField]
    private float rayCastDistance = 25f;
    [SerializeField]
    float DistanceFromCamera = 1f;

    private ARRaycastManager aRRaycastManager;
    private Vector3 touchPos;
    private Vector3 touchOrigin;



    private bool onTouchHold = false;

    private RaycastHit hitObject;



    private void Awake()
    {
        aRRaycastManager = FindObjectOfType<ARRaycastManager>();
    }

    // Update is called once per frame
    void Update()
    {


        if (Input.GetMouseButton(0))
        {
            touchPos = Input.mousePosition;

            if (!onTouchHold)
            {
                Ray ray = Camera.main.ScreenPointToRay(touchPos);


                if (Physics.Raycast(ray, out hitObject, rayCastDistance))
                {
                    if(hitObject.transform.CompareTag("Moveable"))
                    {
                        onTouchHold = true;
                        touchOrigin = Input.mousePosition;
                        Debug.Log("Hello. This is a 3D object");
                    }
                }

                if(Physics.Raycast(ray, out hitObject, rayCastDistance))
                {
                    if (hitObject.transform.CompareTag("ChallengeUI"))
                    {
                        Debug.Log("Hello. This is a 2D object");
                    }

                }
            }

        }

        if(Input.GetMouseButtonUp(0))
        {
            onTouchHold = false;
        }


    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.XR.ARFoundation;
公共类rayCast_检验:单行为
{
[序列化字段]
公共游戏对象教程;
公共画布游戏;
[序列化字段]
私人浮动距离=25f;
[序列化字段]
浮动距离摄像机=1f;
私人ARRaycastManager ARRaycastManager;
私有向量3 touchPos;
私人矢量3;
private bool onTouchHold=假;
私有光线对象;
私人空间
{
aRRaycastManager=FindObjectOfType

不能将
Physics.Raycast
用于UI元素或2D碰撞器

一般来说,您想要点击的是一个特定的组件,比如一个或启用了的组件


如果要击中
BoxCollider2D
则必须使用。但是,这不用于在
Z
方向上进行光线投射,而仅用于通过XY方向从侧面击中碰撞器


要真正击中用户界面,你必须使用不同类型的光线投射,而不是通过物理,而是使用一个类似的

var pointerEventData = new pointerEventData{ position = touchPos};
var raycastResults = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, raycastResults);

if(raycastResults.Count > 0)
{
    foreach(var result in RaycastResults)
    {
        ...
    }
}
var pointerEventData=newpointereventdata{position=touchPos};
var raycastResults=新列表();
EventSystem.current.RaycastAll(pointerEventData,raycastResults);
如果(raycastResults.Count>0)
{
foreach(RAYCASTEResults中的var结果)
{
...
}
}

进一步注意,您已经检查了标记
ChallangeUI
,但是您的UI对象具有层
UI