ScriptaleObject의 아이디어로 Sprite Atlas 사용
평소 TexturePacker 등으로 봉인된 Sprite Atlas를 읽을 때는 어떻게 합니까?
Resources.LoadAll 또는 AssetBundleLoadAllAssiets 읽었어요.
스피릿[]에서 찾아봤어요?
그래서 이번에 생각나는 건 스피릿을 전부 Scriptalble Object로 바꾸는 거예요.
사용할 때는 ScriptalbleObject를 읽는 방법입니다.
사용 자산
이번에는 Serialize가 가능한 Dictionary Serialize Dictionary를 이용해서
https://github.com/neuecc/SerializableDictionary
이쪽 물감을 사용하세요.
https://pipoya.net/sozai/terms-of-use-of-free-materials/
Scriptable Object 작성
using System;
using System.Linq;
using SerializableCollections;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
[Serializable]
public class StringSpriteDictionary : SerializableDictionary<string, Sprite>
{
}
[CustomPropertyDrawer(typeof(StringSpriteDictionary))]
public class ExtendedSerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer
{
}
public class SpriteAtlasAsset : ScriptableObject
{
#if UNITY_EDITOR
[MenuItem("Tools/CreateSpriteAtlasAsset")]
static void CreateSpriteAtlasAssetInstance()
{
var spriteAtlas = CreateInstance<SpriteAtlasAsset>();
spriteAtlas.atlasCache = new StringSpriteDictionary();
foreach (var obj in Selection.objects)
{
var assetPath = AssetDatabase.GetAssetPath(obj);![SpriteAtlasInspector.PNG](https://qiita-image-store.s3.amazonaws.com/0/16088/daacc87f-3ef1-fb1c-7495-804062243688.png)
var sprites = AssetDatabase.LoadAllAssetsAtPath(assetPath).OfType<Sprite>().ToArray();
foreach (var sprite in sprites)
{
spriteAtlas.atlasCache.Add(sprite.name, sprite);
}
}
AssetDatabase.CreateAsset(spriteAtlas, "Assets/SpriteAtlas.asset");
AssetDatabase.Refresh();
}
#endif
[SerializeField] StringSpriteDictionary atlasCache = new StringSpriteDictionary();
public Sprite GetSprite(string spriteName)
{
return atlasCache[spriteName];
}
}
이 코드를 만드는 멀티플렉스의 Texture를 선택하고 Tools의Create Sprite Atlas Asset을 누르면
Assets 바로 아래에 ScriptalbleObject를 작성합니다.
제작된 스프릿 아틀라스의 Scriptale Object의 Inspector를 보면 선택된 Texture에 포함된 스프릿이 읽힌다.
사용 시
using UnityEngine;
using UnityEngine.UI;
public class ScriptableTest : MonoBehaviour
{
[SerializeField] SpriteAtlasAsset spriteAtlas;
[SerializeField] Image image;
void Start()
{
image.sprite = spriteAtlas.GetSprite("majo_1");
}
}
제작은 위 모노베하비오의 반을 계승해 인스펙터에서 방금 제작한 Scriptalble Object에 붙여 넣었다.
시행 후 확인한 결과 다음과 같다.
결실
Scriptable Object를 만드는 시간이 늘었지만, Inspector를 통해 Scriptable Object를 직접 설정할 수 있습니다.
처음부터 Dictionary로 유지할 수 있어 편리하지 않나요?
Reference
이 문제에 관하여(ScriptaleObject의 아이디어로 Sprite Atlas 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/myun/items/d1ea467ce00f9ad5df66
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using System;
using System.Linq;
using SerializableCollections;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
[Serializable]
public class StringSpriteDictionary : SerializableDictionary<string, Sprite>
{
}
[CustomPropertyDrawer(typeof(StringSpriteDictionary))]
public class ExtendedSerializableDictionaryPropertyDrawer : SerializableDictionaryPropertyDrawer
{
}
public class SpriteAtlasAsset : ScriptableObject
{
#if UNITY_EDITOR
[MenuItem("Tools/CreateSpriteAtlasAsset")]
static void CreateSpriteAtlasAssetInstance()
{
var spriteAtlas = CreateInstance<SpriteAtlasAsset>();
spriteAtlas.atlasCache = new StringSpriteDictionary();
foreach (var obj in Selection.objects)
{
var assetPath = AssetDatabase.GetAssetPath(obj);![SpriteAtlasInspector.PNG](https://qiita-image-store.s3.amazonaws.com/0/16088/daacc87f-3ef1-fb1c-7495-804062243688.png)
var sprites = AssetDatabase.LoadAllAssetsAtPath(assetPath).OfType<Sprite>().ToArray();
foreach (var sprite in sprites)
{
spriteAtlas.atlasCache.Add(sprite.name, sprite);
}
}
AssetDatabase.CreateAsset(spriteAtlas, "Assets/SpriteAtlas.asset");
AssetDatabase.Refresh();
}
#endif
[SerializeField] StringSpriteDictionary atlasCache = new StringSpriteDictionary();
public Sprite GetSprite(string spriteName)
{
return atlasCache[spriteName];
}
}
이 코드를 만드는 멀티플렉스의 Texture를 선택하고 Tools의Create Sprite Atlas Asset을 누르면Assets 바로 아래에 ScriptalbleObject를 작성합니다.
제작된 스프릿 아틀라스의 Scriptale Object의 Inspector를 보면 선택된 Texture에 포함된 스프릿이 읽힌다.
사용 시
using UnityEngine;
using UnityEngine.UI;
public class ScriptableTest : MonoBehaviour
{
[SerializeField] SpriteAtlasAsset spriteAtlas;
[SerializeField] Image image;
void Start()
{
image.sprite = spriteAtlas.GetSprite("majo_1");
}
}
제작은 위 모노베하비오의 반을 계승해 인스펙터에서 방금 제작한 Scriptalble Object에 붙여 넣었다.시행 후 확인한 결과 다음과 같다.
결실
Scriptable Object를 만드는 시간이 늘었지만, Inspector를 통해 Scriptable Object를 직접 설정할 수 있습니다.
처음부터 Dictionary로 유지할 수 있어 편리하지 않나요?
Reference
이 문제에 관하여(ScriptaleObject의 아이디어로 Sprite Atlas 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/myun/items/d1ea467ce00f9ad5df66텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)