Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9749

"SendMessage cannot be called during Awake"を出さずにインスペクターの値を反映させる

$
0
0

グラフィカルなボタンをデザインして、その表示内容をスクリプトで切り替えたい場合があります。
DuaringAwake00.png

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()を使ってインスペクターの値を変更すると、
DuaringAwake01.png
と一応は反映されますが、"SendMessage cannot be called during Awake, CheckConsistency, or OnValidate UnityEngine.StackTraceUtility:ExtractStackTrace ()"という警告が出ます。
DuaringAwake02.png
しかも#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()が実際に実行されインスペクターの値が反映されるという仕組みです。
DuaringAwake03.png
"SendMessage cannot be called during Awake"の警告が出なくなりました。


Viewing all articles
Browse latest Browse all 9749

Trending Articles