Unity で EventSystem.current が null になってる問題

目次

はじめに

EventSystem は GUI におけるユーザーからの受付を管理するためのクラスで、EventSystem.enabled を false にすることでボタン入力などを受け付けないようにできます。
EventSystem はシーンに1つしかないので、EventSystem.current という static フィールドを利用することで EventSystem の参照を取れます。

docs.unity3d.com

問題点

EventSystem.current.enabled を false にするとその後 EventSystem.current.enabled = true として戻そうとしても、current が null といって怒られてしまう。

原因

EventSystem.current は enabled が false のときは取得できない(と思う)。

解決策

一時的に別の変数に入れておく。

using UnityEngine;
using UnityEngine.EventSystems;

public class Test : MonoBehaviour {
    private EventSystem es;
    
    public void Start() {
        es = EventSystem.current;
    }

    public void Lock() {
        es.enabled = false;
    }
    
    public void Unlock() {
        es.enabled = true;
    }
}
応用

今回の話とはちょっと関係ないですが、ロックの数を数えとくと、複数の箇所からのロック・アンロックに対応できるので便利です。

using UnityEngine;
using UnityEngine.EventSystems;

public class UIManager : MonoBehaviour {
    private int eventSystemLockCount = 0;

    public bool isEventSystemLocked
    {
        get
        {
            return eventSystemLockCount > 0;
        }
    }

    private EventSystem eventSystem;

    public void Start() {
        eventSystem = EventSystem.current;
    }

    public void LockEventSystem() {
        eventSystemLockCount++;
        eventSystem.enabled = false;
    }

    public void Unlock() {
        eventSystemLockCount--;

        if (eventSystemLockCount <= 0)
        {
            eventSystem.enabled = true;
        }
    }
}