[C#] Event System Fix

Cette section est destinée aux scripts partagés par la communauté. Chaque post est destiné à un script. Suivez bien les recommandations.
Nazarick
Messages : 60
Inscription : 03 Avr 2017 21:44

[C#] Event System Fix

Message par Nazarick » 22 Jan 2018 21:03

Salut,
Cela faisait un moment que je n'étais pas revenu. Quelques mois de pause


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

Image

Code : Tout sélectionner

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<EventSystem>();

        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;
        }
    }

}
Dernière édition par Nazarick le 22 Jan 2019 11:13, édité 2 fois.

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: [C#] Event System Fix

Message par E3DStef » 23 Jan 2018 01:32

A tester, mais en tout cas merci du partage !
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Répondre

Revenir vers « Scripts »