Raycast 未检测到自定义 Unity UI 按钮脚本

Posted

技术标签:

【中文标题】Raycast 未检测到自定义 Unity UI 按钮脚本【英文标题】:Raycast not detecting custom Unity UI button script 【发布时间】:2021-03-21 13:04:09 【问题描述】:

我编写了一个自定义类来创建可以有动画师的按钮。但是这个类的对象不能被光线投射检测到,但是普通的 Unity UI 按钮可以被光线投射检测到。我正在寻找可以通过代码解决的解决方案。

public class AnimatedButton : UIBehaviour, IPointerClickHandler

    [Serializable]
    private class ButtonClickedEvent : UnityEvent
    
    

    public bool Interactable = true;

    [SerializeField]
    private ButtonClickedEvent onClick = new ButtonClickedEvent();

    private Animator animator;

    private bool blockInput;

    protected override void Start()
    
        base.Start();
        animator = GetComponent<Animator>();
    

    public virtual void OnPointerClick(PointerEventData eventData)
    
        if (!Interactable || eventData.button != PointerEventData.InputButton.Left)
            return;

        if (!blockInput)
        
            blockInput = true;
            Press();
            // Block the input for a short while to prevent spamming.
            StartCoroutine(BlockInputTemporarily());
        
    

    public void Press()
    
        if (!IsActive())
            return;

        animator.SetTrigger("Pressed");
        StartCoroutine(InvokeOnClickAction());
    

    private IEnumerator InvokeOnClickAction()
    
        yield return new WaitForSeconds(0.1f);
        onClick.Invoke();
    

    private IEnumerator BlockInputTemporarily()
    
        yield return new WaitForSeconds(0.5f);
        blockInput = false;
    

以下代码用于通过发射光线投射找到游戏对象

private bool checkButtonClick()

    bool flag = false;
    PointerEventData pointer = new PointerEventData(EventSystem.current);
    List<RaycastResult> raycastResult = new List<RaycastResult>();
    
    pointer.position = Input.mousePosition;
    EventSystem.current.RaycastAll(pointer, raycastResult);
    foreach (RaycastResult result in raycastResult)
    
        if (result.gameObject.GetComponent<Button>() != null || result.gameObject.GetComponent<AnimatedButton>() != null)
        
            Debug.Log("Button Name : " + result.gameObject.name);
        
    
    raycastResult.Clear();
    return flag;

仅使用此日志打印“按钮”类型的对象,并且未检测到“动画按钮”类型的对象。这可能是什么问题以及如何解决?

【问题讨论】:

【参考方案1】:

你已经接近了。但它不是UIBehaviour,实际上是UnityEngine.UI.Graphic,派生自UIBehaviour,由GraphicRaycaster 搜索。因此,您应该能够从Graphic 派生,并且您的新按钮类型将在光线投射结果中找到。这是与 Graphic 类相关的 Unity docs。引用该页面:

所有可视化 UI 组件的基类。

在创建可视化 UI 组件时,您应该从此类继承。

【讨论】:

谢谢你,你是对的。但是当我尝试从 Graphic 继承时,我面临的问题是我遇到了画布渲染器未附加到对象的异常。如果我尝试添加一个画布渲染器运行时,在某些情况下,我会得到一个类似于按钮的白色边框。那么有没有其他的方法呢? @Zenhal 我不太确定为什么您会在某些项目周围出现白色边框。那是你的下一个问题吗?对不起,当你问“有没有其他方法解决它”时,我不太确定你在问什么。我们还可以看看为什么要从这样一个低级别的类中创建一个新项目 AnimamtedButton。您能否改为扩展Button,甚至扩展UnityEngine.UI.Selectable

以上是关于Raycast 未检测到自定义 Unity UI 按钮脚本的主要内容,如果未能解决你的问题,请参考以下文章

Unity raycast 未检测到之前已检测到的对象

通过 RayCast Unity 与 UI 交互

unity区分点击在3D物体还是2D UI上

unity为啥射线检测不到ui

Unity 射线检测(RayCast)

Unity Physics.Raycast 似乎无法正确检测到它击中的对象