ノートの端の書き残し

UnityやらC#やら。設計が得意かもしれない。

【Unity】UnityEventのRemoveAllListenersはインスペクタから登録したコールバックを削除しない

小ネタです。

[SerializeField] private Button button;
button.onClick.AddListener(callback);

ButtononClickにはスクリプトからコールバックを登録できます。 そして、

button.onClick.RemoveAllListeners();

スクリプトから、登録したコールバックを削除することもできます。

が、
f:id:u_osusi:20190917221203p:plain
インスペクタから登録したコールバックは削除されません。

理由は、UnityEventの基底クラス、UnityEventBaseの中身を見るとわかります。

github.com

private InvokableCallList m_Calls;
[FormerlySerializedAs("m_PersistentListeners")]
[SerializeField] private PersistentCallGroup m_PersistentCalls;

AddListenerとかでいじられているのは全部m_Callm_PersistentCallsは無傷で、これがインスペクタから登録するやつです。 persistentの名前の通り、簡単には削除できないようですね。(リフレクションでごり押したら知らんけど)