Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

382
Vistas
¿Cómo obtener la posición del mouse fuera de la función OnGUI?

Estoy trabajando en una herramienta de Unity y quiero crear una GUI personalizada para ella.

En este sencillo script, verifico si el mouse se ha desplazado sobre un botón y, de ser así, cambio el color de la GUI. Este es solo un ejemplo realmente básico, pero los mismos principios se aplican a algo que quiero hacer.

El problema es que el cambio se retrasa mucho. Intenté implementar el estado isDirty, donde solo se vuelve a pintar cuando es necesario. Aunque parece que no funciona. El mismo problema de retraso... Podría volver a pintar la ventana en cada cuadro, pero eso realmente no funciona.

 private bool isDirty = false; Rect _hoveredRect; Rect HoveredRect { get { return _hoveredRect; } set { if (_hoveredRect != value) { isDirty = true; } _hoveredRect = value; } } void Update() { if (isDirty) { Repaint(); isDirty = false; } } void OnGUI() { Rect button = new Rect(25, 25, 100, 35); DrawButton(button, "Label"); } bool DrawButton(Rect rect, string label) { var e = Event.current; bool hovered = rect.Contains(e.mousePosition); if (hovered) { HoveredRect = rect; } if (!hovered && HoveredRect == rect) { HoveredRect = Rect.zero; } var defaultColor = GUI.color; GUI.color = hovered ? Color.red : defaultColor; bool pressed = GUI.Button(rect, label); GUI.color = defaultColor; return pressed; }

Luego se me ocurrió otra solución, que debería funcionar, pero necesito obtener la posición del mouse y no puedo usar Event.current fuera de la función OnGUI.

 Dictionary<Rect, bool> hoverableRects = new Dictionary<Rect, bool>(); private void OnEnable() { EditorApplication.update += UpdateMe; } private void OnDisable() { EditorApplication.update -= UpdateMe; } void UpdateMe() { var mousePos = ??; List<Rect> rects = new List<Rect>(hoverableRects.Keys); foreach (var rect in rects) { hoverableRects[rect] = rect.Contains(mousePos); } } void OnGUI() { Rect button = new Rect(25, 25, 100, 35); DrawButton(button, "Label"); } bool DrawButton(Rect rect, string label) { if (!hoverableRects.ContainsKey(rect)) { hoverableRects.Add(rect, false); } var defaultColor = GUI.color; GUI.color = hoverableRects[rect] ? Color.red : defaultColor; bool pressed = GUI.Button(rect, label); GUI.color = defaultColor; return pressed; }

¿Hay alguna manera de obtener la posición del mouse en cada cuadro fuera del método OnGUI?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Así que cuando dices que es lento. ¿Quiere decir que el cambio de color es lento para reaccionar, o que el proceso real de cambio de color es lento?...

Porque si su color es lento para cambiar inicialmente. Como si tu cursor estuviera ahí pero no estuviera haciendo nada porque en realidad no estás comprobando que el cursor esté sobre el botón en cada fotograma, o lo que sea...

Es posible que tenga if ('isDirty'?) en la actualización, lo cual hace ... Pero, el método que lo calcula NO está en la actualización, lo que significa que 'isDirty' se actualiza menos de una vez por cuadro.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda