Version: 2022.3
언어: 한국어
스프라이트 에디터: 보조 텍스처
정렬 그룹

스프라이트 에디터 데이터 공급자 API

스프라이트 에디터 데이터 공급자 API를 사용하면 사용자가 커스텀 임포터 또는 에디터 툴에서 스프라이트 데이터를 추가, 변경, 제거할 수 있습니다.API를 적용하는 방법을 알아보려면 아래의 코드 예시를 참조하십시오.

중요:다음 예시 중 일부에는 Unity 2021.2 이상을 사용하는 경우 필요한 추가 코드 섹션이 포함되어 있습니다.Unity 2021.1 이하를 사용하는 경우 코드가 올바르게 컴파일되도록 표시된 섹션을 제거해야 합니다.

ISpriteEditorDataProvider 인스턴스를 얻는 방법

다음 예시에서는 API를 사용하여 각 인스턴스를 얻는 방법을 보여줍니다.

임포터

using UnityEditor;
using UnityEditor.U2D.Sprites;
using UnityEngine;

public class MyAssetPostProcessor :AssetPostprocessor
{
    private void OnPreprocessTexture()
    {
        var factory = new SpriteDataProviderFactories();
        factory.Init();
        var dataProvider = factory.GetSpriteEditorDataProviderFromObject(assetImporter);
        dataProvider.InitSpriteEditorDataProvider();

        /* Use the data provider */

        // Apply the changes made to the data provider
        dataProvider.Apply();
    }
}

텍스처

using UnityEditor;
using UnityEditor.U2D.Sprites;
using UnityEngine;

public static class MyCustomTool
{
    [MenuItem("Custom/Update Sprite Settings")]
    static void UpdateSettings()
    {
        foreach (var obj in Selection.objects)
        {
            if (obj is Texture2D)
            {
                var factory = new SpriteDataProviderFactories();
                factory.Init();
                var dataProvider = factory.GetSpriteEditorDataProviderFromObject(obj);
                dataProvider.InitSpriteEditorDataProvider();

                /* Use the data provider */

                // Apply the changes made to the data provider
                dataProvider.Apply();

                // Reimport the asset to have the changes applied
                var assetImporter = dataProvider.targetObject as AssetImporter;
                assetImporter.SaveAndReimport();
            }
        }
    }
}

스프라이트 추가 방법

static void AddSprite(ISpriteEditorDataProvider dataProvider)
{
    // Define the new Sprite Rect
    var newSprite = new SpriteRect()
    {
        name = "MyNewSprite",
        spriteID = GUID.Generate(),
        rect = new Rect(0, 0, 32, 32)
    };
    // Add the Sprite Rect to the list of existing Sprite Rects
    var spriteRects = dataProvider.GetSpriteRects().ToList();
    spriteRects.Add(newSprite);

    // Write the updated data back to the data provider
    dataProvider.SetSpriteRects(spriteRects.ToArray());

    // Note:This section is only for Unity 2021.2 and newer
    // Register the new Sprite Rect's name and GUID with the ISpriteNameFileIdDataProvider
    var spriteNameFileIdDataProvider = dataProvider.GetDataProvider<ISpriteNameFileIdDataProvider>();
    var nameFileIdPairs = spriteNameFileIdDataProvider.GetNameFileIdPairs().ToList();
    nameFileIdPairs.Add(new SpriteNameFileIdPair(newSprite.name, newSprite.spriteID));
    spriteNameFileIdDataProvider.SetNameFileIdPairs(nameFileIdPairs);
    // End of Unity 2021.2 and newer section

    // Apply the changes
    dataProvider.Apply();
}

스프라이트 데이터 변경 방법

static void SetPivot(ISpriteEditorDataProvider dataProvider)
{
    // Get all the existing Sprites
    var spriteRects = dataProvider.GetSpriteRects();

    // Loop over all Sprites and update the pivots
    foreach (var rect in spriteRects)
    {
        rect.pivot = new Vector2(0.1f, 0.2f);
        rect.alignment = SpriteAlignment.Custom;
    }

    // Write the updated data back to the data provider
    dataProvider.SetSpriteRects(spriteRects);

    // Apply the changes
    dataProvider.Apply();
}

스프라이트 제거 방법

static void RemoveSprite(ISpriteEditorDataProvider dataProvider, string spriteName)
{
    // Get all the existing Sprites and look for the Sprite with the selected name
    var spriteRects = dataProvider.GetSpriteRects().ToList();
    var index = spriteRects.FindIndex(x => x.name == spriteName);

    // Remove the entry of the Sprite if found
    if (index >= 0)
        spriteRects.RemoveAt(index);

    // Write the updated data back to the data provider
    dataProvider.SetSpriteRects(spriteRects.ToArray());

    // Note:This section is only for Unity 2021.2 and newer
    // Get all the existing SpriteName & FileId pairs and look for the Sprite with the selected name
    var spriteNameFileIdDataProvider = dataProvider.GetDataProvider<ISpriteNameFileIdDataProvider>();
    var nameFileIdPairs = spriteNameFileIdDataProvider.GetNameFileIdPairs().ToList();
    index = nameFileIdPairs.FindIndex(x => x.name == spriteName);

    // Remove the entry of the Sprite if found
    if (index >= 0)
        nameFileIdPairs.RemoveAt(index);

    spriteNameFileIdDataProvider.SetNameFileIdPairs(nameFileIdPairs);
    // End of Unity 2021.2 and newer section

    // Apply the changes
    dataProvider.Apply();
}

아웃라인 데이터 업데이트 방법

static void SetOutline(ISpriteEditorDataProvider dataProvider)
{
    // Get the ISpriteOutlineDataProvider
    var outlineDataProvider = dataProvider.GetDataProvider<ISpriteOutlineDataProvider>();

    // Loop over all Sprites and set their outline to a quad
    var spriteRects = dataProvider.GetSpriteRects();
    foreach (var spriteRect in spriteRects)
    {
        var halfWidth = spriteRect.rect.width / 2f;
        var halfHeight = spriteRect.rect.height / 2f;

        var quadOutline = new Vector2[4]
        {
            new Vector2(-halfWidth, -halfHeight),
            new Vector2(-halfWidth, halfHeight),
            new Vector2(halfWidth, halfHeight),
            new Vector2(halfWidth, -halfHeight)
        };

        var outlines = new List<Vector2[]>();
        outlines.Add(quadOutline);

        var spriteGuid = spriteRect.spriteID;
        outlineDataProvider.SetOutlines(spriteGuid, outlines);
    }

    // Apply the changes
    dataProvider.Apply();
}

추가 리소스

스프라이트 에디터: 보조 텍스처
정렬 그룹