概要
Resourcesから画像を読み込む際に、テクスチャに設定したSpriteを取得したいね、というお話を綴ります。
(そもそも標準でTexture2Dのプロパティかなんかで取得できるようにしておいて欲しい…。)
※検証環境は Unity 5.0.x 及び Unity 5.2.x です。
事例
こういう時。
シーンやプレハブ等どこにも参照を持っていないSpriteを動的に読み込んで取得したい場合!
サンプル
実行コード
SpriteLoader.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SpriteLoader
{
Dictionary<string, Sprite> m_dic = new Dictionary<string, Sprite>();
/**
* 読み込み関数
* @param path テクスチャのパス
* @retval 読み込んだSpriteの数(エラーの場合-1)
*/
public int Load( string path )
{
// 読み込み(Resources.LoadAllを使うのがミソ)
Object[] list = Resources.LoadAll( path, typeof(Sprite) );
// listがnullまたは空ならエラーで返す
if( list == null || list.Length == 0 ) return -1;
int i, len = list.Length;
// listを回してDictionaryに格納
for( i = 0; i < len; ++i )
{
Debug.Log( "Add : " + list[i] );
m_dic.Add( list[i].name, list[i] as Sprite );
}
return len;
}
/**
* Sprite取得関数
* @param name 取得するスプライト名
* @retval 該当のSpriteインスタンス(なければnull)
*/
public Sprite GetSprite( string name )
{
if( !m_dic.ContainsKey( name ) )
return null;
return m_dic[name];
}
public void Dispose()
{
m_dic.Clear();
m_dic = null;
}
}
解説
あまり難しく考えずに、 Resources.LoadAll
に テクスチャのパス
と typeof(Sprite)
を与えるのがミソ!
戻り値として、読み込まれたSpriteのインスタンスがObject配列で返ってくるよ。
あとは as Sprite
で煮るなり焼くなりお好みで!
呼び出しコード例
main.cs
using UnityEngine;
using System.Collections;
public class main : MonoBehaviour
{
[SerializeField]
SpriteRenderer m_renderer = null;
void Start()
{
// 読み込みクラスのインスタンス作成
SpriteLoader sl = new SpriteLoader();
// 読み込み
sl.Load( "sample_atlas" );
// SpriteRendererに割り当て
if( m_renderer != null )
m_renderer.sprite = sl.GetSprite( "star" );
}
}
解説
-
読み込みクラスのインスタンスを作るよ
SpriteLoader sl = new SpriteLoader();
-
読み込み関数にリソースのパスを渡してね
sl.Load( "sample_atlas" );
-
あとは使いたい時にGetSprite!
m_renderer.sprite = sl.GetSprite( "star" );
とっても簡単ね!