グラフィカルなボタンをデザインして、その表示内容をスクリプトで切り替えたい場合があります。
ButtonTextSelector.cs
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassButtonTextSelector:MonoBehaviour{publicSprite[]Jp;publicSprite[]En;publicenumTxtList{Tutorial,Option,GameStart,OK,Tweet,Title,Skip,Close}publicboolisJp=true;[SerializeField]privateTxtList_Txt=TxtList.OK;publicTxtListTxt{set{_Txt=value;intidx=(int)Txt;if(isJp){GetComponent<SpriteRenderer>().sprite=Jp[idx];}else{GetComponent<SpriteRenderer>().sprite=En[idx];}}get{return_Txt;}}}ですが、このままでは実行するまで表示内容がかわらないため、インスペクターで設定した値で表示内容を確認したい場合、
voidOnValidate(){Txt=Txt;}のようにOnValidate()をつけてインスペクターの値が変更されたときの処理を書くことが多いと思いますが、このOnValidate()を使ってインスペクターの値を変更すると、
と一応は反映されますが、"SendMessage cannot be called during Awake, CheckConsistency, or OnValidate UnityEngine.StackTraceUtility:ExtractStackTrace ()"という警告が出ます。
しかも#pragma warning disable XXX で表示を消すことが出来ず、非常にうざったらしいです。
なのでこの警告を出さずにインスペクターの値を反映させるためには、クラスの頭に[ExecuteAlways]アトリビュートをつけて、Update()で更新させるようにします。
ButtonTextSelector.cs
usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;[ExecuteAlways]publicclassButtonTextSelector:MonoBehaviour{publicSprite[]Jp;publicSprite[]En;publicenumTxtList{Tutorial,Option,GameStart,OK,Tweet,Title,Skip,Close}publicboolisJp=true;[SerializeField]privateTxtList_Txt=TxtList.OK;publicTxtListTxt{set{_Txt=value;intidx=(int)Txt;if(isJp){GetComponent<SpriteRenderer>().sprite=Jp[idx];}else{GetComponent<SpriteRenderer>().sprite=En[idx];}}get{return_Txt;}}voidUpdate(){if(!Application.isPlaying){Txt=Txt;}}}[ExecuteAlways]をつけるとエディター上でも実行中と同じ処理を行うようになるため、Update()が実際に実行されインスペクターの値が反映されるという仕組みです。
"SendMessage cannot be called during Awake"の警告が出なくなりました。