還在用難用的AssetBundle?快來運用Unity新的可尋址資源系統,助力遊戲開發

Unity Addressables可尋址資源系統是一個強大的Unity資源包,它可以幫助解決遊戲開發中最重要的一些挑戰:高效率和輕鬆的內容管理dom

 

在管理遊戲資源時,每每很難維持好的標準,從而避免讓項目變得雜亂無章。最主要的問題在於不一樣職責的資源管理系統之間的耦合。並且,項目中資源的存儲,加載和載入後資源的使用方法都有緊密的聯繫。編輯器

例如:咱們可能要在Resources文件夾存儲某個精靈。這會讓Unity在構建版本時,把精靈存到特定的存檔文件中。因爲精靈存在了這樣的位置,咱們必須經過Resources API來加載該精靈。學習

 

項目變得混亂的速度比你想象的更快,一種方法的選擇將形成項目長期的結果。一個好的系統會避免咱們輕易犯下草率的錯誤,一個優秀的系統也會易於學習和使用。測試

 

經過使用Unity Addressables可尋址資源系統,咱們能夠將資源管理問題分離。咱們的目標是保持靈活性,同時讓項目具備可維護性。動畫

 

本文,咱們將介紹開發者使用Unity Addressables可尋址資源系統創做遊戲時,會得到的三個好處。ui

 

好處1:減小遊戲的內存壓力3d

在發佈遊戲時,大多數平臺都會讓開發者提供玩遊戲所需的最低硬件配置要求,以便玩家在購買時參考。blog

 

緣由很簡單:要求的硬件配置越高,購買遊戲的玩家會越少。而從另外一個角度看,實現的內存管理越好,咱們即可在遊戲提供更多內容和樂趣。遊戲

 

Unity Addressables可尋址資源系統的第一個好處即是:高效的內存管理ip

 

爲了大體瞭解其效果,咱們能夠把這些代碼:

public class CharacterCustomization : MonoBehaviour

{

    [SerializeField] private List<Material> _armorVariations;

    [SerializeField] private MeshRenderer _armorRenderer;



    public void ChangeArmorVariation(int variationId)

    {

        _armorRenderer.material = _armorVariations[variationId];

    }

}

轉化爲下面的代碼:

using UnityEngine.AddressableAssets;



public class CharacterCustomizationV2 : MonoBehaviour

{

    [SerializeField] private List<AssetReference> _armorVariations;

    [SerializeField] private MeshRenderer _armorRenderer;



    public IEnumerator ChangeArmorVariation(int variationId)

    {

        var loadProcess = _armorVariations[variationId].LoadAssetAsync();

        yield return loadProcess;

        _armorRenderer.material = loadProcess.Result;

    }

}

轉化後實現的效果以下圖所示,咱們能夠輕鬆節省內存使用。  

瞭解使用可尋址資源系統實現更好內存管理的內容,請閱讀:《使用Unity Addressables可尋址資源系統》。

 

好處2:輕鬆快捷地加入DLC內容

使用Unity Addressables的第二個好處:可讓開發者徹底控制存儲和加載遊戲資源,從而有助於開發者添加和出售可下載內容(DLC)

 

即便目前不考慮發佈DLC內容,只要在項目中使用Addressables系統,咱們就已經提早爲這項工做作好了準備。

 

咱們也有其它方法來出售DLC內容,例如:使用Asset Bundles,但這些方法在實現相同做用的同時,會帶來更高的開銷,所以這些方法會逐漸被棄用。維護正常運行的Asset Bundle管線很是消耗時間和精力,須要大量複雜的專業知識。

 

在Unity中有不少方法能夠實現DLC內容,但對於初學者來講,下面代碼是很好的學習起點:

public class DlcManager : MonoBehaviour

{

    // ...

    public IEnumerator TryDownloadDlc()

    {

        if (_hasBoughtDlc && _dlcDownloaded == false)

        {

            var operationHandle = Addressables.DownloadDependenciesAsync("DLC-Content");

            while (operationHandle.IsDone == false)

            {

                _progressText.text = $"{operationHandle.PercentComplete * 100.0f} %";

                yield return null;

            }

        }

    }

}

