发布时间: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里面拖进去的!就这么简单。
简单实用。
游戏开发组 供稿