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(); }