unity3D 编辑器扩展,设置应用图标

Unity 2018的Android平台Icon怎样设置,自己打开Unity去看下:

File->Build Settings->Player Settings->android 平台

可以看到有很多个icon需要设置:

 

你可以手动拖拽icon图片到对应的位置。

但是代码如何设置呢?

就图来看,也就是说,新版的2018需要设置3种类型的Icon,那么需要如何设置呢,现在把代码放上去。

public class AutoIconSet : Editor
{
    //必须和存放Icon的文件夹路径一直,否则获得的Texture2D将会为空
    private static readonly string Icon_Path = @"Assets\Arts\Icons\{0}\{1}.png";
 
    [MenuItem("IconSet/App")]
    public static void SetAppIcons()
    {
        SetIcons("APP");
    }
 
    private static void SetIcons(string iconPrefixName)
    {
        int[] iconSizes = PlayerSettings.GetIconSizesForTargetGroup(BuildTargetGroup.Android);
        Texture2D[] texArray = new Texture2D[iconSizes.Length];
        for (int i = 0; i < iconSizes.Length; ++i)
        {
            int iconSize = iconSizes[i];
            Texture2D tex2D = AssetDatabase.LoadAssetAtPath(string.Format(Icon_Path, iconPrefixName, iconSize),
                typeof(Texture2D)) as Texture2D;
            texArray[i] = tex2D;
        }
 
        //此处为新API
        var platform = BuildTargetGroup.Android;
        //kind有3种,分别对应PlayerSettings的Legacy,Round,Adaptive
        var kind = UnityEditor.Android.AndroidPlatformIconKind.Round;
        var icons = PlayerSettings.GetPlatformIcons(platform, kind);
 
        for (int i = 0, length = icons.Length; i < length; ++i)
        {
            //将转换后获得的Texture2D数组,逐个赋值给icons
            icons[i].SetTexture(texArray[i]);
        }
        PlayerSettings.SetPlatformIcons(platform, kind, icons);
        //新API结束
 
        AssetDatabase.SaveAssets();
        Debug.LogFormat("Set {0} Icon Complete", iconPrefixName);
    }
}

这样Unity窗口上就会有,点击一下App,就能自动为自己的项目设置Icon了。此外,如果出现Set Icon Complete的log,但是却看不见PlayerSettings里有显示,可以检查一下Icon的存放路径和脚本里的Icon_Path是否填写一致。

=====================分割线==================

很快就根据Android,IOS平台之分,以及N种Icon类型,修改了这个脚本,使得脚本可以由外部自由选择来决定平台和Icon类型

同时不再由代码设置文件夹,需要自己根据Unity的要求创建相应的文件夹,这样保证一一对应,来对Icon进行设置

文件夹展示:

脚本的话,进行如下增删:

using UnityEngine;
using UnityEditor;
using System.IO;
 
public class AutoIconSet : Editor
{
    private static readonly string Icon_Path = @"Assets\Arts\Icons\{0}\{1}\{2}.png";
 
    [MenuItem("IconSet/Android/Adaptive")]
    public static void SetAndroidAdaptive()
    {
        SetIcons(BuildTargetGroup.Android, UnityEditor.Android.AndroidPlatformIconKind.Adaptive);
    }
 
    [MenuItem("IconSet/Android/Round")]
    public static void SetAndroidRound()
    {
        SetIcons(BuildTargetGroup.Android, UnityEditor.Android.AndroidPlatformIconKind.Round);
    }
        
    [MenuItem("IconSet/Android/Legacy")]
    public static void SetAndroidLegacy()
    {       
        SetIcons(BuildTargetGroup.Android, UnityEditor.Android.AndroidPlatformIconKind.Legacy);
    }
 
    [MenuItem("IconSet/iOS/Application")]
    public static void SetiOSApplication()
    {
        SetIcons(BuildTargetGroup.iOS, UnityEditor.iOS.iOSPlatformIconKind.Application);
    }
 
    [MenuItem("IconSet/iOS/Spotlight")]
    public static void SetiOSSpotlight()
    {
        SetIcons(BuildTargetGroup.iOS, UnityEditor.iOS.iOSPlatformIconKind.Spotlight);
    }
 
    [MenuItem("IconSet/iOS/Settings")]
    public static void SetiOSSettings()
    {
        SetIcons(BuildTargetGroup.iOS, UnityEditor.iOS.iOSPlatformIconKind.Settings);
    }
 
    [MenuItem("IconSet/iOS/Notifications")]
    public static void SetiOSNotifications()
    {
        SetIcons(BuildTargetGroup.iOS, UnityEditor.iOS.iOSPlatformIconKind.Notification);
    }
 
    [MenuItem("IconSet/iOS/Marketing")]
    public static void SetiOSMarketing()
    {
        SetIcons(BuildTargetGroup.iOS, UnityEditor.iOS.iOSPlatformIconKind.Marketing);
    }
 
    private static Texture2D[] GetIconsFromAsset(BuildTargetGroup target, PlatformIconKind kind, PlatformIcon[] icons)
    {
        Texture2D[] texArray = new Texture2D[icons.Length];
 
        //因为Android设置会带有" API (xx)"等附加信息,为了文件夹不出现空格,只取空格前单词
        string folder = kind.ToString().Split(' ')[0];
        string filename;
        for (int i = 0; i < texArray.Length; ++i)
        {
            //不需要再通过GetIconSizesForTargetGroup了来获得Icon尺寸数组,
            //直接由对应的PlatformIcon.width来获取Icon大小
            int iconSize = icons[i].width;
            filename = string.Format(Icon_Path, target, folder, iconSize);
            if (!File.Exists(filename))
            {
                Debug.LogErrorFormat("图片文件不存在, 路径为:{0}", filename);
                continue;
            }
            Texture2D tex2D = AssetDatabase.LoadAssetAtPath(filename,
                typeof(Texture2D)) as Texture2D;
            texArray[i] = tex2D;
        }
        return texArray;
    }
 
    private static void SetIcons(BuildTargetGroup platform, PlatformIconKind kind)
    {
        //获得当前平台和当前Icon类型的PlatformIcon数组
        PlatformIcon[] icons = PlayerSettings.GetPlatformIcons(platform, kind);
 
        //将Asset转为Texture2D
        Texture2D[] iconSources = GetIconsFromAsset(platform, kind, icons);
 
        for (int i = 0, length = icons.Length; i < length; ++i)
        {
            icons[i].SetTexture(iconSources[i]);
        }
 
        PlayerSettings.SetPlatformIcons(platform, kind, icons);
 
        AssetDatabase.SaveAssets();
        Debug.LogFormat("Set {0}/{1} Icon Complete", platform,  kind);
    }
}

这样,通过自己编写Editor函数来选择平台和Icon类型,使得代码更加灵活。如图:

 

本文从此处转载:https://blog.csdn.net/DoyoFish/article/details/103891972

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值