Resultados 1 al 8 de 8

Tema: Problema cambiando de GUITextures a UI Images

  1. #1
    Fecha de ingreso
    May 2023
    Mensajes
    5
    Gracias (Dadas)
    0
    Gracias (Recibidas)
    0

    Problema cambiando de GUITextures a UI Images

    Hola chicos, por favor necesito su ayuda. Hace mucho que no toco Unity y realmente no sé cómo solucionar este problema.


    Estoy cambiando todas mis GUITextures a UI Images y no puedo obtener los mismos resultados que solía tener con mis GUITextures anteriores. En mi versión de GUITextures, solía detectar cuándo (por ejemplo) se presionaba mi botón de disparo en un teléfono móvil usando esta función (he tomado solo un pedazo concreto para no alargarlo mucho):

    public virtual IEnumerator botones()
    {
    foreach (Touch touch in Input.touches)
    {
    if ((touch.phase == TouchPhase.Stationary) && this.fireButton.HitTest(touch.position))
    {
    this.shoot = true;
    }
    else
    {
    if ((touch.phase == TouchPhase.Ended) && this.fireButton.HitTest(touch.position))
    {
    this.shoot = false;
    }
    }
    }
    [COLOR=#4D4DFF][FONT=Inter]}
    Lo que me gustaba de esto era lo siguiente:
    1.- Para disparar pulsa el botón rojo.
    2.- Para disparo continuo, pulsa el botón rojo y desliza ligeramente el dedo antes de levantarlo.


    El problema es que no tengo la función "HitTest" en los UI Image. ¿Hay algo similar que pueda usar? No quiero cambiar la estructura de mi código porque afectará otras cosas. Me gustaría detectar desde el mismo código si se toca la UI Image (fireButton).

    Muchas gracias por la ayuda.

  2. #2
    Fecha de ingreso
    Apr 2002
    Mensajes
    27,686
    Gracias (Dadas)
    3627
    Gracias (Recibidas)
    5169

    Has probado con "raycast" en Unity UI

    Hola. ¿Has probado con "raycast" en Unity UI, puedes utilizar eventos de raycast para detectar interacciones con elementos de imagen. La detección de clics o interacciones se basa en la interacción con el componente GraphicRaycaster y la implementación de interfaces como IPointerClickHandler o IPointerDownHandler.

    Aquí hay un ejemplo de cómo puedes detectar clics en un elemento de imagen de Unity UI utilizando eventos de raycast:

    Código:
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    public class ImageClickHandler : MonoBehaviour, IPointerClickHandler
    {
        public void OnPointerClick(PointerEventData eventData)
        {
            Debug.Log("Clic en la imagen");
        }
    }
    Ya comentarás cómo te va. Un saludo.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  3. #3
    Fecha de ingreso
    May 2023
    Mensajes
    5
    Gracias (Dadas)
    0
    Gracias (Recibidas)
    0
    Cita Iniciado por 3dpoder Ver mensaje
    Hola. ¿Has probado con "raycast" en Unity UI, puedes utilizar eventos de raycast para detectar interacciones con elementos de imagen. La detección de clics o interacciones se basa en la interacción con el componente GraphicRaycaster y la implementación de interfaces como IPointerClickHandler o IPointerDownHandler.Aquí hay un ejemplo de cómo puedes detectar clics en un elemento de imagen de Unity UI utilizando eventos de raycast:
    Código:
    using UnityEngine;using UnityEngine.UI;using UnityEngine.EventSystems;public class ImageClickHandler : MonoBehaviour, IPointerClickHandler{    public void OnPointerClick(PointerEventData eventData)    {        Debug.Log("Clic en la imagen");    }}
    Ya comentarás cómo te va. Un saludo.
    Hola amigo, gracias por responder tan rápido. Lo único que veo es que en este caso que me envías tendría que agregar a cada imagen un "Event trigger" y asociar cada una al script donde manejo los botones y a esa función. Intenté algo así pero no podía lograr lo del disparo continuo. Por eso quería hacerlo directamente desde el código sin agregar nada a la UI Image.

  4. #4
    Fecha de ingreso
    Apr 2002
    Mensajes
    27,686
    Gracias (Dadas)
    3627
    Gracias (Recibidas)
    5169
    Entiendo, quieres evitar agregar un "Event Trigger" a cada imagen y prefieres manejar la interacción directamente desde el código, hay una solución que puedes intentar.

    En lugar de utilizar el evento "OnPointerClick" como se muestra en el ejemplo anterior, puedes utilizar el evento "OnPointerDown" y "OnPointerUp" para detectar el inicio y fin de una interacción con la imagen. De esta manera, puedes simular el disparo continuo al mantener presionado el botón.

    Aquí tienes un ejemplo de cómo podrías implementarlo:

    Código:
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    public class ImageClickHandler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
    {
        private bool isPressed = false;
    
        public void OnPointerDown(PointerEventData eventData)
        {
            Debug.Log("Inicio de interacción con la imagen");
            isPressed = true;
        }
    
        public void OnPointerUp(PointerEventData eventData)
        {
            Debug.Log("Fin de interacción con la imagen");
            isPressed = false;
        }
    
        private void Update()
        {
            if (isPressed)
            {
                // Lógica para disparo continuo
                Debug.Log("Disparo continuo");
            }
        }
    }
    En este ejemplo, la variable isPressed se utiliza para mantener un seguimiento del estado de la interacción con la imagen. Al detectar el inicio de la interacción en OnPointerDown, establecemos isPressed como verdadero. Al detectar el fin de la interacción en OnPointerUp, establecemos isPressed como falso.

    Luego, en el método Update, puedes verificar si isPressed es verdadero para realizar la lógica de disparo continuo. Aquí, he incluido un mensaje de depuración para que puedas verlo en la consola, pero puedes reemplazarlo con tu propia lógica de disparo continuo.

    Recuerda adjuntar este script a tu objeto de imagen (UI Image) y asegurarte de que no haya ningún otro componente en conflicto que maneje eventos de interacción en la imagen.

    Espero que esta solución te sea útil, ya contarás.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  5. #5
    Fecha de ingreso
    May 2023
    Mensajes
    5
    Gracias (Dadas)
    0
    Gracias (Recibidas)
    0
    Cita Iniciado por 3dpoder Ver mensaje
    Entiendo, quieres evitar agregar un "Event Trigger" a cada imagen y prefieres manejar la interacción directamente desde el código, hay una solución que puedes intentar.

    En lugar de utilizar el evento "OnPointerClick" como se muestra en el ejemplo anterior, puedes utilizar el evento "OnPointerDown" y "OnPointerUp" para detectar el inicio y fin de una interacción con la imagen. De esta manera, puedes simular el disparo continuo al mantener presionado el botón.

    Aquí tienes un ejemplo de cómo podrías implementarlo:

    Código:
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    public class ImageClickHandler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
    {
        private bool isPressed = false;
    
        public void OnPointerDown(PointerEventData eventData)
        {
            Debug.Log("Inicio de interacción con la imagen");
            isPressed = true;
        }
    
        public void OnPointerUp(PointerEventData eventData)
        {
            Debug.Log("Fin de interacción con la imagen");
            isPressed = false;
        }
    
        private void Update()
        {
            if (isPressed)
            {
                // Lógica para disparo continuo
                Debug.Log("Disparo continuo");
            }
        }
    }
    En este ejemplo, la variable isPressed se utiliza para mantener un seguimiento del estado de la interacción con la imagen. Al detectar el inicio de la interacción en OnPointerDown, establecemos isPressed como verdadero. Al detectar el fin de la interacción en OnPointerUp, establecemos isPressed como falso.

    Luego, en el método Update, puedes verificar si isPressed es verdadero para realizar la lógica de disparo continuo. Aquí, he incluido un mensaje de depuración para que puedas verlo en la consola, pero puedes reemplazarlo con tu propia lógica de disparo continuo.

    Recuerda adjuntar este script a tu objeto de imagen (UI Image) y asegurarte de que no haya ningún otro componente en conflicto que maneje eventos de interacción en la imagen.

    Espero que esta solución te sea útil, ya contarás.

    Hola amigo, ante todo muchas gracias por la ayuda. Ayer lo solucioné sin embargo quiero probar también la solución que propones.

    Te comento cómo lo hice. Resulta que hay una función en los UI Image que te dice la posición exacta donde está y esto no varía aunque cambies la resolución de pantalla y es: rectTransform.anchoredPosition

    Entonces lo que hice para adaptarlo a mi código fue crear una variable del tipo Rect llamada fireP donde pregunto la posición y luego el código que puse arriba quedaría así:


    Código:
    public virtual IEnumerator botones()
    {
    // Esta es la variable aunque la puse en Start porque nada más necesito que se asigne una vez
    Rect fireP = new Rect(this.fireButton.rectTransform.anchoredPosition.x,this.fireButton.rectTransform.anchoredPosition.y,120,120);
    foreach (Touch touch in Input.touches)
    {
    if ((touch.phase == TouchPhase.Stationary) && fireP.Contains(touch.position))
    {
    this.shoot = true;
    }
    else
    {
    if ((touch.phase == TouchPhase.Ended) && fireP.Contains(touch.position))
    {
    this.shoot = false;
    }
    }
    }
    De esta manera funciona exactamente igual que como lo tenía con el GUITexture.

  6. #6
    Fecha de ingreso
    May 2023
    Mensajes
    5
    Gracias (Dadas)
    0
    Gracias (Recibidas)
    0
    Miento... no funciona correctamente cuando se carga en teléfonos con otro tipo de pantalla. Es extraño, porque los botones se ven bien, pero parece que el Rect no se ajusta correctamente a ellos.

    Por ejemplo, en un Huawei P30 Lite se muestra correctamente, pero en un Samsung Galaxy S4 (que utilizo para hacer pruebas) aunque los botones se ven bien, no se corresponden con su posición en la pantalla. Me aseguré de configurar en el canvas para que se escalen con la pantalla, pero aún así persiste el problema.

    ¡Qué frustrante! Antes era tan fácil con los GuiTextures... no entiendo por qué los eliminaron.

  7. #7
    Fecha de ingreso
    May 2023
    Mensajes
    5
    Gracias (Dadas)
    0
    Gracias (Recibidas)
    0
    Cita Iniciado por cgutierrez71 Ver mensaje
    Hola amigo, ante todo muchas gracias por la ayuda. Ayer lo solucioné sin embargo quiero probar también la solución que propones.

    Te comento cómo lo hice. Resulta que hay una función en los UI Image que te dice la posición exacta donde está y esto no varía aunque cambies la resolución de pantalla y es: rectTransform.anchoredPosition

    Entonces lo que hice para adaptarlo a mi código fue crear una variable del tipo Rect llamada fireP donde pregunto la posición y luego el código que puse arriba quedaría así:


    public virtual IEnumerator botones()
    {
    // Esta es la variable aunque la puse en Start porque nada más necesito que se asigne una vez
    Rect fireP = new Rect(this.fireButton.rectTransform.anchoredPositio n.x,this.fireButton.rectTransform.anchoredPosition .y,120,120);
    foreach (Touch touch in Input.touches)
    {
    if ((touch.phase == TouchPhase.Stationary) && fireP.Contains(touch.position))
    {
    this.shoot = true;
    }
    else
    {
    if ((touch.phase == TouchPhase.Ended) && fireP.Contains(touch.position))
    {
    this.shoot = false;
    }
    }
    }

    De esta manera funciona exactamente igual que como lo tenía con el GUITexture.
    Una pregunta. El script que pusiste arriba donde iría? En la cámara? El punto es que yo desarrollo todo el manejo de los botones desde mi player que es una nave y ese player tiene varias cámaras para cambiar las vistas, no se si es viable colocar esas instrucciones de OnPointerDown(PointerEventData eventData)... etc en mi scriptPlayer. Lo intenté pero no me detecta nada cuando toco las imágenes.

  8. #8
    Fecha de ingreso
    Apr 2002
    Mensajes
    27,686
    Gracias (Dadas)
    3627
    Gracias (Recibidas)
    5169
    Respecto a tu pregunta sobre dónde colocar el script, si deseas desarrollar el manejo de los botones desde tu jugador (nave) y tienes varias cámaras para cambiar las vistas, puedes colocar estas instrucciones dentro del script asociado al jugador. Asegúrate de que el método botones() se llame desde el jugador en el momento y lugar adecuados, por ejemplo, en el método Update() o en un método específico para el manejo de entrada táctil.

    Si no estás detectando nada cuando tocas las imágenes, verifica si tienes los componentes necesarios en tus imágenes (por ejemplo, EventSystem, GraphicRaycaster, etc.). También asegúrate de que las imágenes tengan asignados los eventos OnPointerDown, OnPointerUp o OnPointerClick correctamente. Si sigues teniendo problemas, revisa la configuración de capas y colisiones en tu juego para asegurarte de que no haya ningún conflicto.

    Recuerda adaptar el código según tus necesidades y estructura de tu proyecto.

    Código:
    public virtual IEnumerator botones()
    {
        // Esta es la variable aunque la puse en Start porque nada más necesito que se asigne una vez
        Rect fireP = new Rect(this.fireButton.rectTransform.anchoredPosition.x, this.fireButton.rectTransform.anchoredPosition.y, 120, 120);
        
        foreach (Touch touch in Input.touches)
        {
            if ((touch.phase == TouchPhase.Stationary) && fireP.Contains(touch.position))
            {
                this.shoot = true;
            }
            else
            {
                if ((touch.phase == TouchPhase.Ended) && fireP.Contains(touch.position))
                {
                    this.shoot = false;
                }
            }
        }
    }
    A ver si así te funciona, ya comentarás...
    |Agradecer cuando alguien te ayuda es de ser agradecido|

Temas similares

  1. Cambiando de versión en Blender
    Por EADI en el foro Problemas con Programas
    Respuestas: 5
    : 17-05-2019, 04:52
  2. Vue Esprit Cambiando hojas de plantas
    Por Freemind en el foro Vue
    Respuestas: 0
    : 26-05-2012, 16:37
  3. Cambiando de forma
    Por arnaldo diaz en el foro Postproducción
    Respuestas: 1
    : 10-06-2007, 02:50
  4. Algo esta cambiando
    Por tatoman en el foro Infografía General
    Respuestas: 35
    : 12-06-2004, 20:57

Etiquetas para este tema