版本
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接口都可以。