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

Unity Addressables熱更流程

這篇具有很好參考價(jià)值的文章主要介紹了Unity Addressables熱更流程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、分組(網(wǎng)上教程一大堆)

二、構(gòu)建

? ? ? ? 構(gòu)建前設(shè)置:

? ? ? ? ? ? ? ? 1、分組設(shè)置。所有組做遠(yuǎn)端構(gòu)建加載選擇,RemoteBuildPath 。RemoteLoadPath

????????????????Unity Addressables熱更流程?

? ? ? ? ? ? ? ? 2、AddressableAssetSettings設(shè)置

Unity Addressables熱更流程

? ? ? ? ?3、構(gòu)建

????????????????Unity Addressables熱更流程

?三、導(dǎo)出信息分析:

? ? ? ? 1、Assets同級(jí)目錄下,ServerData內(nèi),包含所有所需文件。

? ? ? ? 2、對(duì)應(yīng)平臺(tái)下。catalog.hash和catalog.json為版本檢測(cè)和資源記錄文件。其他為AB包。

? ? ? ? 3、Assets/AddressableAssetsData/Android下為熱更記錄文件,打熱更包所需。

四、打熱更包:

????????Unity Addressables熱更流程

? ? ? ? 選擇上述三、3的文件。更新后ServerData下catalog和修改的AB發(fā)生變化。

五、地址重定向:

Addressables.ResourceManager.InternalIdTransformFunc = LoadFunc;

public static bool CustomNet { get; private set; }
    public static string VersionURL;
    public static string AddressURL;
    private static string OldUrl = "http://localhost/";
    /// <summary>
    /// 設(shè)置熱更地址
    /// </summary>
    /// <param name="_versionUrl">版本地址</param>
    /// <param name="_addressUrl">資源地址</param>
    public static void SetCustomAddress(string _versionUrl, string _addressUrl)
    {
        CustomNet = true;
        VersionURL = _versionUrl;
        AddressURL = _addressUrl;
#if UNITY_EDITOR
        UnityEngine.Debug.Log("設(shè)置版本地址:" + VersionURL);
        UnityEngine.Debug.Log("設(shè)置資源地址地址:" + AddressURL);
#endif
        Addressables.ResourceManager.InternalIdTransformFunc = LoadFunc;
    }

    private static string LoadFunc(IResourceLocation location)
    {
        if (location.ResourceType == typeof(IAssetBundleResource) && location.InternalId.StartsWith("http"))
        {
            string abAddress = location.InternalId.Replace(OldUrl, AddressURL);
            return abAddress;   
        }
        return location.InternalId;
    }

?六、熱更,創(chuàng)建服務(wù)器,把ServerData/Android放上去。即可熱更。

? ? ? ? 1、熱更下載的catalog文件在?Application.persistentDataPath

? ? ? ? 2、下載的AB資源在 :C:\Users\Administrator\AppData\LocalLow\Unity

七、熱更檢測(cè)代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-497901.html

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.AddressableAssets.ResourceLocators;
using UnityEngine.Networking;

