如何通过脚本切片精灵?(不使用编辑器)

时间:2019-04-18 04:01:09

标签: c# unity3d

我试图通过脚本切片Sprite(类型转换为Texture2D)

项目在Android或IOS平台上运行时

可以通过脚本吗?

我尝试使用UnityEditor类,并且可以在计算机上使用

但是当我尝试构建Android或IOS时失败。

    void OnPreprocessTexture()
    {
        TextureImporter textureImporter = (TextureImporter)assetImporter;
        textureImporter.textureType = TextureImporterType.Sprite;
        textureImporter.spriteImportMode = SpriteImportMode.Multiple;
        textureImporter.mipmapEnabled = false;
        textureImporter.filterMode = FilterMode.Point;

    }

    public void OnPostprocessTexture(Texture2D texture)
    {
        Debug.Log("Texture2D: (" + texture.width + "x" + texture.height + ")");



        int spriteSize = 350;
        int colCount = texture.width / spriteSize;
        int rowCount = texture.height / spriteSize;

        List<SpriteMetaData> metas = new List<SpriteMetaData>();

        for (int r = 0; r < rowCount; ++r)
        {
            for (int c = 0; c < colCount; ++c)
            {
                SpriteMetaData meta = new SpriteMetaData();
                meta.rect = new Rect(c * spriteSize, r * spriteSize, spriteSize, spriteSize);
                meta.name = c + "-" + r;
                metas.Add(meta);
            }
        }

        TextureImporter textureImporter = (TextureImporter)assetImporter;
        textureImporter.spritesheet = metas.ToArray();
    }

    public void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
    {
        Debug.Log("Sprites: " + sprites.Length);
    }

在Android或IOS上运行项目时不起作用

[我想要什么]

程序

在Android或IOS平台上运行期间

1)从服务器(URL或文件)接收一些图像

2)在C#脚本上加载图片

3)将图像类型更改为“纹理”或“精灵” ...

4)切片图像(不要使用编辑器)

5)保存图像

6)使用一张图片

我想要的是脚本执行的所有过程

2 个答案:

答案 0 :(得分:2)

TextureImporter属于UnityEditor命名空间,该命名空间在构建的应用程序中不存在,而仅在Unity Editor自身内部存在。 →您不能使用它!


您可以使用Sprite.Create从给定的Texture2D生成一个精灵。

裁剪

如果实际上仅是要切除一部分纹理以将其用作精灵,则只需要在rect参数中定义要从该图像中使用的那部分纹理即可。< / p>

// Wherever you get the texture from
Texture texture = ...;

// E.g. for using the center of the image
// but half of the size
var rect = new Rect(texture.width / 4, texture.height / 4, texture.width / 2, texture.height / 2);

// Create the sprite
var sprite = Sprite.Create(texture, text, Vector2.one * 0.5f);

其中rect

  

精灵在原始纹理上的位置,以像素为单位。


切片

如果您还需要切片边界(通常在Unity中的Sprite Editor中定义),则Sprite.Create的重载额外需要一个border参数,例如

var borders = new Vector4(2, 2, 2, 2);
var sprite = Sprite.Create(texture, rect, Vector2.one * 0.5f, 100, SpriteMeshType.FullRect, borders);

其中border

  

返回精灵的边框大小。

     

X =左,Y =下,Z =右,W =上

API没有说出来,但我想像rect值一样,这些值也以像素为单位。

答案 1 :(得分:0)

我使用rect和Sprite Rnederer解决了 这是我的代码

void Start()
{

    rect = new Rect(0f, 0f, 255, 255);
    this.GetComponent<SpriteRenderer>().sprite = Sprite.Create(img, rect, new Vector2(0.5f, 0.5f));
    this.GetComponent<RectTransform>().localScale = new Vector3(100, 100, 0);
    StartCoroutine(Update());
}

/*
 *  rect = new Rect(i, 0, 255, 255);
        this.GetComponent<SpriteRenderer>().sprite = Sprite.Create(img, rect, new Vector2(0.5f, 0.5f));*/

IEnumerator Update()
{
    while (true)
    {
        if (i < 1000)
        {
            i += 255;
            if (i > 770)
            {
                i = 0;
            }
        }
        yield return new WaitForSeconds(0.25f);
        rect = new Rect(i, 0f, 255, 255);
        this.GetComponent<SpriteRenderer>().sprite = Sprite.Create(img, rect, new Vector2(0.5f, 0.5f));
    }
}