【Unity】SetIsOnWithoutNotifyの使い方|onValueChangedを発火させずにToggleを変更する | Unity入門の森 ゲームの作り方

【Unity】SetIsOnWithoutNotifyの使い方|onValueChangedを発火させずにToggleを変更する

Unity技術ブログ・開発テクニック

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

Unityでトグルを操作するとき、コードから値を変えているだけなのにonValueChangedが呼ばれてしまうという場面はないでしょうか。

そんなときに使えるのが SetIsOnWithoutNotify() です。このメソッドを使うと、onValueChangedを発火させずにToggleのON/OFFを切り替えることができます。

この記事では基本的な使い方から、実際にどんな場面で役立つかまで解説します。

【ゲームの作り方講座プレゼント中!】

SetIsOnWithoutNotifyとは

UnityのToggleコンポーネントには、値を変えてもonValueChangedを発火させずにON/OFFを切り替えられるメソッドが用意されています。それが SetIsOnWithoutNotify() です。

通常の toggle.isOn = false では値の変更と同時にonValueChangedが呼ばれますが、このメソッドを使うとイベントを発火させずにUIの見た目だけを更新できます。

通常のトグルUIのオンオフ変更との違い

BGMのON/OFFを切り替えるトグルを例に、2つの書き方の違いを確認します。

このコードを実行すると、コンソールには「BGM設定が変更されました」が1回だけ表示されます。SetIsOnWithoutNotify() の行ではイベントが発火していないことが確認できます。

書き方 UIの見た目 onValueChangedの発火
toggle.isOn = false 更新される される
toggle.SetIsOnWithoutNotify(false) 更新される されない

どんなときに使うのか

セーブデータをロードしてUIに反映するとき

ゲーム起動時にセーブデータをToggleに反映したい場面では、isOn を使うとロードのたびにonValueChangedが呼ばれてしまいます。

セーブデータの読み込みは「プレイヤーが操作した」わけではなく、あくまでUIの復元です。SetIsOnWithoutNotify() を使うことで、余計な処理を走らせずに済みます。

コードからToggleをリセットするとき

たとえば残金不足で施設を強制OFFにするような処理では、コードから isOn を書き換えると再びonValueChangedが呼ばれてしまいます。

注意点:止められるのはUnityの標準イベントだけ

SetIsOnWithoutNotify() が止められるのは、onValueChangedなどUnityが用意した標準イベントのみです。

自分でAddListenerした処理の中に独自ロジックが含まれている場合、そちらはこのメソッドでは止められません。独自ロジックまで含めて制御したい場合は、別途 suppressCallback のようなフラグを用意する必要があります。

  何が止まるか 誰が用意するか
SetIsOnWithoutNotify() Unityの標準イベント(onValueChanged等) Unity
suppressCallbackフラグ 自分で書いたゲーム独自のロジック 自分

両方組み合わせることで、より安全にイベントを制御できます。

関連記事:Unity UIのイベントの無限ループ対策 コードからUI変更するイベントをフラグで止める対策パターン

Unity UIのイベントの無限ループ対策 コードからUI変更するイベントをフラグで止める対策パターン
UnityでUIを開発したり、スクリプトでUIを操作していると「コードで値を変えたら意図しない関数が連鎖して無限ループしてしまう」という経験をしたことはないでしょうか。この問題を解決するのが suppressCallbackパターン です。...

まとめ

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

【ゲームの作り方講座もプレゼント中!】

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

タイトルとURLをコピーしました