En este momento estás viendo ¿Cómo hacer que el juego ignore los clics en los botones de la interfaz de usuario en Unity3D?

 – Unity

¿Cómo hacer que el juego ignore los clics en los botones de la interfaz de usuario en Unity3D? – Unity

¿Cómo hacer que el juego ignore los clics en los botones de la interfaz de usuario en Unity3D?

– UnityAssets3Free

buenas , soy jorge y hoy os traigo
nueva pregunta curiosa

tengo una interfaz de usuario Button (usando UnityEngine.UI).

Sin embargo, al hacer clic Button parece ser hacer clic a la escena (en mi caso, haciendo clic en una malla de navegación).

¿Cómo resolver este problema?

He estado usando el código típico de Unity3D para que el usuario ingrese al juego, como

if (Input.GetMouseButtonDown(0))
  {

incluso si intento el enfoque

if( Input.touches.Length > 0 )
        {

        if ( Input.touches[0].phase == TouchPhase.Began )
            {

y parece ser el caso en iOS, Android y escritorio.

Parece ser un problema básico que hace clic en la interfaz de usuario (UnityEngine.UI.Button etc) parecen caer en el juego.

3 respuestas 3

Así es como lo haces en Unity hoy:

  1. Por supuesto que tendrás un EventSystem en la jerarquía, solo asegúrese de hacerlo. (Obtiene uno de estos automáticamente cuando, por ejemplo, agrega un lienzo; por lo general, cada escena en un proyecto de Unity ya tiene un EventSystempero solo asegúrate de tener uno).

  2. Agrega uno presentador de física a la cámara (que toma un clic)

  3. Ellos hacen esto:

.

  using UnityEngine.EventSystems;
  public class Gameplay:MonoBehaviour, IPointerDownHandler 
   public void OnPointerDown(PointerEventData eventData) 
    Bingo();
    
   

Básicamenteotra vez básicamenteeso es todo lo que hay.

Muy simple: así es como manejas el toque en Unity. Eso es todo al respecto.

Agregue un raycaster y tenga este código.

Parece fácil y es fácil. Sin embargo, puede ser complicado hacerlo bien.

(Nota al pie: algunos horrores de arrastrar en Unity: horrores de OnPointerDown versus OnBeginDrag en Unity3D)

El viaje de Unity a través de la tecnología táctil ha sido fascinante:

  1. «Early Unity»… fue extremadamente fácil. Completamente inutil. No funcionó.

  2. «Unidad ‘nueva’ actual»… Funciona maravillosamente. Muy fácil, pero difícil de usar por expertos.

  3. «Próximamente Future Unity»… Para 2025 harán que ambos funcionen y sean fáciles de usar. No contengas la respiración.

(La situación no es diferente de Unity interfaz de usuario sistema. Al principio, el sistema de interfaz de usuario era ridículo. Ahora es genial, pero un poco complejo de usar de manera especializada. A partir de 2019, están a punto de cambiar totalmente nuevamente).

(La red es la misma. Al principio era basura total. La «nueva» red es/era muy buena, pero tiene algunas opciones muy malas. Recientemente, en 2019, cambiaron la red nuevamente).

¡Consejo útil relacionado!

¡Recordar! Cuando tienes pantalla completa invisible panel que contiene algunos botones. En el propio panel invisible de pantalla completa, debe apagar transmisión de rayos! Es fácil de olvidar:

Como pregunta histórica: aquí está la solución rápida para «omitir la interfaz de usuario», que solía poder usar en la Unidad hace años…

if (Input.GetMouseButtonDown(0))  // doesn't really work...
  if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
      return;
  Bingo();
  

Ya no puedes hacer eso, han pasado algunos años.

Yo también tuve este problema y no pude encontrar información muy útil al respecto, esto es lo que funcionó para mí:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class SomeClickableObject : MonoBehaviour

    // keep reference to UI to detect for
    // for me this was a panel with some buttons
    public GameObject ui;

    void OnMouseDown()
    
        if (!this.IsPointerOverUIObject())
        
            // do normal OnMouseDown stuff
        
    

    private bool IsPointerOverUIObject()
    
        // get current pointer position and raycast it
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        // check if the target is in the UI
        foreach (RaycastResult r in results) 
            bool isUIClick = r.gameObject.transform.IsChildOf(this.ui.transform); 
            if (isUIClick) 
                return true;
            
        
        return false;
    

Esencialmente, cada clic verifica que el clic se produjo en un destino de la interfaz de usuario.

Desafortunadamente, las primeras recomendaciones no me ayudaron, así que solo cinco etiquetas de todos los paneles «UIPanel» y cuando se hace clic con el mouse, verifico si algún panel está actualmente activo.

    void Update()
     if (Input.GetMouseButtonDown(0))
        
            if (isPanelsOn()) 
            //doing nothing because panels is on
            else 
             //doing what we need to do
         

public static bool isPanelsOn()
    
        GameObject[] panels = GameObject.FindGameObjectsWithTag("UIPanel");
        foreach (var panel in panels)
        
           if (panel.activeSelf)
            
                return true; 
            
        
        return false;
    

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

por hoy,hasta la proxima

Deja una respuesta