Jump to content
Mega

ANSWERED Bloquear Raycast con UI

Recommended Posts

Hola, tengo un script que lo que hace es seleccionar un objeto al tocarlo (en el móvil), vale pues el problema es que cuando yo abro un menú del juego y toco por ejemplo un boton el objeto que este detrás se selecciona y no quiero eso. Busco alguna forma de que el menú bloque el raycast. He probado mil formas y ninguna funciona.

No se si me explico bien.

 

Gracias

Share this post


Link to post
Share on other sites
1 hour ago, francoe1 said:

El componente CanvasGroup tiene una opción para este comportamiento Ayuda.

Lo he probado y me sigue sin funcionar, influye algo donde ponga el script de los raycast?

A lo mejor tengo otro fallo

Share this post


Link to post
Share on other sites
7 hours ago, Mega said:

Busco alguna forma de que el menú bloque el raycast. He probado mil formas y ninguna funciona.

Podrías considerar que el juego se encuentra en el estado "menú" o "UI" (cuando abrís tu menú), y en dicho estado simplemente no procesar el raycast selector de objetos.

Ayudaría si subís el código encargado de seleccionar objetos. El graphic raycaster opera con UI:

Graphic Raycaster

El Graphic Raycaster es utilizado para raycast (emitir rayos) contra un Canvas. El Raycaster mira todos los Gráficos en el canvas y determina si uno de ellos ha sido golpeado.  

 

Si seleccionas objetos 3D usando Physics.Raycast, no estoy seguro de que este puede ser bloqueado (como un raycast de UI).

Edited by lightbug

Share this post


Link to post
Share on other sites
10 hours ago, lightbug said:

Podrías considerar que el juego se encuentra en el estado "menú" o "UI" (cuando abrís tu menú), y en dicho estado simplemente no procesar el raycast selector de objetos.

Ayudaría si subís el código encargado de seleccionar objetos. El graphic raycaster opera con UI:

Graphic Raycaster

El Graphic Raycaster es utilizado para raycast (emitir rayos) contra un Canvas. El Raycaster mira todos los Gráficos en el canvas y determina si uno de ellos ha sido golpeado.  

 

Si seleccionas objetos 3D usando Physics.Raycast, no estoy seguro de que este puede ser bloqueado (como un raycast de UI).

Si , el script es para seleccionar objetos 3D con Physics.Raycast. He visto que puedo hacer algo con el EventSystem pero tampoco consigo hacerlo funcionar

Luego subo el código.

Share this post


Link to post
Share on other sites
16 hours ago, lightbug said:

Podrías considerar que el juego se encuentra en el estado "menú" o "UI" (cuando abrís tu menú), y en dicho estado simplemente no procesar el raycast selector de objetos.

Ayudaría si subís el código encargado de seleccionar objetos. El graphic raycaster opera con UI:

Graphic Raycaster

El Graphic Raycaster es utilizado para raycast (emitir rayos) contra un Canvas. El Raycaster mira todos los Gráficos en el canvas y determina si uno de ellos ha sido golpeado.  

 

Si seleccionas objetos 3D usando Physics.Raycast, no estoy seguro de que este puede ser bloqueado (como un raycast de UI).

void Update ()
{
  if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
  {
    Ray ray = Camera.main.ScreenPointToRay (Input.touches[0].position);
    if (Physics.Raycast (ray, out hit))
    {
      if (hit.collider != null)
      {
        nombreHit = hit.collider.name;
        panelColor.SetActive (true);
      }
    }
  }
}

 

Edited by francoe1
Mantener el codfigo bien formateador.

Share this post


Link to post
Share on other sites

No había comprendido, pensé que se trataba de dos componentes del canvas.

1 - La solución a esto es como comento @lightbug desactivar la característica de "Selección" cuando se está visualizando el o los canvas que tendrían este problema.

2 - existe otra alternativa un poco más costosa, sería evaluar si el raycast colisiona con un componente del canvas.

private bool CollisionWithCanvas (Vector3 screenMousePosition)
{
  foreach (MaskableGraphic uiElement in uiParent.GetComponentsInChildren<MaskableGraphic> ())
  {
    if (uiElement.gameObject.activeInHierarchy && uiElement.enabled)
    {
      Vector2 point;
      RectTransformUtility.ScreenPointToLocalPointInRectangle (uiElement.rectTransform, screenMousePosition, null, out point);
      if (uiElement.rectTransform.rect.Contains (point))
        return true;
    }
  }
  return false;
}

 

Share this post


Link to post
Share on other sites

×
×
  • Create New...