国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[游戲開發(fā)][Unity]Assetbundle下載篇(1)熱更前準備與下載AB包清單

這篇具有很好參考價值的文章主要介紹了[游戲開發(fā)][Unity]Assetbundle下載篇(1)熱更前準備與下載AB包清單。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

打包與資源加載框架目錄

正文

熱更流程都不是固定的,每個人寫的狀態(tài)機也有所差別,但是一些必要步驟肯定不可能少,例如下載清單,對比版本,下載AB包,標記下載完成。我接下來的每一篇文章都是下載AB包的重要步驟,大概率是不能省略的。

檢查沙盒路徑是否存在

public static string MakePersistentLoadPath(string path)
{
#if UNITY_EDITOR
        // 注意:為了方便調(diào)試查看,編輯器下把存儲目錄放到項目里
        string projectPath = Path.GetDirectoryName(Application.dataPath).Replace("\\","/");
        projectPath = GetRegularPath(projectPath);
        return StringFormat.Format("{0}/Sandbox/{1}", projectPath, path);
#else
        return StringFormat.Format("{0}/Sandbox/{1}", Application.persistentDataPath, path);
#endif
}

檢查下載臨時目錄是否存在

請注意,熱更時下載AB包先下載到臨時目錄,之后再拷貝到沙盒目錄

public static string MakeDownloadTempPath(string path)
{
#if UNITY_EDITOR
    string projectPath = Path.GetDirectoryName(Application.dataPath).Replace("\\", "/");
    projectPath = GetRegularPath(projectPath);
    return StringFormat.Format("{0}/Sandbox_Temp/{1}", projectPath, path);
#else
    return StringFormat.Format("{0}/Sandbox_Temp/{1}", Application.persistentDataPath, path);
#endif
}

路徑都確認存在后,開始下載


前文有介紹過,生成的AB包清單長這個樣子,把這個文件生成二進制bytes文件扔到服務(wù)器上去下載。

[游戲開發(fā)][Unity]Assetbundle下載篇(1)熱更前準備與下載AB包清單,項目管理,unity,游戲開發(fā),Powered by 金山文檔

第一行是SVN版本號

第二行是AB包數(shù)量

從第三行開始是資源包信息,以=號分割開有效數(shù)據(jù),分別是

MD5.unity3d = 資源路徑 = 資源路徑的HashId = 包體KB大小 = SVN版本號 = 啟動熱更模式

每一行數(shù)據(jù)封裝了一個PatchElement類,代碼在下文中

我們項目封裝了一下UnityWebRequest,叫WebDataRequest,你不想封裝直接用UnityWebRequest即可,WebDataRequest代碼在后面有。

private IEnumerator DownLoad()
{
    // 解析APP里的補丁清單
    string filePath = AssetPathHelper.MakeStreamingLoadPath(PatchDefine.InitManifestFileName);
    string url = AssetPathHelper.ConvertToWWWPath(filePath);
    using (WebDataRequest downloader = new WebDataRequest(url))
    {
        yield return downloader.DownLoad();
        if (downloader.States == EWebRequestStates.Success) 
        {
            PatchHelper.Log(ELogLevel.Log, "Parse app patch manifest.");
            ParseAppPatchManifest(downloader.GetData());
        }
        else
        {
            throw new System.Exception($"Fatal error : Failed download file : {url}");
        }
    }
}

// 解析補丁清單文件相關(guān)接口
public void ParseAppPatchManifest(byte[] data)
{
    if (AppPatchManifest != null)
        throw new Exception("Should never get here.");
    AppPatchManifest = new PatchManifest(true);
    AppPatchManifest.Parse(data);
}

PatchManifest類是一個專門解析AB包清單的類,看代碼也能知道,Parse方法的最終目的,就是把清單的每一行數(shù)據(jù)解析成PatchElement然后加入到字典中存起來等著下載時調(diào)用

/// <summary>
/// 補丁清單文件
/// </summary>
public class PatchManifest
{
    private bool _isParse = false;

