(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

UISpriteのAtlasを自動で再設定する 【Unity】【NGUI】【エディタ拡張】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 5.3.1f1 Personal
NGUI 3.9.7


はじめに

NGUIのアトラスを分割して新たなアトラスを作った場合など、

設定していたアトラスがなくなった場合、UISpriteのAtlasはNoneになります。


f:id:kan_kikuchi:20160323134747j:plain


しかし、新たにアトラスを設定した際に前のSprite名が出てくる事から、

それまで設定していたSpriteの名前は残っているようです。


f:id:kan_kikuchi:20160411233725g:plain


これを利用して、UISpriteのAtlasを自動で再設定するエディタ拡張を作ってみました!


ResetUIAtlasOfUISprite.cs

さっそくコードです!




使い方はResetUIAtlasOfUISprite.csをEditorディレクトリに入れて、

Tools/NGUI/Reset UIAtlas Of UISpriteを押すだけ。


f:id:kan_kikuchi:20160323135215j:plain


するとそれまで設定していた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 と比べて更に無効となっているオブジェクトの取得まで出来てしまいます。
この関数はとても処理が遅いので毎フレーム使用するのは推奨されません。

Unity - スクリプトリファレンス: Resources.FindObjectsOfTypeAll



重い処理なので、ゲーム中では使用しにくいですが、エディタ拡張では重宝します。


spriteName

UISpriteに設定している(していた)Spriteの名前は、spriteNameで取得できます。

sprite.spriteName



GetSprite

アトラスに任意のスプライトが含まれているかは、

GetSpriteを実行して取得できるかで判定します。

//このアトラスには含まれていない
if(atlas.GetSprite(spriteName) == null)



おわりに

再設定を楽にするだけでなくスプライト名の重複チェックや、

Atlasが設定出来ていないSpriteのチェックも同時に出来て地味に便利なやつでした(:3っ)∋〜