この記事でのバージョン
Unity 5.3.1f1 Personal
NGUI 3.9.7
はじめに
NGUIのアトラスを分割して新たなアトラスを作った場合など、
設定していたアトラスがなくなった場合、UISpriteのAtlasはNoneになります。
しかし、新たにアトラスを設定した際に前のSprite名が出てくる事から、
それまで設定していたSpriteの名前は残っているようです。
これを利用して、UISpriteのAtlasを自動で再設定するエディタ拡張を作ってみました!
ResetUIAtlasOfUISprite.cs
さっそくコードです!
使い方はResetUIAtlasOfUISprite.csをEditorディレクトリに入れて、
Tools/NGUI/Reset UIAtlas Of UISpriteを押すだけ。
するとそれまで設定していたSpriteが含まれたAtlasを探し、再設定が行われます。
この時対象となるUISpriteとAtlasは、Hierarchy&Projectから全て取得します。
Resourcesディレクトリ以外にあっても、オブジェクトが無効になっていても取得します。
なのでProjectのResources外にあるUISpriteも再設定されるので注意が必要です。
また、再設定時、対象のAtlasがない時、Sprite名が重複している時に確認用のログを出力しています。
コード説明
ではでは、コードの一部を抜粋して説明します。
FindObjectsOfTypeAll
スプライトやアトラスを取得するのにはFindObjectsOfTypeAllを使用しています。
//全UIAtlasを取得(Hierarchy&Projectから取得。無効にしてても、Resources外からも取得する) UIAtlas[] atlasArray = Resources.FindObjectsOfTypeAll<UIAtlas> (); //全UISpriteを取得(Hierarchy&Projectから取得。無効にしてても、Resources外からも取得する) UISprite[] spriteArray = Resources.FindObjectsOfTypeAll<UISprite> ();
FindObjectsOfTypeAllは以下のようなもので、
通常は触れない内部的なオブジェクトも取得することが出来ます。
Object.FindObjectsOfType と比べて更に無効となっているオブジェクトの取得まで出来てしまいます。
この関数はとても処理が遅いので毎フレーム使用するのは推奨されません。
Resources-FindObjectsOfTypeAll - Unity スクリプトリファレンス
重い処理なので、ゲーム中では使用しにくいですが、エディタ拡張では重宝します。
spriteName
UISpriteに設定している(していた)Spriteの名前は、spriteNameで取得できます。
sprite.spriteName
GetSprite
アトラスに任意のスプライトが含まれているかは、
GetSpriteを実行して取得できるかで判定します。
//このアトラスには含まれていない if(atlas.GetSprite(spriteName) == null)
おわりに
再設定を楽にするだけでなくスプライト名の重複チェックや、
Atlasが設定出来ていないSpriteのチェックも同時に出来て地味に便利なやつでした(:3っ)∋〜