    /// <summary>
    /// 資源版本號
    /// </summary>
    public int DllVersion { private set; get; }
    public int ResVersion { private set; get; }
    private bool IsInit = false;

    /// <summary>
    /// 所有打包文件列表
    /// </summary>
    public readonly Dictionary<string, PatchElement> Elements = new Dictionary<string, PatchElement>();

    public PatchManifest(bool isInit = false)
    {
        IsInit = isInit;
    }

    /// <summary>
    /// 解析數(shù)據(jù)
    /// </summary>
    public void Parse(byte[] data)
    {
        using (var ms = new MemoryStream(data))
        {
            using(var br = new BinaryReader(ms))
            {
                Parse(br);
            }
        }
    }

    public void ParseFile(string filePath)
    {
        using (var fs = File.OpenRead(filePath))
        {
            using (var br = new BinaryReader(fs))
            {
                Parse(br);
            }
        }
    }

    /// <summary>
    /// 解析數(shù)據(jù)
    /// </summary>
    public void Parse(BinaryReader br)
    {
        if (br == null)
            throw new Exception("Fatal error : Param is null.");
        if (_isParse)
            throw new Exception("Fatal error : Package is already parse.");

        _isParse = true;

        // 讀取版本號            
        DllVersion = br.ReadInt32();
        ResVersion = br.ReadInt32();

        GameVersion.PatchResDesc = ResVersion + "   dllVer:" + DllVersion;
        int fileCount = br.ReadInt32();
        // 讀取所有Bundle的數(shù)據(jù)
        for(var i = 0; i < fileCount; i++)
        {
            var ele = PatchElement.Deserialize(br, IsInit);
            if (Elements.ContainsKey(ele.Name))
                throw new Exception($"Fatal error : has same pack file : {ele.Name}");
            Elements.Add(ele.Name, ele);
        }
    }
}

PatchElement是AB包清單每一行數(shù)據(jù)的封裝,PatchManifest的Parse里會循環(huán)創(chuàng)建一個Elements字典保存這些數(shù)據(jù)。

public class PatchElement
{
    /// <summary>
    /// 文件名稱
    /// </summary>
    public string Name { private set; get; }

    /// <summary>
    /// 文件MD5
    /// </summary>
    public string MD5 { private set; get; }

    /// <summary>
    /// 文件版本
    /// </summary>
    public int Version { private set; get; }

    /// <summary>
    /// 文件大小
    /// </summary>
    public long SizeKB { private set; get; }

    /// <summary>
    /// 構(gòu)建類型
    /// buildin 在安裝包中
    /// ingame  游戲中下載
    /// </summary>
    public string Tag { private set; get; }

    /// <summary>
    /// 是否是安裝包內(nèi)的Patch
    /// </summary>
    public bool IsInit { private set; get; }

    /// <summary>
    /// 下載文件的保存路徑
    /// </summary>
    public string SavePath;

    /// <summary>
    /// 每次更新都會先下載到Sandbox_Temp目錄,防止下到一半重啟導(dǎo)致邏輯不一致報錯
    /// temp目錄下的文件在重新進入更新流程時先校驗md5看是否要跳過下載
    /// </summary>
    public bool SkipDownload { get; set; }


    public PatchElement(string name, string md5, int version, long sizeKB, string tag, bool isInit = false)
    {
        Name = name;
        MD5 = md5;
        Version = version;
        SizeKB = sizeKB;
        Tag = tag;
        IsInit = isInit;
        SkipDownload = false;
    }

    public void Serialize(BinaryWriter bw)
    {
        bw.Write(Name);
        bw.Write(MD5);
        bw.Write(SizeKB);
        bw.Write(Version);
        if (IsInit)
            bw.Write(Tag);
    }

    public static PatchElement Deserialize(BinaryReader br, bool isInit = false)
    {
        var name = br.ReadString();
        var md5 = br.ReadString();
        var sizeKb = br.ReadInt64();
        var version = br.ReadInt32();
        var tag = EBundlePos.buildin.ToString();
        if (isInit)
            tag = br.ReadString();
        return new PatchElement(name, md5, version, sizeKb, tag, isInit);
    }
}

