Unity3D脚本批量打渠道包

来源:互联网 发布:淘宝卖家信息采集软件 编辑:程序博客网 时间:2024/04/30 15:02

  • 本文固定链接: http://www.xuanyusong.com/archives/2418
  • 转载请注明: 雨松MOMO 2013年06月29日 于 雨松MOMO程序研究院 发表

using UnityEngine;using System.IO;using System.Collections.Generic;using System;using UnityEditor;public class MyAutobuildApk    {        //得到工程中所有场景名称        static string[] SCENES = FindEnabledEditorScenes();        //一系列批量build的操作        [MenuItem("Custom/Build Android QQ")]        static void PerformAndroidQQBuild()        {            BulidTarget("QQ", "Android");        }        [MenuItem("Custom/Build Android UC")]        static void PerformAndroidUCBuild()        {            BulidTarget("UC", "Android");        }        [MenuItem("Custom/Build Android CMCC")]        static void PerformAndroidCMCCBuild()        {            BulidTarget("CMCC", "Android");        }        [MenuItem("Custom/Build Android ALL")]        static void PerformAndroidALLBuild()        {            BulidTarget("QQ", "Android");            BulidTarget("UC", "Android");            BulidTarget("CMCC", "Android");        }        [MenuItem("Custom/Build iPhone QQ")]        static void PerformiPhoneQQBuild()        {            BulidTarget("QQ", "IOS");        }        [MenuItem("Custom/Build iPhone QQ")]        static void PerformiPhoneUCBuild()        {            BulidTarget("UC", "IOS");        }        [MenuItem("Custom/Build iPhone CMCC")]        static void PerformiPhoneCMCCBuild()        {            BulidTarget("CMCC", "IOS");        }        [MenuItem("Custom/Build iPhone ALL")]        static void PerformiPhoneALLBuild()        {            BulidTarget("QQ", "IOS");            BulidTarget("UC", "IOS");            BulidTarget("CMCC", "IOS");        }        //这里封装了一个简单的通用方法。        static void BulidTarget(string name, string target)        {            string app_name = name;            string target_dir = Application.dataPath + "/TargetAndroid";            string target_name = app_name + ".apk";            BuildTargetGroup targetGroup = BuildTargetGroup.Android;            BuildTarget buildTarget = BuildTarget.Android;            string applicationPath = Application.dataPath.Replace("/Assets", "");            if (target == "Android")            {                target_dir = applicationPath + "/TargetAndroid";                target_name = app_name + ".apk";                targetGroup = BuildTargetGroup.Android;            }            if (target == "IOS")            {                target_dir = applicationPath + "/TargetIOS";                target_name = app_name;                targetGroup = BuildTargetGroup.iOS;                buildTarget = BuildTarget.iOS;            }            //每次build删除之前的残留            if (Directory.Exists(target_dir))            {                if (File.Exists(target_name))                {                    File.Delete(target_name);                }            }            else            {                Directory.CreateDirectory(target_dir);            }            //==================这里是比较重要的东西=======================            switch (name)            {                case "QQ":                    PlayerSettings.bundleIdentifier = "com.game.qq";                    PlayerSettings.bundleVersion = "v0.0.1";                    PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, "QQ");                    break;                case "UC":                    PlayerSettings.bundleIdentifier = "com.game.uc";                    PlayerSettings.bundleVersion = "v0.0.1";                    PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, "UC");                    break;                case "CMCC":                    PlayerSettings.bundleIdentifier = "com.game.cmcc";                    PlayerSettings.bundleVersion = "v0.0.1";                    PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, "CMCC");                    break;            }            //==================这里是比较重要的东西=======================            //开始Build场景,等待吧~            GenericBuild(SCENES, target_dir + "/" + target_name, buildTarget, BuildOptions.None);        }        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();        }        static void GenericBuild(string[] scenes, string target_dir, BuildTarget build_target, BuildOptions build_options)        {            EditorUserBuildSettings.SwitchActiveBuildTarget(build_target);            string res = BuildPipeline.BuildPlayer(scenes, target_dir, build_target, build_options);            if (res.Length > 0)            {                throw new Exception("BuildPlayer failure: " + res);            }        }    }


如果我们希望在性能高的手机上用一套好的资源,在性能低的手机上用一套差一点的资源该怎么办?那么首先我们先搞清楚Unity会把什么资源打包,什么资源不打包?

1.Resources文件夹 

Resources文件夹是一个只读的文件夹,通过Resources.Load()来读取对象。因为这个文件夹下的所有资源都可以运行时来加载,所以Resources文件夹下的所有东西都会被无条件的打到发布包中。建议这个文件夹下只放Prefab或者一些Object对象,因为Prefab会自动过滤掉对象上不需要的资源。举个例子我把模型文件还有贴图文件都放在了Resources文件夹下,但是我有两张贴图是没有在模型上用的,那么此时这两张没用的贴图也会被打包到发布包中。假如这里我用Prefab,那么Prefab会自动过滤到这两张不被用的贴图,这样发布包就会小一些了。 

2.StreamingAssets

StreamingAssets文件夹也是一个只读的文件夹,但是它和Resources有点区别,Resources文件夹下的资源会进行一次压缩,而且也会加密,不使用点特殊办法是拿不到原始资源的。但是StreamingAssets文件夹就不一样了,它下面的所有资源不会被加密,然后是原封不动的打包到发布包中,这样很容易就拿到里面的文件。所以StreamingAssets适合放一些二进制文件,而Resources更适合放一些GameObject和Object文件。StreamingAssets 只能用过www类来读取!!

3. 最后凡是在Hierarchy视图对象引用过的资源文件也会被无条件打包到发布包中。如果有一部分文件可能没有在Resources文件夹下也没有在StreamingAssets文件夹下,也没有被Hierarchy视图游戏对象引用,那么这类资源是不会被打包到发布包中的。

OK!搞清楚这一点就好办了!在处理不同包对应不同资源包的时候,尽量让可配置的资源放在Resources 或StreamingAssets文件夹下,运行的时候程序动态的来读取它们,最后显示在游戏中就可以了。在批量打包前,在Project视图下创建不同包的资源文件夹, 然后脚本 AssetDatabase 动态的将资源拷贝至Resources或StreamingAssets 文件夹中,

代码中说到还有一个重要的东西就是PlayerSettings类。因为在Build的时候不同平台下可能会有一些PlatformSettings是不一样的,所以需要在脚本里面动态的设置它,强大的参数列表在这里:http://docs.unity3d.com/Documentation/ScriptReference/PlayerSettings.html


1 0