版本:Unity 6 (6000.0)
语言:English
删除辅助纹理
排序组

精灵编辑器数据提供程序 API

通过使用精灵2D 图形对象。如果您习惯于使用 3D,则精灵本质上只是标准纹理,但有一些特殊的技巧可以组合和管理精灵纹理,以便在开发过程中提高效率和便利性。更多信息
参见词汇表
编辑器数据提供程序 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();
}

其他资源

删除辅助纹理
排序组