現場レベルのゲーム制作が、すべてここで学べます。
Unityでトグルを操作するとき、コードから値を変えているだけなのにonValueChangedが呼ばれてしまうという場面はないでしょうか。
そんなときに使えるのが SetIsOnWithoutNotify() です。このメソッドを使うと、onValueChangedを発火させずにToggleのON/OFFを切り替えることができます。
この記事では基本的な使い方から、実際にどんな場面で役立つかまで解説します。
SetIsOnWithoutNotifyとは
UnityのToggleコンポーネントには、値を変えてもonValueChangedを発火させずにON/OFFを切り替えられるメソッドが用意されています。それが SetIsOnWithoutNotify() です。
通常の toggle.isOn = false では値の変更と同時にonValueChangedが呼ばれますが、このメソッドを使うとイベントを発火させずにUIの見た目だけを更新できます。
通常のトグルUIのオンオフ変更との違い
BGMのON/OFFを切り替えるトグルを例に、2つの書き方の違いを確認します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class SoundSettingsUI : MonoBehaviour { public Toggle bgmToggle; void Start() { // トグルが変わったときの処理を登録 bgmToggle.onValueChanged.AddListener(OnBgmToggleChanged); // isOn で変更 → onValueChanged が呼ばれる bgmToggle.isOn = false; // SetIsOnWithoutNotify で変更 → onValueChanged は呼ばれない bgmToggle.SetIsOnWithoutNotify(true); } void OnBgmToggleChanged(bool isOn) { Debug.Log("BGM設定が変更されました: " + isOn); // ここにBGMのON/OFF処理を書く } } |
このコードを実行すると、コンソールには「BGM設定が変更されました」が1回だけ表示されます。SetIsOnWithoutNotify() の行ではイベントが発火していないことが確認できます。
| 書き方 | UIの見た目 | onValueChangedの発火 |
|---|---|---|
| toggle.isOn = false | 更新される | される |
| toggle.SetIsOnWithoutNotify(false) | 更新される | されない |
どんなときに使うのか
セーブデータをロードしてUIに反映するとき
ゲーム起動時にセーブデータをToggleに反映したい場面では、isOn を使うとロードのたびにonValueChangedが呼ばれてしまいます。
|
1 2 3 4 5 |
// NG:ロードのたびにonValueChangedが呼ばれてしまう bgmToggle.isOn = saveData.bgmEnabled; // OK:UIの見た目だけ復元できる bgmToggle.SetIsOnWithoutNotify(saveData.bgmEnabled); |
セーブデータの読み込みは「プレイヤーが操作した」わけではなく、あくまでUIの復元です。SetIsOnWithoutNotify() を使うことで、余計な処理を走らせずに済みます。
コードからToggleをリセットするとき
たとえば残金不足で施設を強制OFFにするような処理では、コードから isOn を書き換えると再びonValueChangedが呼ばれてしまいます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
private void ForceOffBecauseNoMoney() { StopBilling(); // isOn = false にすると onValueChanged が再び呼ばれてしまう // toggle.isOn = false; ← NG // SetIsOnWithoutNotify ならイベントを発火させずにOFFにできる toggle.SetIsOnWithoutNotify(false); // OK ApplyActive(false); } |
注意点:止められるのはUnityの標準イベントだけ
SetIsOnWithoutNotify() が止められるのは、onValueChangedなどUnityが用意した標準イベントのみです。
自分でAddListenerした処理の中に独自ロジックが含まれている場合、そちらはこのメソッドでは止められません。独自ロジックまで含めて制御したい場合は、別途 suppressCallback のようなフラグを用意する必要があります。
| 何が止まるか | 誰が用意するか | |
|---|---|---|
| SetIsOnWithoutNotify() | Unityの標準イベント(onValueChanged等) | Unity |
| suppressCallbackフラグ | 自分で書いたゲーム独自のロジック | 自分 |
両方組み合わせることで、より安全にイベントを制御できます。
関連記事:Unity UIのイベントの無限ループ対策 コードからUI変更するイベントをフラグで止める対策パターン

まとめ
- SetIsOnWithoutNotify() はToggleの値をonValueChangedを発火させずに変更できるUnity標準メソッド
- セーブデータのロード時やコードからの強制変更など、「プレイヤーが操作したわけではない」場面で活躍する
- 止められるのはUnityの標準イベントのみ。独自ロジックまで止めたい場合はsuppressCallbackフラグと組み合わせる
現場レベルのゲーム制作が、すべてここで学べます。






コメント