import os
import json
import shutil
from math import trunc
def generate_ios_icons(xcode_project_path, icons_dir):
# 从 Xcode 11 工程 Images.xcassets/AppIcon.appiconset/Contents.json 转换生成
# 排列顺序调整为与 Unity 生成的一致,方便自动修改后比较文件内容
images_template = [
{
"size": 57,
"idiom": "iphone",
"scale": 1
},
{
"size": 57,
"idiom": "iphone",
"scale": 2
},
{
"size": 60,
"idiom": "iphone",
"scale": 2
},
{
"size": 60,
"idiom": "iphone",
"scale": 3
},
{
"size": 29,
"idiom": "iphone",
"scale": 1
},
{
"size": 29,
"idiom": "iphone",
"scale": 2
},
{
"size": 29,
"idiom": "iphone",
"scale": 3
},
{
"size": 40,
"idiom": "iphone",
"scale": 2
},
{
"size": 40,
"idiom": "iphone",
"scale": 3
},
{
"size": 20,
"idiom": "iphone",
"scale": 2
},
{
"size": 20,
"idiom": "iphone",
"scale": 3
},
{
"size": 29,
"idiom": "ipad",
"scale": 1
},
{
"size": 29,
"idiom": "ipad",
"scale": 2
},
{
"size": 40,
"idiom": "ipad",
"scale": 1
},
{
"size": 40,
"idiom": "ipad",
"scale": 2
},
{
"size": 50,
"idiom": "ipad",
"scale": 1
},
{
"size": 50,
"idiom": "ipad",
"scale": 2
},
{
"size": 72,
"idiom": "ipad",
"scale": 1
},
{
"size": 72,
"idiom": "ipad",
"scale": 2
},
{
"size": 76,
"idiom": "ipad",
"scale": 1
},
{
"size": 76,
"idiom": "ipad",
"scale": 2
},
{
"size": 20,
"idiom": "ipad",
"scale": 1
},
{
"size": 20,
"idiom": "ipad",
"scale": 2
},
{
"size": 83.5,
"idiom": "ipad",
"scale": 2
},
{
"size": 1024,
"idiom": "ios-marketing",
"scale": 1
}
]
appicon_dir = os.path.join(xcode_project_path, 'Unity-iPhone/Images.xcassets/AppIcon.appiconset')
cleared = False
images = []
for image_template in images_template:
icon_name = '{0}x{0}.png'.format(trunc(image_template['size'] * image_template['scale']))
icon_path = os.path.join(icons_dir, icon_name)
if not os.path.exists(icon_path):
continue
if not cleared:
for root, dirs, files in os.walk(appicon_dir):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
cleared = True
shutil.copy2(icon_path, appicon_dir)
image = {'filename': icon_name, 'idiom': image_template['idiom'],
'scale': '{0}x'.format(image_template['scale']), 'size': '{0}x{0}'.format(image_template['size'])}
images.append(image)
contents = {
'images': images,
'info': {
'author': 'xcode',
'version': 1
},
'properties': {
'pre-rendered': False
}
}
contents_path = os.path.join(xcode_project_path, 'Unity-iPhone/Images.xcassets/AppIcon.appiconset/Contents.json')
with open(contents_path, 'w', encoding='utf-8') as openfile:
json.dump(contents, openfile, indent=4, sort_keys=False, ensure_ascii=False)
# 36x36.png src/main/res/drawable-ldpi/app_icon.png
# 48x48.png src/main/res/drawable-mdpi/app_icon.png
# 72x72.png src/main/res/drawable/app_icon.png
# 72x72.png src/main/res/drawable-hdpi/app_icon.png
# 96x96.png src/main/res/drawable-xhdpi/app_icon.png
# 144x144.png src/main/res/drawable-xxhdpi/app_icon.png
# 192x192.png src/main/res/drawable-xxxhdpi/app_icon.png
def generate_android_icons(gradle_project_path, icons_dir):
icons_template = [
{
'size': 36,
'name': 'drawable-ldpi'
},
{
'size': 48,
'name': 'drawable-mdpi'
},
{
'size': 72,
'name': 'drawable'
},
{
'size': 72,
'name': 'drawable-hdpi'
},
{
'size': 96,
'name': 'drawable-xhdpi'
},
{
'size': 144,
'name': 'drawable-xxhdpi'
},
{
'size': 192,
'name': 'drawable-xxxhdpi'
},
]
for icon_template in icons_template:
icon_name = '{0}x{0}.png'.format(trunc(icon_template['size']))
icon_path = os.path.join(icons_dir, icon_name)
if not os.path.exists(icon_path):
continue
appicon_dir = os.path.join(gradle_project_path, 'src/main/res/{0}'.format(icon_template['name']))
if not os.path.exists(appicon_dir):
continue
appicon_path = os.path.join(appicon_dir, 'app_icon.png')
print(icon_path, appicon_path)
shutil.copy2(icon_path, appicon_path)