Unity で EventSystem.current が null になってる問題
目次
はじめに
EventSystem は GUI におけるユーザーからの受付を管理するためのクラスで、EventSystem.enabled を false にすることでボタン入力などを受け付けないようにできます。
EventSystem はシーンに1つしかないので、EventSystem.current という static フィールドを利用することで EventSystem の参照を取れます。
問題点
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; } } }