1
\$\begingroup\$

I want to create a palette based on a number of PNGs in Unity 2D. I am struggling to understand the slicing logic. Let's say I have a sprite 588x547, and I set PPU to 128. So obviously the sprite cannot be divided into 128-parts: enter image description here So the right and the bottom part are not going to appear on my palette. Now I would like the grid to start in the center. The tiles on the sides are not "full" tiles, but I still want them on my palette in the end, so I kind of want Unity to fill up the border tiles for me with void till they reach the 128x128 size: enter image description here Is there a way to achieve this? Or am I conceptually misunderstanding something? Given a bunch of PNGs, all of them different pixel sizes, none dividable by 128, how do you create a palette from them to paint on a 128 PPU grid? I had a look at external tools like TexturePacker and Showbox, but did't manage to achieve a nice 128-dividable grid from my sprites.

\$\endgroup\$
  • \$\begingroup\$ It seems to me that you could do this by dragging out your desired sprite rectangles manually, and editing the numeric fields to snap them to your exact 128 stride target. Have you had any trouble making that work? \$\endgroup\$ – DMGregory Aug 26 at 21:50
  • \$\begingroup\$ What do you mean by "dragging out"? In the Unity slicing editor? Or in an external app? My last resort would be loading it all into Inkscape and puting sprites into right places on a 128 grid, then loading the sheet into Unity and slicing it. But I was hoping there might be an automatic way.. \$\endgroup\$ – Maxim Zabolotskikh Aug 27 at 6:47
  • \$\begingroup\$ Yes, Unity lets you draw whatever bounding rectangles you want for your sprites inside its own editor. \$\endgroup\$ – DMGregory Aug 27 at 11:27
0
\$\begingroup\$

Well, I could not figure it out with Unity, so I ended up resizing all my sprites to 128-divisible sizes by adding transparent borders, so that to be able to cut them with Unity nicely. For this I used ImageMagic and the following command:

convert {file} -background transparent -gravity center -extent {targetW}x{targetH} {outputPath}

In order to go through all the files in the directory and calculate the next best 128-divisible size I wrote a small app in C#:

class Program
{
    static void Main(string[] args)
    {
        var sourcePath = @"d:\png";
        var targetPath = @"d:\png\output";

        var files = Directory.GetFiles(sourcePath);
        foreach (var file in files)
        {
            var img = Image.FromFile(file);
            var w = img.Width;
            var h = img.Height;
            var targetW = FindNextSize(w);
            var targetH = FindNextSize(h);

            Process.Start(
                @"...path to ImageMagic...\convert.exe",
                $@"{file} -background transparent -gravity center -extent {targetW}x{targetH} {Path.Combine(targetPath, Path.GetFileName(file))}");
            Thread.Sleep(200);
        }
    }

    private static int step = 128;

    private static int FindNextSize(int actualSize)
    {
        var result = step;
        while (result <= actualSize)
        {
            result += step;
        }

        return result;
    }
}

Not too pretty all of it, but it did what I wanted.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.