unity批量打包-新闻详情

unity批量打包


发布时间:2018-12-07责任编辑:满帅 浏览:1462


针对每个渠道,肯定是要分开打包,ios方面unity打成xcode工程再得在xcode里进行build,有个批量打包的工具肯定是能节省很多时间。

下面是代码:

 

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
 
public class PerformBuild : EditorWindow {
        static Dictionary<string, bool> componentDic = new Dictionary<string, bool>();
        static string[] sList = new string[6]{"AiSi","KuaiYong","TongBuTui","iTools","PP","XY",};
        static List<string> selectBuild = new List<string> ();
        static string inputText = "";
 
        [MenuItem("Tools/Build Project")]
        static void Init()
        {
                EditorWindow.GetWindow<PerformBuild>(true, "Build Project");
                selectBuild.Clear ();
                /*for (int i=0; i<selectBuild.Length; i++)
                {
                        selectBuild[i] = null;
                }*/
                componentDic.Clear ();
                componentDic.Add ("AiSi", false);
                componentDic.Add ("KuaiYong", false);
                componentDic.Add ("TongBuTui", false);
                componentDic.Add ("iTools", false);
                componentDic.Add ("PP", false);
                componentDic.Add ("XY", false);
 
    }
        private static string[] FindEnabledEditorScenes()
        {
                List<string> EditorScenes = new List<string>();
                foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
                {
                        if (!scene.enabled) continue;
                        EditorScenes.Add(scene.path);
                }
                return EditorScenes.ToArray();
        }
    void BuildSelect()
        {
                for (int i = 0; i<sList.Length; i++)
                {
                        if(componentDic[sList[i]])
                        {
                                selectBuild.Add(sList[i]);
                        }
                }
                for (int i=0; i<selectBuild.Count; i++)
                {
                
                        BulidTarget(selectBuild[i]);
 
                }
         
        }
 
        void OnGUI()
        {
                EditorGUILayout.BeginVertical();
                EditorGUILayout.SelectableLabel ("Please Input Your Bundle Version:");
                inputText = EditorGUILayout.TextField ("",inputText);
                EditorGUILayout.SelectableLabel ("Select You Want Build SDK Project:");
                for (int i = 0; i<sList.Length; i++)
                {
                        if(i==0)EditorGUILayout.BeginHorizontal();
                        if(i==3||i==sList.Length-1)
                        {
                                EditorGUILayout.EndHorizontal();
                                EditorGUILayout.BeginHorizontal();
                        }
                        componentDic[sList[i]] = EditorGUILayout.Toggle(sList[i],componentDic[sList[i]]);
                }
                EditorGUILayout.EndHorizontal();
                if (GUILayout.Button ("Build Select"))
                {
                        BuildSelect();
                }
 
                EditorGUILayout.EndVertical ();
                
        }
        static string[] SCENES = FindEnabledEditorScenes();
        static void BulidTarget(string name)
        {
                string app_name = name;
                string target_dir = null;
                string target_name = app_name;
                BuildTargetGroup targetGroup = BuildTargetGroup.iPhone;
                BuildTarget buildTarget = BuildTarget.iPhone;
                string applicationPath = Application.dataPath.Replace("/Assets","");
                target_dir = applicationPath + "/TargetIOS";
 
                
                //每次build删除之前的残留
                if(Directory.Exists(target_dir))
                {
                        if (File.Exists(target_name))
                        {
                                File.Delete(target_name);
                        }
                }else
                {
                        Directory.CreateDirectory(target_dir);
                }
                //==================这里是比较重要的东西=======================
                Texture2D[] icon = new Texture2D[7];
                string iconPath = null;
                switch(name)
                {
                case "91":
                        iconPath = "Assets/XX/Icon/Icon_91/";
                        PlayerSettings.bundleIdentifier = "com.XX.XX.91";
                        break;
                case "AiSi":
                        iconPath = "Assets/XX/Icon/Icon_i4/";
                        PlayerSettings.bundleIdentifier = "com.XX.XX.i4";
                        break;
                case "KuaiYong":
                        iconPath = "Assets/XX/Icon/Icon_ky/";
                        PlayerSettings.bundleIdentifier = "com.XX.XX.ky";
                        break;
                case "TongBuTui":
                        iconPath = "Assets/XX/Icon/Icon_tb/";
                        PlayerSettings.bundleIdentifier = "com.XX.XX.tb";
                        break;
                case "iTools":
                        iconPath = "Assets/XX/Icon/Icon_sky/";
                        PlayerSettings.bundleIdentifier = "com.XX.XX.sky";
                        break;
                case "PP":
                        iconPath = "Assets/XX/Icon/Icon_pp/";
                        PlayerSettings.bundleIdentifier = "com.XX.XX.pp";
                        break;
                case "XY":
                        iconPath = "Assets/XX/Icon/Icon_xy/";
                        PlayerSettings.bundleIdentifier = "com.XX.XX.xy";
                        break;
                default:
                        return;
                }
                PlayerSettings.bundleVersion = inputText;
                for(int i=0;i<icon.Length;i++)
                {
                        icon[i] = (Texture2D)Resources.LoadAssetAtPath(iconPath+i+".png",typeof(Texture2D));
                }
                PlayerSettings.SetIconsForTargetGroup(targetGroup,icon);
                FileUtil.ReplaceFile(iconPath+"defaultIcon.png", "Assets/XX/Icon/normal/defaultIcon.png");
        //==================这里是比较重要的东西=======================
                //开始Build场景,等待吧~
                Debug.Log ("start build:"+name);
                GenericBuild(SCENES, target_dir + "/" + target_name, buildTarget,BuildOptions.AcceptExternalModificationsToPlayer);
 
 
                
        }
        static void GenericBuild(string[] scenes, string target_dir, BuildTarget build_target, BuildOptions build_options)
        {
                EditorUserBuildSettings.SwitchActiveBuildTarget(build_target);
                EditorUserBuildSettings.appendProject = true;
                string res = BuildPipeline.BuildPlayer(scenes,target_dir,build_target,build_options);
                
                if (res.Length > 0) {
                        throw new Exception("BuildPlayer failure: " + res);
                }
        }
}

需要注意的两个小点是

1.EditorUserBuildSettings.appendProject = true;

这句话是打出来的xcode工程在原工程的基础上以append的形式追加,而不写默认就是replace的,那些设置与引用的sdk就都白弄了。

 

光有这句代码并不能实现append的效果,还需要这句:

2.GenericBuild(SCENES, target_dir + "/" + target_name, buildTarget,BuildOptions.AcceptExternalModificationsToPlayer);
主要是里面穿的最后一个参数:BuildOptions.AcceptExternalModificationsToPlayer

这个可以设置播放器目录接受外部修改,说白了就是有这句打出来的xcode工程才能使在已有的工程上追加内容。

但是根据一些渠道要求是需要替换游戏Icon和Splash Image的,而defaultIcon和Mobile Splash Screen都没查找到相关方法。

解决办法:

同名替换法!

很简单的一句代码就解决了

FileUtil.ReplaceFile(iconPath+"defaultIcon.png", "Assets/XX/Icon/normal/defaultIcon.png");

右边路径的文件是在unity里面拖进去的!就这么简单。

简单实用。

 

游戏开发组   供稿