通过使用精灵2D 图形对象。如果您习惯于使用 3D,则精灵本质上只是标准纹理,但有一些特殊的技巧可以组合和管理精灵纹理,以便在开发过程中提高效率和便利性。更多信息
参见词汇表编辑器数据提供程序 API,用户可以在自定义导入器或编辑器工具中添加、更改和删除精灵数据。请参考以下代码示例以了解如何应用 API。
重要:以下某些示例包含代码的附加部分,如果您使用的是 Unity 2021.2 或更高版本,则需要该部分。如果您使用的是 Unity 2021.1 或更早版本,则应删除指示的部分以确保代码正确编译。
以下示例演示了如何使用 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();
}