7/24/2014

Загружаем спрайт из ресурсов Unity 4.3

Эх, давно же я ничего не писал...наверное оттого, что по Unity уже столько всего написано, поэтому копипастить лишено всякого смысла...
В общем, напишу как обычно немного кода о том как загружать в рантайме, Multiple спрайты из ресурсов. Этот вопрос очень часто задают пользователи перешедшие на версию Unity 4.3 посему надеюсь, что хоть кому-то я смогу помочь.

Итак, ситуация: у нас есть атлас, разбитый на спрайты, каждому спрайту присвоено имя. Как загрузить весь атлас мы знаем, а теперь покажу как сделать тоже самое, но получив ссылки на каждый спрайтик атласа. Ладно хватит слов...поехали!
       
/*
    SpriteLoader.cs
    обработку ошибок и прочие шлифовки кода не писал
    дабы не нагромождать итак раздутый код.
    Все пояснения в комментариях кода.
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class SpriteLoader  
{
 // коллекция всех наших спрайтов с ключом = иненем српайта
 private static Dictionary<string, Sprite> sprites_array = new Dictionary<string, Sprite>();

 // получаем спрайт по имени
 public static Sprite GetSprite(string name)
 {
  if(sprites_array.ContainsKey(name))
   return sprites_array[name];
  else
  {
   Debug.LogError("Спрайта с именем " + name + " не найдено");
   return null;
  }
 }

 // не забывать чистить словарь! 
 public static void ClearSpritesArray()
 {
  Debug.Log ("Чистим Словарь...");
  sprites_array.Clear();
  Resources.UnloadUnusedAssets();
 }

 // загрузить все спрайты из папки
 // path - путь к папке со спрайтами, находящейся в ресурсах(Assets/Resources/)
 public static void LoadAllSprites(string path) 
 {
  Sprite[] temp_spr = Resources.LoadAll(path);
 
  for(int i=0; i< temp_spr.Length; i++) 
   sprites_array.Add(temp_spr[i].name, temp_spr[i]);
 }

 // вернуть имена всех найденных спрайтов
 public static string[] GetAllNames()
 {
  string[] str = new string[sprites_array.Count];
  int i = 0;
  foreach(KeyValuePair<string,Sprite> spr in sprites_array)
  {
   str[i] = spr.Value.name;
   i++;
  }
  if(i == 0)
   Debug.Log("Коллекция пуста!");
  
  return str;
 }
}
Так, а теперь для наглядности небольшой скрипт-тестик
       
/* 
    TestSpriteLoader.cs
*/
using UnityEngine;
using System.Collections;

public class TestSpriteLoader : MonoBehaviour 
{
 // Небольшой тестик, загрузим все спрайты из папки Resouces/Texteres/
 // Выводим в консоль их имена,  ищем спрайт с именем 11111
 private void Start () 
 {
  SpriteLoader.LoadAllSprites("Textures");
  string[] str = SpriteLoader.GetAllNames();
  foreach(string s in str)
   Debug.Log(s);
  Sprite spr = SpriteLoader.GetSprite("11111");
 }
 private void OnApplicationQuit()
 {
  SpriteLoader.ClearSpritesArray();
 }
}
Все! Планирую в дальнейшем в записках разобрать создание какой-нибудь простой 2D игры, если у кого-то будут предложения по жанру или желание помочь с заготовками арта к запискам буду очень признателен!

Комментариев нет:

Отправить комментарий