En este momento estás viendo Detectar si 2D Collider está tocando el puntero del mouse de otro script en Unity 2D

 – Unity

Detectar si 2D Collider está tocando el puntero del mouse de otro script en Unity 2D – Unity

Detectar si 2D Collider está tocando el puntero del mouse de otro script en Unity 2D

– UnityAssets3Free

bienvenido , por aqui josel luis y en esta ocasion os traigo
esta nueva pregunta

Estoy trabajando en un proyecto que usa Unity2D, el objetivo es poder hacer referencia a otros scripts principales para obtener información. En este caso específico, necesito detectar si el puntero del mouse está tocando un colisionador, pero desde un script separado.

Normalmente, podría crear un valor booleano y, al pasar el mouse, configurarlo en verdadero, en la salida del mouse configurarlo en falso, así:

bool isHovered;

void OnMouseEnter() 
    isHovered = true;


void OnMouseExit() 
    isHovered = false;

Sin embargo, en la secuencia de comandos, en lugar de hacer esto para cada secuencia de comandos individual, me gustaría hacer referencia a otra secuencia de comandos, como esta:

public GameManager g;

void Update() 
    if (g.IsTouchingMouse(gameObject))  //Code 

Pero hay varios problemas con esto. En mi clase de administrador de juegos necesitaría algo como esto

public bool IsTouchingMouse(gameObject g) return value

Hay varios problemas con esto, porque no tengo forma de registrar los eventos OnMouseEnter y OnMouseExit para estos objetos en otro script, y no tengo forma de almacenar los valores para cada gameObject para asegurar que esto funcione para cada objeto sin tener que hacerlo. modificar manualmente este script.

Estoy buscando dos cosas, # 1, ¿cómo puedo detectar mouseovers en objetos de scripts cuyos padres no son este gameObject, dos, hay alguna idea de cómo crearía una función para devolver esta variable al instante?

3 respuestas 3

Un poco molesto, pero encontré una solución unos minutos después de publicar. Así que lo compartiré aquí.

public bool IsTouchingMouse(GameObject g)

    Vector2 point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    return g.GetComponent<Collider2D>().OverlapPoint(point);

Lo que este código básicamente está haciendo es crear una función que toma un gameObject como entrada, crea un vector2 basado en la posición del cursor del mouse en el espacio mundial y luego devuelve el clima o no, el colisionador 2D que contiene el objeto está tocando este punto imaginario, la variable «punto» debe ser intercambiable con cualquier ubicación en el espacio mundial 2D. Estaba complicando todo el asunto.

Encuentre dos características que le gusten e impórtelas a los activos de Unity y establezca su tipo de textura en cursor

Cree un nuevo script y móntelo en un objeto vacío. Abra el script, cree tres variables públicas de tipo Texture2D, regrese a Unity y arrastre su mapa de puntero favorito a la ventana de variables.

Para definir la etiqueta del objeto, juzgamos qué puntero cambiar al personalizar la etiqueta; así que primero establezca la etiqueta para el objeto. Por ejemplo, el piso, le agregué la etiqueta Suelo, el muro le agregué la etiqueta Muro; la columna agregó la etiqueta Cilindro.

Escriba un método para cambiar el puntero del mouse, donde la API principal para cambiar el puntero es Cursor.SetCursor()

      void setCursorTexture()
      
          Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//Define the ray pointed by the mouse in the game window
          RaycastHit hitInfo; //Information of ray collision
          if (Physics.Raycast(ray, out hitInfo))//Determine whether to hit the object
         
            // switch pointer
            switch (hitInfo.collider.gameObject.tag)
           
             case "Ground":
                 Cursor.SetCursor(groundCr, new Vector2(16, 16), CursorMode.Auto);
                 break;
             case "Wall":
                 Cursor.SetCursor(wallCr, new Vector2(16, 16), CursorMode.Auto);
                 break;
             case "Cylinder":
                 Cursor.SetCursor(CylinderCr, new Vector2(16, 16), CursorMode.Auto);
                 break;
             default:
                 Cursor.SetCursor(null,Vector2.zero,CursorMode.Auto);
                 break;
              
          
       

Implemente este método en el método Update() llamado cada cuadro.

FIN (puedes ir a ejecutar el programa) Gracias y espero poder ayudarte

Este método funciona sin excepción. Para resolver el problema, pruebe el siguiente método:

public Collider2D collider; // target Collider

void Update()

    var mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
    
    if (collider.bounds.IntersectRay(mouseRay)) Debug.Log("Mouse on collider..");

¿Para el nuevo sistema de entrada?

Pero Input.mousePosition da un nuevo error de sistema en Unity. Para resolver este problema, llame a la posición del mouse como se muestra a continuación:

var mousePos = Mouse.current.position.ReadValue();

También puedes comprobar if (new input system enabled) está activo de la siguiente manera:

#if ENABLE_INPUT_SYSTEM
    var mousePos = Mouse.current.position.ReadValue();
#else
    var mousePos = Input.mousePosition;
#endif

luego siga la dirección del haz de la cámara:

var mouseRay = Camera.main.ScreenPointToRay(mousePos);

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

sin mas,espero que te halla servido

Deja una respuesta