Como detectar GameObjects múltiplos / sobrepostos com o EventSystem?
O que eu tento alcançar: A escova de dentes deve aparecer onde quer que o usuário clica dentroBoxCollider
A
, incluindo espaço dentroBoxCollider
B
. Mas aparentemente clicando dentroB
não mostrará a escova de dentes (o OnPointerDown não está sendo acionado).
O que eu tentei: Alterando a ordem das camadas.
A escova de dentes é mostrada depois que o usuário clica dentro do colisor de caixaA
, mas se o usuário clicar dentro do colisor de caixaB
- a escova de dentes não aparecerá, o que significaOnPointerDown
não é acionado.
Eu acho que é por causa da sobreposição de umBoxCollider2D
dentro de outroBoxCollider2D
. No meu casoB
dentroA
, Presumo que esse seja o culpado, mas não tenho idéia de como resolvê-lo ou se talvez houver outro método para implementarOnPointerDown
?
estou usandoPerspective
Câmera. mas nesta cena todos os elementos estão no mesmoz position
que é 0. É possível disparar o evento IPointerHander em todos os respectivosBoxCollider2D
?
Este script está anexado à escova de dentes. oBoxCollider2D
A também pertence à escova de dentes.
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("pointer down");
if (GetComponent<DragableObject>() == null)
return;
currentObject = GetComponent<DragableObject>();
MeshRenderer renderer = GetComponent<MeshRenderer>();
if (ShowOnTouch)
ShowObject();
// Store original state
originalPosition = transform.position;
originalOrderLayer = renderer.sortingOrder;
// Snap to mouse
Vector3 newPos = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 30));
newPos.z = 30;
transform.position = newPos;
if (BringToFront)
{
if (renderer != null)
{
renderer.sortingOrder = 90;
}
}
ObjectActive.Invoke();
}
TargetListener.csEste script está anexado aBoxCollider2D
B.
public void OnPointerDown(PointerEventData eventData)
{
for (int i = 0; i < Affectors.Count; i++)
{
if (Affectors [i] == DragableObject.currentObject)
{
DragableObject.currentObject.OnEnterTarget(transform);
ITriggerEffect[] iTrigger = GetComponents<ITriggerEffect>();
for (int j = 0; j < iTrigger.Length; j++)
{
Debug.Log("iTrigger enter");
Debug.Log(iTrigger [j]);
iTrigger [j].Execute(eventData, PointerState.Down);
}
}
else
continue;
}
}
Se eu clicar emA
a escova de dentes aparecerá, exceto quando eu clicar dentroB
. Aqui o log de depuração.
Isto é oBoxCollider2D
A está anexado, que é o*Toothbrush
em conjunto com odragable.cs
roteiro.
ATUALIZAÇÃO: Graças a outras pessoas que respondem, o problema se torna mais claro para mim. Abaixo estáBoxCollider2D
A eBoxCollider2D
B. Ambos têm script que tem a maioria dosOnPointerHander
. Como faço para garantir que todosOnPointerHandler
é acionado nos respectivosBoxCollider2D
?
Problemas que estou tendo:
OnPointerExit emA
é acionado quando meu ponteiro entraB
.se clicar dentroB
,OnPointerDown
acionado apenas emB
mas nãoA