Resourcesのアトラスから動的にSpriteインスタンスを取得する方法。


概要

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" );
    }
}

解説

  1. 読み込みクラスのインスタンスを作るよ
    SpriteLoader sl = new SpriteLoader();

  2. 読み込み関数にリソースのパスを渡してね
    sl.Load( "sample_atlas" );

  3. あとは使いたい時にGetSprite!
    m_renderer.sprite = sl.GetSprite( "star" );

とっても簡単ね!