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