¿Cómo detectar GameObjects múltiples / superpuestos con EventSystem?
Lo que trato de lograr: el cepillo de dientes debería aparecer donde el usuario haga clic dentroBoxCollider
A
, incluido el espacio interiorBoxCollider
B
. Pero aparentemente haciendo clic dentroB
no mostrará el cepillo de dientes (OnPointerDown no se está activando).
Lo que he intentado: cambiar el orden de las capas.
El cepillo de dientes se muestra después de que el usuario hace clic dentro del colisionador de cajasA
, pero si el usuario hace clic dentro del cuadro colisionadorB
- el cepillo de dientes no aparecerá, lo que significaOnPointerDown
no se activa
Creo que es por la superposición de unoBoxCollider2D
dentro de otroBoxCollider2D
. En mi casoB
dentroA
, Supongo que es el culpable, pero no tengo idea de cómo resolverlo o si tal vez hay otro método para implementarOnPointerDown
?
estoy usandoPerspective
cámara. pero en esta escena todos los elementos están en el mismoz position
que es 0. ¿Es posible activar el evento IPointerHander en cada respectivoBoxCollider2D
?
Este script está adjunto al cepillo de dientes. losBoxCollider2D
A también pertenece al cepillo de dientes.
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á adjunto aBoxCollider2D
SI.
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;
}
}
Si hago clic enA
aparecerá el cepillo de dientes, excepto cuando haga clic dentroB
. Aquí el registro de depuración.
Este es elBoxCollider2D
A está unido a, que es el*Toothbrush
a sí mismo junto con eldragable.cs
guión.
ACTUALIZACIÓN: Gracias a otros que respondieron, el problema se volvió más claro para mí. A continuación esBoxCollider2D
A yBoxCollider2D
B. Ambos tienen guiones que tienen la mayoría deOnPointerHander
. ¿Cómo me aseguro de que todoOnPointerHandler
se activa en respectivoBoxCollider2D
?.
Problemas que estoy teniendo:
OnPointerExit enA
se activa cuando entra mi punteroB
.si hace clic adentroB
,OnPointerDown
solo se activa enB
pero noA