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