下面是下載數(shù)據(jù)封裝,本質(zhì)還是 UnityWebRequest文章來源地址http://www.zghlxwxcb.cn/news/detail-557554.html

public class WebDataRequest : WebRequestBase, IDisposable
{
    public WebDataRequest(string url) : base(url)
    {
    }
    public override IEnumerator DownLoad()
    {
        // Check fatal
        if (States != EWebRequestStates.None)
            throw new Exception($"{nameof(WebDataRequest)} is downloading yet : {URL}");

        States = EWebRequestStates.Loading;

        // 下載文件
        CacheRequest = new UnityWebRequest(URL, UnityWebRequest.kHttpVerbGET);
        DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
        CacheRequest.downloadHandler = handler;
        CacheRequest.disposeDownloadHandlerOnDispose = true;
        CacheRequest.timeout = Timeout;
        yield return CacheRequest.SendWebRequest();

        // Check error
        if (CacheRequest.isNetworkError || CacheRequest.isHttpError)
        {
            MotionLog.LogWarning($"Failed to download web data : {URL} Error : {CacheRequest.error}");
            States = EWebRequestStates.Fail;
        }
        else
        {
            States = EWebRequestStates.Success;
        }
    }

    public byte[] GetData()
    {
        if (States == EWebRequestStates.Success)
            return CacheRequest.downloadHandler.data;
        else
            return null;
    }
    public string GetText()
    {
        if (States == EWebRequestStates.Success)
            return CacheRequest.downloadHandler.text;
        else
            return null;
    }
}

