Как разделить изображение в единстве

введите здесь описание изображения

Я хочу анимировать это изображение с помощью c #. Редактор спрайтов у меня не работает, потому что я хочу, чтобы это была динамическая система. Если есть метод для этого, я был бы признателен, если бы вы поделиться им со мной.


person Mert Karca    schedule 21.05.2021    source источник
comment
Я думаю, что вы идете трудным путем, но если вы действительно хотите это сделать, вы можете вычислить область, которую хотите использовать, создать новую текстуру с помощью new Texture2D(width, height) и назначить ее Sprite.   -  person MarkSouls    schedule 21.05.2021
comment
Таких изображений несколько, я подумал, что не имеет смысла создавать спрайт для каждого. Я хочу сделать эту картинку динамической, разделив ее кодом.   -  person Mert Karca    schedule 21.05.2021
comment
См. комментарий @MarkSouls. Да, если вы заранее знаете размер пикселей Rect, вы можете вырезать текстуры или спрайты из вашей текстуры. Но если вы ищете что-то динамичное, что работает для любого заданного масштаба изображения... Нет, это будет довольно сложно ^^ так что... все входные изображения имеют одинаковые размеры, и вы всегда хотите разделить их на части одинакового размера? ? А как насчет пустого места справа?   -  person derHugo    schedule 21.05.2021
comment
Зазоры и размеры всех изображений одинаковы. Я хочу разделить изображения одинакового размера.   -  person Mert Karca    schedule 21.05.2021
comment
@MertKarca они вам нужны как Sprite или как Texture2D? Преимущество Sprite состоит в том, что вы можете сохранить исходный актив Texture2D и не создавать несколько экземпляров Texture2D -> требуется больше памяти.   -  person derHugo    schedule 21.05.2021
comment
Если вы создаете игру, а не инструмент, вам нужно серьезно подумать над тем, что сказал @MarkSouls выше. Однако, если вы делаете инструмент... Ну, во-первых, удачи в умилостивлении богов ассетстора. Теперь, на ваше усмотрение, вам нужно убедиться, что пользователь вставляет изображение нужного размера (это может быть огромной проблемой, потому что пользователи редко читают рекомендации). Затем вы можете подумать о том, как обрезать каждый спрайт до другого. Удачи.   -  person Rhach    schedule 21.05.2021
comment
да, я разрабатываю игру. Думаете, проще всего использовать редактор спрайтов? Потому что есть сотни изображений.   -  person Mert Karca    schedule 21.05.2021


Ответы (1)


Если, как вы говорите, все исходные и целевые изображения плитки имеют известные размеры, вы можете сделать, например.

Если они вам нужны как Texture2Ds (более дорогие и интенсивные по памяти)

public Texture2D[] SplitTextureToTextures(Texture2D source, Vector2Int tileSize)
{
    // get the source dimensions
    var sourceWidth = source.width;
    var sourceHeight = source.height;

    // Check how often the given tileSize fits into the image
    var tileAmountX = Mathf.FloorToInt(sourceWidth / (float)tileSize.x);
    var tileAmountY = Mathf.FloorToInt(sourceHeight / (float)tileSize.y);

    var output = new Texture2D[tileAmountX * tileAmountY];

    // Iterate through the tiles horizontal then vertical
    // starting at the top left tile
    for (var y = tileAmountY - 1; y >= 0; y--)
    {
        for (var x = 0; x < tileAmountX; x++)
        {
            // get the bottom left pixel coordinate of the current tile
            var bottomLeftPixelX = x * tileSize.x;
            var bottomLeftPixelY = y * tileSize.y;

            // get the pixels in the rect for this tile
            var pixels = source.GetPixels(bottomLeftPixelX, bottomLeftPixelY, tileSize.x, tileSize.y);

            // create the new texture (adjust the additional parameters according to your needs)
            var texture = new Texture2D(tileSize.x, tileSize.y, source.format, false);
                
            // write the pixels into the new texture
            texture.SetPixels(pixels);
            texture.Apply();

            // and store it in the output
            output[x + y * tileAmountX] = texture;
        }
    }

    return output;
} 

или если они вам нужны как Sprites

public Sprite[] SplitTextureToSprites(Texture2D source, Vector2Int tileSize)
{
    // get the source dimensions
    var sourceWidth = source.width;
    var sourceHeight = source.height;

    // Check how often the given tileSize fits into the image
    var tileAmountX = Mathf.FloorToInt(sourceWidth / (float)tileSize.x);
    var tileAmountY = Mathf.FloorToInt(sourceHeight / (float)tileSize.y);

    var output = new Texture2D[tileAmountX * tileAmountY];

    // Iterate through the tiles horizontal then vertical
    // starting at the top left tile
    for (var y = tileAmountY - 1; y >= 0; y--)
    {
        for (var x = 0; x < tileAmountX; x++)
        {
           // get the bottom left pixel coordinate of the current tile
            var bottomLeftPixelX = x * tileSize.x;
            var bottomLeftPixelY = y * tileSize.y;

            // instead of having to get the pixel data
            // For a sprite you just have to set the rect from which part of the texture to create a sprite
            var sprite = Sprite.Create(source, new Rect(bottomLeftPixelX, bottomLeftPixelY, tileSize.x, tileSize.y), Vector2.one * 0.5f);

            output[x + y * tileAmountX] = sprite;
        }
    }

    return output;
} 
person derHugo    schedule 21.05.2021