UI над каким объектом находится мышь

Графический интерфейс пользователя

UI над каким объектом находится мышь

Сообщение Woolf 22 дек 2014, 09:11

Определить, что мышь над объектом UI мы можем: EventSystem.current.IsPointerOverGameObject()

А как определить, что мышь находится над КОНКРЕТНЫМ объектом? Т.е. я хочу из скрипта понять, что если курсор находится над моей картинкой, то подсветить её. Я понимаю, что можно это сделать при помощи EventTrigger, но очень уж не хочется, громоздко слишком.

Пробовал так:

Синтаксис:
Используется csharp
void FixedUpdate() {

        if (EventSystem.current != null) {
            if (EventSystem.current.IsPointerOverGameObject()) {
                if (EventSystem.current.currentSelectedGameObject == gameObject) {
                    Debug.Log("Over " + EventSystem.current.currentSelectedGameObject);
                }
            }
        }
    }


не пашет..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: UI над каким объектом находится мышь

Сообщение Killerwhale 22 дек 2014, 20:11

Пример подсветки кнопок на C#

Синтаксис:
Используется csharp
public class ToggleStateChanges : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
    public Text ToggleLabel;
    public Text ToggleLabel2;
    public Image ToggleSprite;
    public Color HighlightSpriteColor;
    public Color HighlightTextColor;
    public Color ActiveSpriteColor;
    public Color ActiveTextColor;
    public Color NormalSpriteColor;
    public Color NormalTextColor;
    public Color PressSpriteColor;
    public Color PressTextColor;
    public Color DisableSpriteColor;
    public Color DisableTextColor;
    public bool Disabled;

    [ExecuteInEditMode]
    public void OnHighlight()
    {
        if (Disabled) return;
        if (ToggleSprite != null)
            ToggleSprite.color = HighlightSpriteColor;
        if (ToggleLabel != null)
            ToggleLabel.color = HighlightTextColor;
        if (ToggleLabel2!=null)
            ToggleLabel2.color = HighlightTextColor;
    }
    [ExecuteInEditMode]
    public void OnNormal()
    {
        if (Disabled) return;
        if (ToggleSprite != null)
            ToggleSprite.color = NormalSpriteColor;
        if (ToggleLabel != null)
            ToggleLabel.color = NormalTextColor;
        if (ToggleLabel2 != null)
            ToggleLabel2.color = NormalTextColor;
    }
    [ExecuteInEditMode]
    public void OnPressed()
    {
        if (Disabled) return;
        if (ToggleSprite != null)
            ToggleSprite.color = PressSpriteColor;
        if (ToggleLabel != null)
            ToggleLabel.color = PressTextColor;
        if (ToggleLabel2 != null)
            ToggleLabel2.color = PressTextColor;
    }
    [ExecuteInEditMode]
    public void IsActive(bool state)
    {
        if (Disabled) return;
        if (state)
        {
            if (ToggleSprite != null)
                ToggleSprite.color = ActiveSpriteColor;
            if (ToggleLabel != null)
                ToggleLabel.color = ActiveTextColor;
            if (ToggleLabel2 != null)
                ToggleLabel2.color = ActiveTextColor;
        }
        else
        {
            OnNormal();
        }
    }

    [ExecuteInEditMode]
    void Start()
    {
        if (Disabled) Disable();
        else Enable();
        IsActive(GetComponent<Toggle>().isOn);
        GetComponent<Toggle>().onValueChanged.AddListener(OnChangeAction);
    }
    [ExecuteInEditMode]
    private void OnChangeAction<T0>(T0 arg0)
    {
        if(arg0 is bool)
        IsActive((arg0 as bool?).Value);
    }
    [ExecuteInEditMode]
    public void OnPointerEnter(PointerEventData eventData)
    {
        if (!GetComponent<Toggle>().isOn)
        OnHighlight();
    }
    [ExecuteInEditMode]
    public void OnPointerExit(PointerEventData eventData)
    {
        if (!GetComponent<Toggle>().isOn)
        OnNormal();
    }
    [ExecuteInEditMode]
    public void OnPointerClick(PointerEventData eventData)
    {
        if (!GetComponent<Toggle>().isOn)
        OnPressed();
    }
    [ExecuteInEditMode]
    public void Disable()
    {
        Disabled = true;
        if (ToggleSprite != null)
            ToggleSprite.color = DisableSpriteColor;
        if (ToggleLabel != null)
            ToggleLabel.color = DisableTextColor;
        if (ToggleLabel2 != null)
            ToggleLabel2.color = DisableTextColor;
    }
    [ExecuteInEditMode]
    public void Enable()
    {
        Disabled = false;
        OnNormal();
    }
Killerwhale
UNITрон
 
Сообщения: 160
Зарегистрирован: 27 ноя 2014, 22:23

Re: UI над каким объектом находится мышь

Сообщение BenjaminMoore 22 дек 2014, 21:45

Нужно завести такой класс, и заменить на EventSystem объекте класс StandaloneInputModule этим
Синтаксис:
Используется csharp
public class ExtendedStandaloneInputModule : StandaloneInputModule
{
    public PointerEventData GetPointerEventData(int id /* -1 ЛКМ, -2 ПКМ */)
    {
        return GetLastPointerEventData(id);
    }

}
 


и код будет такой

Синтаксис:
Используется csharp
    private void Update()
    {
        var inst = EventSystem.current.currentInputModule as ExtendedStandaloneInputModule;
        if (inst == null) return;

        var data = inst.GetPointerEventData(-1);
        if (data == null) return;

        if (data.pointerEnter != null)
        {
            Debug.Log("Over " + data.pointerEnter);
        }
    }
 


но по задумке юнитеков необходимо использовать триггеры :)
My hands are hard. My mind is core.
ring0x0000 c0x0063 | write code in rust right now
Аватара пользователя
BenjaminMoore
UNITрон
 
Сообщения: 338
Зарегистрирован: 03 янв 2013, 18:07
Skype: benjminmoore

Re: UI над каким объектом находится мышь

Сообщение Woolf 23 дек 2014, 02:25

Killerwhale, спасибо. Самый адекватный метод. Конечно, еще много не доработанного. Ну что мешало в ивентсистем добавить поле для активного объекта? И все вопросы бы решились.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59


Вернуться в uGUI

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2