Unity之XR Interaction Toolkit | IPointerDownHandler问题

版本

XR Interaction Toolkit 3.0.7

问题

场景中两个cube模型,一个显示一个隐藏,模型碰撞体重叠。

手柄射线指向重叠区域,按下扳机键,两个模型都会触发点击事件。

测试

点击模型

csharp 复制代码
using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class ClickModel : MonoBehaviour, IPointerDownHandler, IPointerUpHandler,IPointerClickHandler
{
    public event Action OnDown;
    public event Action OnUp;

    public event Action OnClick;

    public void OnPointerClick(PointerEventData eventData)
    {
        OnClick?.Invoke();
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        OnDown?.Invoke();
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        OnUp?.Invoke();
    }
}

测试

csharp 复制代码
using UnityEngine;
public class TestClickModel : MonoBehaviour
{
    [SerializeField] ClickModel cube1;
    [SerializeField] ClickModel cube2;

    [Header("交互类型")]
    [SerializeField] InteractionType interactionType;

    private void Awake()
    {
        switch (interactionType)
        {
            case InteractionType.Down:
                cube1.OnDown += Cube1Handler;
                cube2.OnDown += Cube2Handler;
                break;
            case InteractionType.Up:
                cube1.OnUp += Cube1Handler;
                cube2.OnUp += Cube2Handler;
                break;
            case InteractionType.Click:
                cube1.OnClick += Cube1Handler;
                cube2.OnClick += Cube2Handler;
                break;
        }

        cube1.gameObject.SetActive(true);
        cube2.gameObject.SetActive(false);
    }

    private void Cube1Handler()
    {
        Debug.Log(("触发对象:" + cube1, Time.renderedFrameCount));
        cube1.gameObject.SetActive(false);
        cube2.gameObject.SetActive(true);
    }

    private void Cube2Handler()
    {
        Debug.Log(("触发对象:" + cube2, Time.renderedFrameCount));
        cube1.gameObject.SetActive(true);
        cube2.gameObject.SetActive(false);
    }

    private void OnDestroy()
    {
        switch (interactionType)
        {
            case InteractionType.Down:
                cube1.OnDown -= Cube1Handler;
                cube2.OnDown -= Cube2Handler;
                break;
            case InteractionType.Up:
                cube1.OnUp -= Cube1Handler;
                cube2.OnUp -= Cube2Handler;
                break;
            case InteractionType.Click:
                cube1.OnClick -= Cube1Handler;
                cube2.OnClick -= Cube2Handler;
                break;
        }
    }
}


public enum InteractionType
{
    Down,
    Up,
    Click,
}

测试结果

Down模式下,点击重叠区域,隐藏模型显示后会触发接口事件;

Up和Click模式下,点击重叠区域,模型显示后不会触发接口。

结论

模型重叠使用Up和Click接口触发点击;不重叠Down,Up,Click接口都可以。

相关推荐
探求虚无15 小时前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气2 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船3 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
Martina_03213 天前
AI生成3D场景的霓虹灯一开就糊成光团?用6步检查Emissive、Bloom与曝光
人工智能·3d·ai·自然语言处理·游戏引擎·材质·贴图
寂寞的船5 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船5 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船5 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
淡海水6 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc
寂寞的船6 天前
【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优
unity·性能优化·编辑器
寂寞的船6 天前
【Unity Bug挑战】第10期 SerializeReference 内存泄漏之谜
unity·c#·游戏引擎·bug