Skip to content

EventSystem Fix

Salut, Et voici un nouveau petit script encore une fois pour les UI et Canvas. Ce dernier va permettre de redéfinir le « First Selected » du component EventSystem de manière à ce que votre canvas puisse garder en sélection et en mémoire le dernier Bouton/Slider… sélectionné.

Si par exemple, pour un menu, la souris est utilisé et qu’un clic est effectué en dehors des boutons du votre menu, le focus ne sera pas perdu sur votre élément et permettra donc de garder une navigation au clavier et de cacher votre curseur de souris si tel est votre désir.

Il fonctionnera tout seul en arrière plan, il ne vous reste qu’à spécifier le GameObject en FirstSelected et vous voilà tranquille.

 

Pensez à bien renseigner la variable eventSystem correctement pour qu’elle pointe vers le GameObject détenant le component EventSystem.

using UnityEngine;
using UnityEngine.EventSystems;

public class EventSystemFix : MonoBehaviour
{

    public GameObject firstSelected;

    private EventSystem eventSystem;

    private GameObject lastSelected;
    private bool onEnable = false, firstStart = true;

    private void OnEnable() { if (!firstStart) { onEnable = true; } }

    private void Start()
    {
        // Si le component EventSystem n'est pas sur le même GameObject
        // Pensez à bien préciser sa localisation dans la varible ci-dessous !!!!
        eventSystem = GetComponent();

        onEnable = true;
        firstStart = false;
    }

    private void Update() { GetCurrentSelected(); SetSelected(); }

    private void OnDisable() { eventSystem.SetSelectedGameObject(null); onEnable = false; }

    private void GetCurrentSelected()
    {
        // Sauvegarde du nouvel élément sélectionné
        if (eventSystem.currentSelectedGameObject != lastSelected && eventSystem.currentSelectedGameObject != null)
        {
            lastSelected = eventSystem.currentSelectedGameObject;
        }

        // On restaure le dernier élément sélectionné lors d'une perte de focus
        else if (eventSystem.currentSelectedGameObject != lastSelected && eventSystem.currentSelectedGameObject == null)
        {
            eventSystem.SetSelectedGameObject(lastSelected);
        }
    }

    private void SetSelected()
    {
        if (onEnable)
        {
            lastSelected = firstSelected;

            eventSystem.SetSelectedGameObject(firstSelected);

            onEnable = false;
        }
    }

}

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

w

Connexion à %s