經過以上代碼,你應該瞭解其中的原理。咱們可以使用Unity Addressables,經過少許成本爲玩家帶來更多樂趣,何樂而不爲?

 

好處3:減小迭代時間

使用Unity Addressables會減小在多個過程的等待時間

 

咱們都體驗過按下Unity的Play按鈕後,等待約半分鐘的時間。若是把構建版本部署到移動平臺或WebGL平臺,那麼狀況還會更糟。這種等待時間會大幅增長迭代所花的時間。

 

任何玩家都不喜歡等待,Addressables系統會提供如下幫助:

 

減小構建大小

遊戲每每有不少內容,玩家喜歡體驗內容,而開發者喜歡創做內容,並將把遊戲內容提供給玩家。但這並不意味着,咱們創做的每一個資源都要包含在玩家安裝的構建版本中。實際上,咱們要儘量移除沒必要要的內容。

 

玩家都但願儘快開始玩遊戲。若是遊戲須要2GB的數據流量,以及半小時的下載時間,玩家會對此感到不滿。這樣,玩家可能會更傾向於下載《Candy Crush》這類大小低於50MB的遊戲。

 

其中一種應對策略是:只在安裝程序包含主菜單等運行遊戲所需的資源,而後在後臺下載剩餘遊戲內容,首先要下載的是遊戲的關卡內容。

 

這也會使開發期間的部署速度變得更快。咱們將可以天天迭代更屢次數,這個好處會在長期時間中累積效果。

  

 

減小加載時間

做爲遊戲開發者和玩家,咱們都討厭等待。等待會讓咱們失去玩遊戲的狀態,咱們的遊戲時間可能在不經意間就結束了。

 

Unity正在努力經過改善編輯器和遊戲的發佈方式,減小玩家開始玩遊戲的時間。將來有不少值得期待的功能,例如:Unity 2019.3中避免域重載(domain reloads)的功能很值得期待,但現在它仍處於Beta版。

 

假設咱們正在開發中世紀題材的遊戲。數月前,咱們爲遊戲實現了護甲類型。開發過程很是順利,咱們生成了超過100MB的遊戲內容。

 

接下來,咱們繼續開發其它內容,例如:刀劍對決。咱們發現,每次按下Play按鈕測試功能時,都會從已開發功能中加載大量數據,並且加載這些數據也須要大量時間

 

按下Play按鈕測試「刀劍對決」的動畫時,因爲要加載以前實現的護甲功能,咱們會額外等待5秒時間。因爲內存帶寬有限,所以加載過程耗費的時間大多發生在I/O過程當中。此外,CPU也要對該過程進行處理。

 

做爲開發者,咱們會在Unity編輯器中耗費相應的時間。而玩家則要在已發佈的遊戲中等待更多時間。

 

瞭解到這個狀況帶來的影響後,咱們要使用什麼方法解決該問題呢?

 

Unity Addressables可以經過兩種方法幫助咱們。

1

減小玩家的加載時間 

咱們能夠減小玩家的等待時間。使用資源的間接引用而不是直接引用,這樣會大幅改善加載時間。

 

經過使用間接引用,即AssetReference,Unity不會同時加載全部內容,而只在必要時加載部份內容。更重要的是,咱們能夠直接控制加載內容的時間。

 

2

減小Unity編輯器上的迭代時間  

你對Unity Addressables窗口中的Play Mode Script有多少了解呢?Play Mode Script會定義Unity編輯器如何加載標記Addressable的資源。

 

選中Packed Play Mode,Unity會直接加載預構建的可尋址資源,僅使用少許處理開銷,從而有效減小Unity編輯器中的迭代時間。

 

使用該功能前,請記得先點擊Build Player Content來構建玩家內容。

咱們能夠試想一下,把這些方法應用到最急需的內容時會產生怎樣的效果。

 

小結 

本文,咱們瞭解了Unity Addressables可以幫助進行更好的創做,並給玩家提供更多內容。 咱們將從中受益,讓項目在將來數月或來年獲得提高。

相關文章
相關標籤/搜索