public class Updater : MonoBehaviour
{
    public enum HotState
    {
        None,
        Version,
        Hash,
        Json,
        Download,
        StopDownload,
    }
    private HotState m_HotState = HotState.None;
    [SerializeField]
    public bool Hot = true;
    //多平臺(tái)版本檢測(cè) -> 地址 
    [SerializeField]
    public string VersionURL = "CDN地址";
    [SerializeField]
    public string Catalog = "catalog";
    // 拉取CDN地址錯(cuò)誤
    public System.Action<string> FirstAddressError;
    // 拉取hash版本地址錯(cuò)誤
    public System.Action<string> VerionCheckError;
    // 拉取json版本地址錯(cuò)誤
    public System.Action<string> VerionUpdateError;
    // 得到下載大小回調(diào)
    public System.Action<long> ResourceSize;
    // 下載進(jìn)度回調(diào)
    public System.Action<float> DowonloadPercent;
    // 斷網(wǎng)回調(diào)
    public System.Action DisconnectNet;
    // 重新聯(lián)網(wǎng)回調(diào)
    public System.Action ReconnectNet;
    public static Updater Instance;
    private readonly List<object> _updateKeys = new List<object>();
    private IEnumerator IDownLoad;
    private NetworkReachability LastNet;
    private void Awake()
    {
        LastNet = Application.internetReachability;
        Instance = this;
#if UNITY_EDITOR
        if (!Hot) // 動(dòng)態(tài)設(shè)置分組模式
        {
        }
#endif
    }
    private void Start()
    {
        if (!Hot)
            EnterGame();
        else
            StartCoroutine(SetAddress());
    }
    private IEnumerator SetAddress()
    {
        m_HotState = HotState.Version;
        if (Application.internetReachability == NetworkReachability.NotReachable)
        {
            DisconnectNet?.Invoke();
            yield break;
        }
        UnityWebRequest request = UnityWebRequest.Post(VersionURL, "");
        yield return request.SendWebRequest();
        if (request.isHttpError || request.error != null)
        {
            FirstAddressError?.Invoke(request.error);
            Debug.LogError("配置地址出錯(cuò):" + request.error);
            yield break;
        }
        else
        {
            string datas = request.downloadHandler.text;
            CDNAddress CDN = JsonUtility.FromJson<CDNAddress>(datas);
            string url = CDN.GetGetAddressURL();
            Debug.Log("CDN :" + url);
            url = "http://192.168.11.51:8089/";
            AddressablesExt.SetCustomAddress(url + Catalog + ".hash", url);
        }
        StartCoroutine(DoUpdateAddressadble());
    }
    IEnumerator DoUpdateAddressadble()
    {
        m_HotState = HotState.Hash;
        if (Application.internetReachability == NetworkReachability.NotReachable)
        {
            DisconnectNet?.Invoke();
            yield break;
        }
        AsyncOperationHandle<IResourceLocator> initHandle = Addressables.InitializeAsync();
        yield return initHandle;
        //檢測(cè)更新
        AsyncOperationHandle<List<string>> checkHandle = Addressables.CheckForCatalogUpdates(false);
        yield return checkHandle;
        if (checkHandle.Status != AsyncOperationStatus.Succeeded)
        {
            VerionCheckError?.Invoke(checkHandle.OperationException.ToString());
            Debug.LogError("版本檢測(cè)失敗:" + checkHandle.OperationException.ToString());
            yield break;
        }
        if (checkHandle.Result.Count > 0)
        {
            m_HotState = HotState.Json;
            AsyncOperationHandle<List<IResourceLocator>> updateHandle = Addressables.UpdateCatalogs(checkHandle.Result, false);
            yield return updateHandle;
            if (updateHandle.Status != AsyncOperationStatus.Succeeded)
            {
                Debug.LogError("版本更新失敗:" + updateHandle.OperationException.ToString());
                VerionUpdateError?.Invoke(updateHandle.OperationException.ToString());
                yield break;
            }
            // 更新列表迭代器
            List<IResourceLocator> locators = updateHandle.Result;
            foreach (var locator in locators)
            {
                _updateKeys.AddRange(locator.Keys);
                // key 里一堆亂七八糟的東西  
            }
            Addressables.Release(checkHandle);
            Addressables.Release(updateHandle);
        }
        else //版本已經(jīng)更新過(guò)的,采用這種方式
        {
            IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators;
            foreach (var locator in locators)
            {
                _updateKeys.AddRange(locator.Keys);
                // key 里一堆亂七八糟的東西  
            }
        }
        AsyncOperationHandle<long> sizeHandle = Addressables.GetDownloadSizeAsync(_updateKeys as IEnumerable<object>);
        yield return sizeHandle;
        Debug.Log("熱更資源總大小:" + NetFormat.GetDisplaySize(sizeHandle.Result));
        if (sizeHandle.Result > 0)
        {
            ResourceSize?.Invoke(sizeHandle.Result);
            StartDownLoad();
        }
        else
        {
            Debug.Log("沒(méi)有檢測(cè)到更新 - 無(wú)需下載");
            EnterGame();
        }
        Addressables.Release(sizeHandle);
    }
    public void StartDownLoad()
    {
        IDownLoad = DownLoad();
        StartCoroutine(IDownLoad);
    }
    private void StopDownLoad()
    {
        m_HotState = HotState.StopDownload;
        StopCoroutine(IDownLoad);
    }
    private void Update()
    {
        if (Application.internetReachability != LastNet)
        {
            switch (Application.internetReachability)
            {
                case NetworkReachability.NotReachable:
                    if (m_HotState == HotState.Download)
                    {
                        StopDownLoad();
                    }
                    DisconnectNet?.Invoke();
                    Debug.LogError("網(wǎng)絡(luò)鏈接未打開(kāi)");
                    break;
                case NetworkReachability.ReachableViaCarrierDataNetwork:
                case NetworkReachability.ReachableViaLocalAreaNetwork:
                    ReconnectNet?.Invoke();
                    TryAgin();
                    Debug.Log("流量 OR  WIFI");
                    break;
                default:
                    break;
            }
            LastNet = Application.internetReachability;
        }
    }
    public void TryAgin()
    {
        Debug.Log(m_HotState);
        switch (m_HotState)
        {
            case HotState.None:
                break;
            case HotState.Version:
                StartCoroutine(SetAddress());
                break;
            case HotState.Hash:
            case HotState.Json:
                StartCoroutine(DoUpdateAddressadble());
                break;
            case HotState.Download:
                StartDownLoad();
                break;
            case HotState.StopDownload:
                StartDownLoad();
                break;
            default:
                break;
        }
    }
    public HotState GetHotState()
    {
        return m_HotState;
    }
    public void Quit()
    {
        Application.Quit();
    }
#if UNITY_EDITOR
    [UnityEditor.MenuItem("AATool/PrintState")]
    private static void PrnitState()
    {
        Debug.LogError(Instance.m_HotState);
    }
#endif
    private IEnumerator DownLoad()
    {
        m_HotState = HotState.Download;
        if (Application.internetReachability == NetworkReachability.NotReachable)
        {
            DisconnectNet?.Invoke();
            yield break;
        }
        AsyncOperationHandle downHandle = Addressables.DownloadDependenciesAsync(_updateKeys as IEnumerable<object>, Addressables.MergeMode.Union, false);
        while (!downHandle.IsDone)
        {
            float _bar = downHandle.GetDownloadStatus().Percent;
            DowonloadPercent?.Invoke(downHandle.GetDownloadStatus().Percent);
            UnityEngine.Debug.Log(_bar);
            yield return null;
        }
        yield return downHandle;
        if (downHandle.Status != AsyncOperationStatus.Succeeded)
        {
            Debug.LogError("下載失敗 - 重新嘗試下載");
            StartDownLoad();
            Addressables.Release(downHandle);
            yield break;
        }
        else
        {
            Addressables.Release(downHandle);
            // 進(jìn)入游戲
            EnterGame();
        }
    }
    // 進(jìn)入游戲
    void EnterGame()
    {
        // TODO
        Debug.Log("進(jìn)入游戲");
        RootTools.MainScript.GetOrAddComponent<GameRoot>();
        Object.Destroy(gameObject);
    }
    private void OnApplicationQuit()
    {

    }
    private void OnApplicationFocus(bool focus)
    {

    }
}