到了這里,關(guān)于[游戲開發(fā)][Unity]Assetbundle下載篇(1)熱更前準備與下載AB包清單的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • [游戲開發(fā)][Unity]Assetbundle打包與資源加載框架

    我會分三個篇章寫整個框架分別是: AB打包篇 AB下載篇 AB加載篇 整個框架內(nèi)容比較多,屬于企業(yè)級方案,涉及到增量打包、打包策略、AB包下載、邊玩邊下、資源管理系統(tǒng),資源加載系統(tǒng)等功能。 Unity小白看本系列文章可能比較吃力。如果我哪里寫的不好,影響理解了,歡迎

    2024年02月13日
    瀏覽(33)
  • [游戲開發(fā)][Unity]Assetbundle打包篇(1)打包流程介紹

    [游戲開發(fā)][Unity]Assetbundle打包篇(1)打包流程介紹

    打包與資源加載框架目錄 先捋一下打AB包的整體思路,首先,Unity4.6版本之后就使用了全新的打包接口 無論是全新打包還是增量打包都是使用這個API,所以一切的一切,都要圍繞這個API開始講起。 該API有四個參數(shù) string outputPath AssetBundleBuild[] builds BuildAssetBundleOptions assetBundle

    2024年02月10日
    瀏覽(29)
  • [游戲開發(fā)][Unity]Assetbundle打包篇(2)打包資源配置篇

    [游戲開發(fā)][Unity]Assetbundle打包篇(2)打包資源配置篇

    打包與資源加載框架目錄 可視化配置的方式有很多種,Json、XML、以及Unity內(nèi)置的ScriptableObject序列化 配置文件里要有哪些內(nèi)容呢,很顯然,最重要的就是目標文件路徑,其次是權(quán)重類型,權(quán)重類型有:必要打包型、被引用打包型、忽略類型。為何會有忽略類型呢,是因為我們

    2024年02月09日
    瀏覽(52)
  • [游戲開發(fā)][Unity]Assetbundle打包篇(5)使用Manifest二次構(gòu)建資源索引

    [游戲開發(fā)][Unity]Assetbundle打包篇(5)使用Manifest二次構(gòu)建資源索引

    打包與資源加載框架目錄 正文開始前,先把打包代碼放過來,請注意,前面的代碼已省略,自己去對比前面的文章。本篇文章從第一次執(zhí)行打包代碼開始。 第一次調(diào)用BuildPipeline.BuildAssetBundles打包API后(詳見代碼第七行),會返回AssetBundleManifest的引用, 【疑問】: BuildPipe

    2024年02月03日
    瀏覽(23)
  • 【游戲提取/超詳細記錄向】關(guān)于unity游戲的資源提取所需資源及方法簡介(AssetBundle及l(fā)ibil2cpp.so等解密)

    方法一 :AssetStudio提?。▋H針對ab包及.assets、.boundle和.unity3d未加密的情況下) 1.在我們拿到一個游戲的安裝包時,首先會疑惑如何打開。下載bandzip Bandizip · Free zip, 7z, unzip, unrar Archiver · Fast and easy ,這是一款非常方便的解壓縮工具。安裝后右鍵apk-壓縮文件預(yù)覽,即可打開

    2023年04月15日
    瀏覽(33)
  • Unity 從服務(wù)器加載AssetBundle資源寫入本地內(nèi)存,并將下載保存的AB資源從本地內(nèi)存加載至場景

    AB資源打包后有一個【目錄文件】AssetBundle,他保存了所有AB資源的路徑與名稱, 通過aLLAssetBundleURL鏈接路徑 組拼 從【目錄文件】獲得的AB資源的名字,然后再協(xié)程方法內(nèi)編寫相關(guān)代碼,從而實現(xiàn)從服務(wù)器加載資源的功能。詳細見代碼。

    2024年02月13日
    瀏覽(23)
  • 【Unity】Unity開發(fā)微信小游戲(一)準備和了解工作

    【Unity】Unity開發(fā)微信小游戲(一)準備和了解工作

    0.Unity小游戲版本 如不使用此版本,則無法搜索到 InstantGame package 1.Unity插件:InstantGame package 此插件用于處理項目中的貼圖、音頻、網(wǎng)格、動畫、場景等資源文件,保證小程序包體不會過大。 插件可以關(guān)聯(lián)UOS服務(wù),通過面板自動上傳。 運行小程序后自動加載,不需要編寫代碼

    2024年02月04日
    瀏覽(41)
  • unity的學(xué)習(xí),準備搞一款mmo小游戲,服務(wù)器和客戶端從零學(xué)

    unity的學(xué)習(xí),準備搞一款mmo小游戲,服務(wù)器和客戶端從零學(xué)

    先學(xué)一下unity,mmo服務(wù)器框架到時候在學(xué)習(xí)一下,暫時服務(wù)器簡單做一下 如代碼所示,簡單了解一下。 我個人感覺不要一個放在Awake函數(shù)中,一個放在Start中。因為這只適合兩個腳本使用,如果多個腳本還是沒有辦法解決腳本執(zhí)行的順序。在這里設(shè)置腳本的執(zhí)行順序,添加進

    2023年04月21日
    瀏覽(26)
  • 為虛幻引擎開發(fā)者準備的Unity指南

    為虛幻引擎開發(fā)者準備的Unity指南

    Unity 是全球使用最廣泛的實時 3D 引擎,能夠為所有開發(fā)者提供高質(zhì)量的創(chuàng)作體驗。 本文針對想要轉(zhuǎn) Unity 的虛幻引擎開發(fā)者,提供了詳細的教程指引,幫助開發(fā)者快速熟悉 Unity 引擎。利用 Unity 引擎創(chuàng)作出高畫質(zhì)、低能耗的優(yōu)質(zhì)內(nèi)容,并跨平臺發(fā)布到任意主流平臺,包括 App

    2024年02月04日
    瀏覽(35)
  • 【Unity使用addressables制作資源熱更+實時動態(tài)熱更基本記錄】

    【Unity使用addressables制作資源熱更+實時動態(tài)熱更基本記錄】

    一、Addressables基礎(chǔ)操作教程 1、下載Addressables插件 點擊菜單Window / Package Manager,打開插件包管理界面,搜索addressables Addressables的打包方式其實也是AssetBundle格式,只是在此基礎(chǔ)上做了一層封裝,方便進行管理(比如打包、加載、依賴等)。而我們知道,沒有加密的AssetBundle是

    2024年02月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包