ScriptaleObject의 아이디어로 Sprite Atlas 사용

7470 단어 UnityC#
이 기사는 나의 생각을 썼다.
평소 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로 유지할 수 있어 편리하지 않나요?

좋은 웹페이지 즐겨찾기