2014-01-17 10:59:56 s10141303 阅读数 5616

1.首先我们把这段代码拷贝下来,放进工程,不要托给任何物体,就放在那不要理它。

using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
    [MenuItem("Export/Build AssetBundle From Selection - Track dependencies")]
    static void ExportResource () {
        // Bring up save panel
        string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
        if (path.Length != 0) {
            // Build the resource file from the active selection.
        Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
            BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);
            Selection.objects = selection;
        }
    }
    [MenuItem("Export/Build AssetBundle From Selection - No dependency tracking")]
    static void ExportResourceNoTrack () {
        // Bring up save panel
        string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
        if (path.Length != 0) {
            // Build the resource file from the active selection.
            BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path);
        }
    }
}
我们仔细看一下,其实打包的.unity3d格式的文件也类似assenbundle,只不过是换了个不同的后缀名而已。

当我们创建完,保存好后我,我们会发现菜单的导航栏多了这2项

 

2.我们在选中我们需要打包的预设物体(也即是Prefab)。然后选中上面的第一项进行打包成.unity3d格式的文件。如图

 

3.设置名字,路径等(路径很重要,待会加载会用到。)如图:

4.刷新下。你就会看见这个了:

这个就是我们打包后动态加载的内容。

 

5. 现在我来说下怎么动态加载它吧,直接上代码

using UnityEngine;
using System.Collections;
using System.IO;

public class LoadUnity3d : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {

        StartCoroutine(LoadScene());

    }

    // Update is called once per frame
    void Update()
    {

    }

    IEnumerator LoadScene()
    {
        //文件路径,也就是我们打包的那个
        WWW www = new WWW("file:///" + Application.dataPath + "/Bundles/My Prefab.unity3d");
        yield return www;
        Instantiate(www.assetBundle.mainAsset);
    }
}

6.我们再新建一个空物体,讲我们这个脚本托给他,运行,你就能看见我们的预设也加载出来了。

  效果如下:

 


2015-12-29 11:48:35 angelsmiles 阅读数 7544

.unity3d格式打包与解包

打包

打包主要用到BuildPipeline.BuildAssetBundle

bt = BuildTarget.StandaloneWindows
string path = EditorUtility.SaveFilePanel("Save Resource", targetDir, saveFileName, "unity3d");
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, options, bt);

解包

解包主要用到WWW

void Start()
{
    StartCoroutine(PreCacheGoodsXmlNodesOld());
}

public static IEnumerator PreCacheGoodsXmlNodesOld()
{
    Object unity3d = Selection.activeObject;
    string url = "";
    WWW www = new WWW(url);
    yield return www;

    AssetBundle assetBundle = null;
    assetBundle = www.assetBundle;
    Object[] objs= assetBundle.LoadAll();
}
2015-09-06 19:07:36 suifcd 阅读数 4219

unity中有些时候有些代码是一整套的,如果能把他们归类起来作为一个文件整个代码结构看起来就会整洁清爽很多。

c#提供了dll打包,但是unity中由于涉及到unity的自身dll,如UnityEngine.dll,我们一般写的很多代码都会涉及到对这个dll的引用,在unity中建代码文件都会默认添加对此dll命名空间的使用,using UnityEngine;
因此在涉及到使用此dll在打包dll的时候就要有点特殊处理。

项目中常见的是对Debug的二次封装,由于调试的需求,在项目开发周期debug是个很重要且常用的类,但是debug的效率实在是不忍直视,所以在打包apk时出于效率考虑就要屏蔽掉debug的调试,这时要做的可能是删除掉所有对应的代码,这基本上是不可能的,不说这些调试代码可能以后会用到,每次打包都删一次也不实际。还有一种是设定bool值,每次调用Debug类的时候,判定此bool值,每次都要判定,这本书就代码冗余,设计的不合理。这里大家想到的可能都是二次封装了。在封装一个类,调用Debug的时候调用封装的类,但是这又设计到一个问题,Debug调试的一个重要功能就是显示在控制台的信息双击可以跳到指定代码,如果这样二次封装的话就每次跳到封装的代码里,而不是我们想要的地方。有人说可以看堆栈调用信息,可是每次都看,很累的。对于这个问题,便是将二次封装类进行dll打包。

啰嗦了一大堆,只是说明为什么要对Debug进行二次封装和为什么要用dll的原因,具体方法如下,unity官方提供了相应的教程。

Unity官方文档教程链接地址

文档是英文的,但是不难,分别讲解了在Windows条件下和mac条件下的操作方法。

这里以Windows为例,大概讲解一下。
流程:

1.先进入unity的安装目录,找到你引用的dll,地址类似于C:\Program Files\Unity\Editor\Data\Managed
如你引用了UnityEngine.dll,那么久复制对应的文件。

