Как нарезать спрайт по сценарию? (Не использовать редактор) - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь нарезать 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 ]

2 голосов
/ 18 апреля 2019

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 Editor в Unity), существует перегрузка 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 голосов
/ 18 апреля 2019

Я решил с помощью 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));
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...