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?
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.