开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   Unity3d师兄

Unity中编辑器全自动打包 热度 2

个人分类: Unity编辑器 | 2015-12-14 16:10
标签:编辑器
0 个评论 | 阅读 489 | 收藏 | 举报

脚本批量打包PC

Unity默认提供了一些预定义标签如:

UNITY_EDITOR  : 编辑器模式下。

UNITY_STANDALONEPC Mac Linux模型下。

UNITY_IPHONEIOS模式下。

UNITY_ANDROID模式下。

还有很多预定义标签、大家可以在这里看到:http://docs.unity3d.com/Documentation/Manual/PlatformDependentCompilation.html

如何实现脚本批量打包。

 using UnityEngine;

using UnityEditor;

using System.Collections;

using System.Collections.Generic;

using System;

using System.IO;

public class PCALLEditorScript {

    //得到工程中所有场景名称

    static string[] SCENES = FindEnabledEditorScenes();

    //一系列批量build的操作

    [MenuItem("Custom/Build PC ")]

    static void PerformPCBuild()

    {

        BulidTarget("pc", "PC");

    }

         //在编辑器模式下添加需要打包pc端的数量

    [MenuItem("Custom/Build PC ALL")]

    static void PerformPCALLBuild()

    {

        BulidTarget("pc1", "PC");

        BulidTarget("pc2", "PC");

        BulidTarget("pc3", "PC");

        BulidTarget("pc4", "PC");

        BulidTarget("pc5", "PC");

    }

    static void BulidTarget(string name, string target)

    {

        string app_name = name;

        string target_dir = Application.dataPath + "/Target";

        string target_name = app_name + ".exe";

        BuildTarget buildTarget = BuildTarget.StandaloneWindows64;

 BuildTargetGroup targetGroup = BuildTargetGroup.Standalone;

string applicationPath = Application.dataPath.Replace("/Assets", "");

 if (target == "PC")

{

    target_dir = applicationPath + "/TargetPC";

    target_name = app_name + ".exe";

    targetGroup = BuildTargetGroup.Standalone;

    buildTarget = BuildTarget.StandaloneWindows64;

}

//每次build删除之前的残留

if (Directory.Exists(target_dir))

{

if (File.Exists(target_name))

         {

      File.Delete(target_name);

        }

}else{

     Directory.CreateDirectory(target_dir);

}

        //开始Build场景,等待吧~

GenericBuild(SCENES, target_dir + "/" + target_name, buildTarget, BuildOptions.None);

                  

    }

    //在这里找出你当前工程所有的场景文件,假设你只想把部分的scene文件打包 那么这里可以写你的条件判断 总之返回一个字符串数组。

    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();

    }

    //Build场景的方法

    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);

        }

    }

        

}

 

1.Resources文件夹 

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

2.StreamingAssets

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

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

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

http://docs.unity3d.com/Documentation/Manual/StreamingAssets.html

 

 

[code]csharpcode:

  [MenuItem("Custom/Build PC ")]

        static void PerformPCBuild()

        {  

                         //先把资源拷贝到Resources或者StreamingAssets

                            AssetDatabase.CopyAsset("path","newPath");

                         //然后开始编译版本

                           BulidTarget("pc", "PC");     

         }      

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

作者的其他最新博客

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号

个人分类

标签

阅读排行

评论排行

推荐博客

最新博客

返回顶部