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

问题描述 投票:0回答:2

我试图通过脚本切片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)使用图像片

我想要的是脚本所有的程序

c# unity3d
2个回答
2
投票

TextureImporter属于UnityEditor命名空间,该命名空间在构建的应用程序中不存在,但仅在Unity编辑器本身内。 &右箭头;你不能用这个!


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

裁剪

如果它实际上只是关于剪切纹理的某个部分以将其用作精灵,那么您只需要在rect参数中定义要从该图像中使用的纹理部分。

// 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

Sprite在原始纹理上的位置,以像素为单位指定。


切片

如果你还想要一个切片边界(你通常在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值这些值也是以像素为单位。


0
投票

我解决了使用react和Sprite Renderer这里是我的代码

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));
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.