到了這里,關(guān)于Unity Addressables熱更流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Unity Addressables資源管理 主設(shè)置面板

    Unity Addressables資源管理 主設(shè)置面板

    Addressables資源管理總目錄 位置1 位置2 ? ? 這個(gè)是全局路徑配置的選擇 可以點(diǎn)擊 Manager Profiles 打開(kāi)路徑配置面板 打包路徑設(shè)置 ? Send Profiler Events ?打開(kāi)這個(gè)選項(xiàng),才能在Event Viewer窗口看到資源的事件 Log Runtime Exceptions ?記錄運(yùn)行時(shí)的異常日志 ? 默認(rèn)情況下Addressables只記錄警告

    2024年02月13日
    瀏覽(28)
  • Unity Addressables資源管理 安裝和使用本地加載

    Unity Addressables資源管理 安裝和使用本地加載

    Addressables資源管理總目錄 1.安裝 打開(kāi)Unity內(nèi)置的 PackagerManager窗口 搜索Add即可找到 安裝版本為1.19.19 2.添加Group 點(diǎn)擊 Group 菜單 打開(kāi)窗口 點(diǎn)擊 Create Addressables Settings 創(chuàng)建可尋址設(shè)置 Assets下會(huì)生成一個(gè)? AddressableAssetsData 文件夾 其中可以看見(jiàn)面板中的? Default Local Group ?默認(rèn)組 資

    2023年04月13日
    瀏覽(29)
  • Unity Addressables學(xué)習(xí)筆記(3)---加載遠(yuǎn)程場(chǎng)景Scenes

    Unity Addressables學(xué)習(xí)筆記(3)---加載遠(yuǎn)程場(chǎng)景Scenes

    我是創(chuàng)建在Resources/Scenes目錄下,如圖: Game1Group就是我新創(chuàng)建的一個(gè)Group用來(lái)存放場(chǎng)景1的所有資源,分組的配置跟Remote一樣,都是遠(yuǎn)程的,加載地址是我本地啟動(dòng)的web服務(wù)器地址,URL里WebGL那個(gè)目錄也不是必須的,根據(jù)自己實(shí)際的來(lái)。 上邊的圖就是拖完的狀態(tài)。 我是在最開(kāi)始

    2024年01月25日
    瀏覽(29)
  • Unity_熱更方案

    熱更是指在游戲已經(jīng)發(fā)布和運(yùn)行后,仍然能夠更新游戲內(nèi)容、修復(fù)錯(cuò)誤或添加新功能 具體的來(lái)說(shuō)有幾種方法可以實(shí)現(xiàn): 這種方法比較基礎(chǔ),但對(duì)于一些小型項(xiàng)目或原型來(lái)說(shuō),是一種有效的熱更方式 這是之前比較通用的一種方法 Lua熱更是針對(duì)腳本的更新,需要有一個(gè)穩(wěn)定的熱

    2024年02月07日
    瀏覽(20)
  • Unity Addressables學(xué)習(xí)筆記(1)---創(chuàng)建遠(yuǎn)程服務(wù)器加載資源

    Unity Addressables學(xué)習(xí)筆記(1)---創(chuàng)建遠(yuǎn)程服務(wù)器加載資源

    Unity Addressables學(xué)習(xí)筆記—匯總 Bulid Path選擇RemoteBuildPath Load Path我選擇了custom,地址是http://localhost:8080/WebGL/ 遇坑1 :最開(kāi)始我選擇的Build Path 是 LocalBuildPath,Load Path是custom的時(shí)候報(bào)錯(cuò)如下: 解決辦法:把Build Path 改為RemoteBuildPath后才好,我也不知道為什么不能把本地的資源放到遠(yuǎn)程

    2024年02月14日
    瀏覽(25)
  • 【Unity實(shí)戰(zhàn)】HybridCLR熱更快速集成

    【Unity實(shí)戰(zhàn)】HybridCLR熱更快速集成

    本文假設(shè)你已經(jīng)通過(guò)UPM導(dǎo)入了HybridCLR、Addressables、il2cpp支持并具有一定的C#基礎(chǔ)和Unity編輯器操作能力。 由于本文主打快速集成,故將Assembly-CSharp劃入到熱更新DLL。 理論上成熟的項(xiàng)目應(yīng)該用Assembly Definition進(jìn)行精細(xì)劃分以便于管理和縮短編譯時(shí)間。但是若掌握不好,劃分不明白

    2024年02月03日
    瀏覽(28)
  • Unity AssetBundle資源熱更插件

    Unity AssetBundle資源熱更插件

    取消 IsEditorMode 勾選: 采用AssetBundle的方式加載游戲內(nèi)的資源 激活 IsEditorMode 勾選: 使用AssetDatabase.LoadAssetAtPath的方式加載 僅Editor 溫馨提示: IsEditorMode 受到宏限制 如果你非 UNITY_EDITOR模式下 ( 當(dāng)年在真機(jī)的時(shí)候 ) IsEditorMode強(qiáng)制為False 避免用戶打包后忘記關(guān)了 新建一個(gè)AssetBundl

    2024年02月11日
    瀏覽(27)
  • Unity熱更模塊基于 HybridCLR + Addressable

    Unity熱更模塊基于 HybridCLR + Addressable

    代碼地址: GitHub - ManoKing/FFramework: 基于HybridCLR + Addressable的熱更新框架,提供例子基于QFramework+URP開(kāi)發(fā) 基于HybridCLR + Addressable的熱更新框架,提供例子基于QFramework+URP開(kāi)發(fā) - GitHub - ManoKing/FFramework: 基于HybridCLR + Addressable的熱更新框架,提供例子基于QFramework+URP開(kāi)發(fā) https://github.

    2023年04月14日
    瀏覽(22)
  • Unity使用 Addressables 預(yù)加載所有資源,提現(xiàn)加載資源,發(fā)布webgl加載緩慢問(wèn)題

    Unity使用 Addressables 預(yù)加載所有資源,提現(xiàn)加載資源,發(fā)布webgl加載緩慢問(wèn)題

    Addressables 我也是剛接觸,知道的不是很多,基本的用法還是知道一些的 1 .在Window–Package Manager里找到Addressables進(jìn)行安裝 ? 2.選擇資源,點(diǎn)擊Assets中的一個(gè)資源,在Inspector面板上就會(huì)出現(xiàn)一個(gè)勾選Assressable,也就是是否加入資源打包的分組,和AssetBundle分組是一個(gè)性質(zhì)。選上以

    2023年04月08日
    瀏覽(27)
  • Unity使用TextMeshPro多字體和材質(zhì)熱更

    最近Unity項(xiàng)目中使用到TextMeshPro做聊天,需要支持部分字體帶描邊,部分字體不帶描邊。想到的決解方案是:TextMeshPro支持多字體展示(具體可以查看組件的官方案例Link Example),就做了兩個(gè)字體一個(gè)是帶描邊的一個(gè)是不帶描邊的。 但是有個(gè)問(wèn)題是多出來(lái)的一個(gè)字體需要放在

    2024年02月16日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包