Exemplo n.º 1
0
    static void Convert(string origpath, string filename, string destpath)
    {
        FSNEditorUtils.MakeTargetDirectory(destpath);                                           // 타겟 경로 확보
        var assetpath    = destpath + "/" + filename;
        var absolutepath = Application.dataPath + "/../" + assetpath;

        //Debug.LogFormat("asset path : {0}, absolute target path : {1}", assetpath, absolutepath);

        if (AssetDatabase.AssetPathToGUID(assetpath) != null)                           // 복사하려는 위치에 해당 어셋이 이미 존재한다면 기존 것은 삭제
        {
            AssetDatabase.DeleteAsset(assetpath);
        }
        AssetDatabase.CopyAsset(origpath, assetpath);                           // 변경하려는 어셋을 복제하여 타겟 경로에 넣는다.
        AssetDatabase.Refresh();

        var texture    = AssetDatabase.LoadAssetAtPath <Texture2D>(assetpath);
        var converted  = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false);
        var origcolors = texture.GetPixels32();
        var len        = origcolors.Length;

        for (int i = 0; i < len; i++)                                                                           // 픽셀마다 알파곱 계산
        {
            var color = origcolors[i];
            var alpha = (int)color.a;
            color.r       = (byte)(color.r * alpha / 255);
            color.g       = (byte)(color.g * alpha / 255);
            color.b       = (byte)(color.b * alpha / 255);
            origcolors[i] = color;
        }
        converted.SetPixels32(origcolors);

        System.IO.File.WriteAllBytes(absolutepath, converted.EncodeToPNG());            // 실제 파일로 write
        AssetDatabase.ImportAsset(assetpath);
        var importer = AssetImporter.GetAtPath(assetpath) as TextureImporter;           // 텍스쳐 옵션 설정

        importer.textureType         = TextureImporterType.Advanced;
        importer.alphaIsTransparency = false;                       // premultiplied alpha texture는 이 옵션을 꺼줘야 한다.
        importer.SaveAndReimport();
    }
    protected override void OnSuccess(int width, int height, Output[] output)
    {
        var outtex = new Texture2D(width, height, TextureFormat.ARGB32, false);

        var pixels  = outtex.GetPixels32();                                                     // 텍스쳐를 0으로 채우기
        var pixcnt  = pixels.Length;
        var zeroCol = new Color32(0, 0, 0, 0);

        for (int i = 0; i < pixcnt; i++)
        {
            pixels[i] = zeroCol;
        }
        outtex.SetPixels32(pixels);

        int count = output.Length;

        for (int i = 0; i < count; i++)                                                         // 텍스쳐를 조립한다.
        {
            var entry   = output[i];
            var texture = entry.data.texture;
            outtex.SetPixels32(entry.xMin, entry.yMin, texture.width, texture.height, texture.GetPixels32());
        }

        //var textureOutAssetPath	= "Resources/" + outputPath + ".png";							// 실제 출력할 텍스쳐 경로 (asset)
        var    textureOutAssetPath = outputPath + ".png";
        var    textureOutRealPath = Application.dataPath + "/" + textureOutAssetPath;                                   // 실제 출력할 텍스쳐 경로 (절대경로)
        string outPath, outName;

        FSNUtils.StripPathAndName(textureOutAssetPath, out outPath, out outName);
        FSNEditorUtils.MakeTargetDirectory("Assets/" + outPath);                                        // 타겟 디렉토리 확보
        System.IO.File.WriteAllBytes(textureOutRealPath, outtex.EncodeToPNG());                         // 텍스쳐를 파일로 기록한다.
        AssetDatabase.Refresh();

        var importer = AssetImporter.GetAtPath("Assets/" + textureOutAssetPath) as TextureImporter;
        var settings = new TextureImporterSettings();

        importer.ReadTextureSettings(settings);
        settings.ApplyTextureType(TextureImporterType.Sprite, false);
        settings.spriteMeshType = SpriteMeshType.FullRect;
        settings.spriteExtrude  = 0;
        settings.rgbm           = TextureImporterRGBMMode.Off;
        importer.SetTextureSettings(settings);

        importer.textureType      = TextureImporterType.Advanced;                                          // 출력한 텍스쳐의 임포트 옵션 설정
        importer.anisoLevel       = 0;
        importer.filterMode       = FilterMode.Bilinear;
        importer.mipmapEnabled    = false;
        importer.npotScale        = TextureImporterNPOTScale.None;
        importer.isReadable       = true;
        importer.spriteImportMode = SpriteImportMode.Single;                    // 어떤 경우, Single로 바꾼 다음 다시 Multi로 바꿔야한다.
        importer.textureFormat    = TextureImporterFormat.AutomaticTruecolor;
        importer.linearTexture    = true;

        var spritesheet = new List <SpriteMetaData>();                                                          // 스프라이트 시트 생성 (각 스프라이트 영역 구분)

        for (int i = 0; i < count; i++)
        {
            var entry = output[i];
            spritesheet.Add(new SpriteMetaData()
            {
                pivot     = new Vector2(0.5f, 0.5f),
                alignment = 0,
                name      = entry.data.spriteName,
                rect      = new Rect(entry.xMin, entry.yMin, entry.data.width, entry.data.height)
            });
        }
        importer.spriteImportMode = SpriteImportMode.Multiple;
        importer.spritesheet      = spritesheet.ToArray();

        importer.SaveAndReimport();
    }