游戏热更新

打包及其菜单栏设置

AssetImporter 资源导入器

System.IO.Path.Combine 简单来说,就是合并两个路径字符串。

比如如下调用,Path.Combine(@“C:\11”,“aa.txt”) 返回的字符串路径如后: C:\11\aa.txt

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text;

AssetBundle就像一个ZIP压缩文件,里面存储着不同平台的特殊资源(models/texture/prefabs/materials/audio clip/scenes...), 这些资源都可以在运行时进行加载

如何打包AssetBundle

unity资源打包的接口,就是BuildPipeline.BuildAssetBundles函数,其对应具体的三个参数,第一个是bundle的输出路径
第二个参数 : 
BuildAssetBundleOptions.None : 采用LZMA的压缩格式, 这种压缩格式要求资源在使用之前需要全部被解压,耗费时间
BuildAssetBundleOptions.UncompressedAssetBundle: 无压缩的打包,加载的文件更大,但是时间更快(省去解压的时间)
BuildAssetBundleOptions.ChunkBasedCompression: 采用LZ4的压缩格式,相比于LZMA而言文件体积更大,但是不要求在使用之前整个bundle都被解压。LZ4使用chunk based 算法,这就运行文件以chunk或者piece的方式加载,只解压一个chunk文件,而无需解压bundle中其余不相关的chunk。----目前学习使用的是该格式
第三个参数:  BuildTarget  ------> 当前资源需要被使用的平台的分类
AssetDatebase也是一个静态类,他的作用是管理整个工程的所有文件(一般成为“资产”)

简单资源的打包代码如下

public class Tools
{
    private static Dictionary<string, string> dicAssetBundle = new Dictionary<string, string>();
    private static string AbOutputDir
    {
        get
        {
            string abOutputDir = Application.dataPath + "/../ABOutput";
            if (!Directory.Exists(abOutputDir))
            {
                Directory.CreateDirectory(abOutputDir);
            }
            return abOutputDir;
        }
    }


    [MenuItem("tools/一键打包")]
    public static void BuildAB()
    {
        string path = Path.Combine(Application.dataPath, "AssetsPackage");
        string[] allDircetory = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
        List<string> list = new List<string>();
        foreach (var item in allDircetory)
        {
            string s = item.Replace("\\", "/");
            s = s.Replace("Assets/", "|Assets/");
            s = s.Split('|')[1];
            if (Path.GetExtension(s) != ".meta")
            {
                list.Add(s);
            }
        }
        foreach (var item in list)
        {
            string s = item.Replace("Assets/AssetsPackage/", "").Split('.')[0];
            //   --->mat/red.u3d
            int endindex = s.LastIndexOf("/");
            s = s.Substring(0, endindex);
            //存入字典
            dicAssetBundle.Add(item.Replace("Assets/AssetsPackage/", "").Split('.')[0], s);
            AssetImporter importer = AssetImporter.GetAtPath(item);
            importer.assetBundleName = s;
            importer.assetBundleVariant = "u3d";
        }
        StartBuildAB();
        ClearABName();
        SaveAssedBundleDic();
        OpenABOutput();
    }

//保存打包的清单到字典中并写入文件中
    private static void SaveAssedBundleDic()
    {
        StringBuilder sb = new StringBuilder();
        foreach (var item in dicAssetBundle)
        {
            sb.Append(item.Key + "|" + item.Value+"\r\n");
        }
        File.WriteAllText(AbOutputDir + "/ABAssetBundleDicList.txt", sb.ToString());
    }

    [MenuItem("tools/清除包名")]
    public static void ClearABName()
    {
        string[] allassetsname = AssetDatabase.GetAllAssetBundleNames();
        foreach (var item in allassetsname)
        {
            string[] allname = AssetDatabase.GetAssetPathsFromAssetBundle(item);
            foreach (var it in allname)
            {
                AssetImporter importer = AssetImporter.GetAtPath(it);
                importer.assetBundleName = "";
            }
        }
    }

    /// <summary>
    /// 开始打包
    /// </summary>
    private static void StartBuildAB()
    {
        BuildPipeline.BuildAssetBundles(AbOutputDir, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.Android);
    }
    [MenuItem("tools/打开ABOutput文件夹")]
    //打开ABOutput文件夹
    public static void OpenABOutput()
    {
        System.Diagnostics.Process.Start(AbOutputDir);
    }

}

打包后的资源------->如图(可以修改包名)

利用程序启动进程资源并打开弹窗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CocosCreator小游戏热更新是指在不重新发布游戏的情况下,通过网络下载新的资源或代码,实现游戏内容的更新。具体实现方式可以通过以下步骤来完成: 1. 在CocosCreator中使用资源管理器将需要热更新的资源打包成zip文件,并上传到服务器上。 2. 在游戏启动时,通过网络请求获取服务器上的版本信息和需要更新的资源列表。 3. 将需要更新的资源下载到本地,并进行解压和替换。 4. 重启游戏,使新的资源生效。 下面是一个简单的示例代码: ```javascript // 获取服务器版本信息和需要更新的资源列表 let xhr = cc.loader.getXMLHttpRequest(); xhr.open("GET", "http://yourserver/version.json", true); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) { let response = xhr.responseText; let versionInfo = JSON.parse(response); let remoteVersion = versionInfo.version; let remoteAssets = versionInfo.assets; checkUpdate(remoteVersion, remoteAssets); } }; xhr.send(); // 检查是否需要更新 function checkUpdate(remoteVersion, remoteAssets) { let localVersion = cc.sys.localStorage.getItem("version"); if (localVersion !== remoteVersion) { // 需要更新 cc.sys.localStorage.setItem("version", remoteVersion); updateAssets(remoteAssets); } else { // 不需要更新 startGame(); } } // 更新资源 function updateAssets(remoteAssets) { let storagePath = (jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "/") + "remote-assets"; let am = new jsb.AssetsManager("", storagePath, (version, asset) => { // 下载进度回调 }); am.updateRemoteManifest(remoteAssets); am.checkUpdate(); } // 启动游戏 function startGame() { // ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值