|
| 1 | +#if UNITY_IOS |
| 2 | + |
| 3 | +using System.IO; |
| 4 | +using UnityEditor.Build; |
| 5 | +using UnityEditor.Build.Reporting; |
| 6 | +using UnityEngine; |
| 7 | + |
| 8 | +namespace App.Editor.iOS |
| 9 | +{ |
| 10 | + public class IconSetter : IPostprocessBuildWithReport |
| 11 | + { |
| 12 | + private const string SourceDirectory = "Assets/AppIcons/iOS"; |
| 13 | + |
| 14 | + public int callbackOrder => 46; |
| 15 | + |
| 16 | + public void OnPostprocessBuild(BuildReport report) |
| 17 | + { |
| 18 | + if (report.summary.platform != UnityEditor.BuildTarget.iOS) |
| 19 | + return; |
| 20 | + |
| 21 | + var appiconsetPath = Path.Combine( |
| 22 | + report.summary.outputPath, |
| 23 | + "Unity-iPhone", |
| 24 | + "Images.xcassets", |
| 25 | + "AppIcon.appiconset" |
| 26 | + ); |
| 27 | + |
| 28 | + if (!Directory.Exists(appiconsetPath)) |
| 29 | + { |
| 30 | + Debug.LogWarning($"IconSetter: {appiconsetPath} not found"); |
| 31 | + return; |
| 32 | + } |
| 33 | + |
| 34 | + var sourceDir = Path.Combine(Directory.GetCurrentDirectory(), SourceDirectory); |
| 35 | + if (!Directory.Exists(sourceDir)) |
| 36 | + { |
| 37 | + Debug.LogWarning($"IconSetter: {sourceDir} not found, run generate-icons.sh first"); |
| 38 | + return; |
| 39 | + } |
| 40 | + |
| 41 | + foreach (var src in Directory.GetFiles(sourceDir, "icon_*.png")) |
| 42 | + { |
| 43 | + var dest = Path.Combine(appiconsetPath, Path.GetFileName(src)); |
| 44 | + File.Copy(src, dest, true); |
| 45 | + } |
| 46 | + |
| 47 | + var contentsJson = @"{ |
| 48 | + ""images"" : [ |
| 49 | + { ""filename"" : ""icon_120.png"", ""idiom"" : ""iphone"", ""scale"" : ""2x"", ""size"" : ""60x60"" }, |
| 50 | + { ""filename"" : ""icon_180.png"", ""idiom"" : ""iphone"", ""scale"" : ""3x"", ""size"" : ""60x60"" }, |
| 51 | + { ""filename"" : ""icon_80.png"", ""idiom"" : ""iphone"", ""scale"" : ""2x"", ""size"" : ""40x40"" }, |
| 52 | + { ""filename"" : ""icon_120.png"", ""idiom"" : ""iphone"", ""scale"" : ""3x"", ""size"" : ""40x40"" }, |
| 53 | + { ""filename"" : ""icon_58.png"", ""idiom"" : ""iphone"", ""scale"" : ""2x"", ""size"" : ""29x29"" }, |
| 54 | + { ""filename"" : ""icon_87.png"", ""idiom"" : ""iphone"", ""scale"" : ""3x"", ""size"" : ""29x29"" }, |
| 55 | + { ""filename"" : ""icon_40.png"", ""idiom"" : ""iphone"", ""scale"" : ""2x"", ""size"" : ""20x20"" }, |
| 56 | + { ""filename"" : ""icon_60.png"", ""idiom"" : ""iphone"", ""scale"" : ""3x"", ""size"" : ""20x20"" }, |
| 57 | + { ""filename"" : ""icon_76.png"", ""idiom"" : ""ipad"", ""scale"" : ""1x"", ""size"" : ""76x76"" }, |
| 58 | + { ""filename"" : ""icon_152.png"", ""idiom"" : ""ipad"", ""scale"" : ""2x"", ""size"" : ""76x76"" }, |
| 59 | + { ""filename"" : ""icon_167.png"", ""idiom"" : ""ipad"", ""scale"" : ""2x"", ""size"" : ""83.5x83.5"" }, |
| 60 | + { ""filename"" : ""icon_40.png"", ""idiom"" : ""ipad"", ""scale"" : ""1x"", ""size"" : ""40x40"" }, |
| 61 | + { ""filename"" : ""icon_80.png"", ""idiom"" : ""ipad"", ""scale"" : ""2x"", ""size"" : ""40x40"" }, |
| 62 | + { ""filename"" : ""icon_29.png"", ""idiom"" : ""ipad"", ""scale"" : ""1x"", ""size"" : ""29x29"" }, |
| 63 | + { ""filename"" : ""icon_58.png"", ""idiom"" : ""ipad"", ""scale"" : ""2x"", ""size"" : ""29x29"" }, |
| 64 | + { ""filename"" : ""icon_20.png"", ""idiom"" : ""ipad"", ""scale"" : ""1x"", ""size"" : ""20x20"" }, |
| 65 | + { ""filename"" : ""icon_40.png"", ""idiom"" : ""ipad"", ""scale"" : ""2x"", ""size"" : ""20x20"" }, |
| 66 | + { ""filename"" : ""icon_1024.png"",""idiom"" : ""ios-marketing"", ""scale"" : ""1x"", ""size"" : ""1024x1024"" } |
| 67 | + ], |
| 68 | + ""info"" : { ""author"" : ""xcode"", ""version"" : 1 } |
| 69 | +}"; |
| 70 | + |
| 71 | + File.WriteAllText(Path.Combine(appiconsetPath, "Contents.json"), contentsJson); |
| 72 | + Debug.Log("IconSetter: iOS app icons written to AppIcon.appiconset"); |
| 73 | + } |
| 74 | + } |
| 75 | +} |
| 76 | + |
| 77 | +#endif |
0 commit comments