2.将复制的文件拷贝到硬盘根目录,根目录的缘故是为了接下来方便操作,也可以在根目录下创建一个文件夹,将文件放入这个文件夹。这里示例为F盘根目录 。注意:不建议放在桌面

3.将你要打包dll的文件复制到同个地方(示例为F盘根目录)

4.开cmd界面,进入执行文件的目录,路径大概如下
C:\Program Files (x86)\Unity4.6\Editor\Data\MonoBleedingEdge\lib\mono\2.0
根据自己的安装目录进行参考

5.执行命令,命令大概如下
mcs -r:F:\UnityEngine.dll -target:library F:\DebugCustom.cs
其中mcs是命令是要执行的命令,F:\UnityEngine.dll是引用的dll,如果你引用了多个dll,可以加个空格后继续添加,-target:library是指将文件打包成dll,F:\DebugCustom.cs是你要打包成dll的文件,如果文件有多个,同样加空格然后在后面添加

上面就是流程了,看完了后不知道有没有看出问什么会有上面那个注意了,第五条中空格很关键,而我们桌面的路径有的会有空格,win7的没有,好像是Xp有,所以只是不建议,而不是不能。大家根据自己的情况调整就行。

文章原创,转载请注明出处

2015-09-02 15:25:23 hppyW 阅读数 1212
Unity3d项目工程批量打包
当我们的一个项目工程结束的时候,常常需要很多不同分发渠道的apk,如果直接手动单个apk时,会比较麻烦。我们可以利用Unity扩展编辑器的功能来做。

 首先,在项目工程文件目录Asset文件夹下,创建Editor文件夹


其次,在其下创建一个关于批量打包的脚本,过一会儿,你会在Unity工具栏上看见“Custom”菜单栏,可以点击其下对应打包按钮,生成不同的apk。另外,值得注意的是,ios只能生成对应的Xcode工程。




<pre name="code" class="csharp">using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;

public class MyEditorScript
{
    //得到工程中所有场景名称
    static string[] SCENES = FindEnabledEditorScenes();

    //static string[] Target_SCENES;


    //一系列批量build的操作

    //快易典apk打包
    [MenuItem("Custom/Build Android KYD")]
    static void PerformAndroidKYDBuild()
    {
        BulidTarget("KYD", "Android");
    }

    //360apk打包
    [MenuItem("Custom/Build Android 360")]
    static void PerformAndroid360Build()
    {
        BulidTarget("360", "Android");
    }

    //腾讯apk打包
    [MenuItem("Custom/Build Android TENCENT")]
    static void PerformAndroidTENCENTBuild()
    {
        BulidTarget("TENCENT", "Android");
    }

    //百度apk打包
    [MenuItem("Custom/Build Android BAI_DU")]
    static void PerformAndroidBAIDUBuild()
    {
        BulidTarget("BAI_DU", "Android");
    }

    //批量打包apk包
    [MenuItem("Custom/Build Android ALL")]
    static void PerformAndroidALLBuild()
    {
        BulidTarget("KYD", "Android");
        BulidTarget("360", "Android");
        BulidTarget("TENCENT", "Android");
        BulidTarget("BAI_DU", "Android");
    }



    //苹果Xcode工程打包
    [MenuItem("Custom/Build iPhone XcodeProj")]
    static void PerformiPhoneQQBuild()
    {
        BulidTarget("XcodeProj", "IOS");
    }




    //这里封装了一个简单的通用方法。
    static void BulidTarget(string name, string target)
    {
        //for (int i = 0; i < SCENES.Length; i++)
        //{
        //    if (SCENES[i] == "Main_Elephant")
        //    {
        //        Target_SCENES[0] = SCENES[i];
        //    }
        //}
        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);
        }



        //==================这里是比较重要的东西,设置打包apk的bundleID以及区分宏定义调用相应代码=======================
        switch (name)
        {
            case "KYD":
                PlayerSettings.bundleIdentifier = "com.hp.picturebook_elephant";
                PlayerSettings.bundleVersion = "1.0";
                PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, "KYD");
                break;
            case "360":
                PlayerSettings.bundleIdentifier = "com.hp.picturebook_elephant";
                PlayerSettings.bundleVersion = "1.0";
                PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, "QI_HU");
                break;
            case "TENCENT":
                PlayerSettings.bundleIdentifier = "com.hp.picturebook_elephant";
                PlayerSettings.bundleVersion = "1.0";
                PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, "TENCENT");
                break;
            case "BAI_DU":
                PlayerSettings.bundleIdentifier = "com.hp.picturebook_elephant";
                PlayerSettings.bundleVersion = "1.0";
                PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, "BAI_DU");
                break;

        }

        //==================这里是比较重要的东西=======================

        //开始Build场景,等待吧~
        //注意:打包成功的apk包可以在项目工程的根目录下可以看到
        
        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);
        }
    }

}

没有更多推荐了,返回首页