Unity Addressables可尋址資源系統(tǒng)是一個強大的Unity資源包,它能夠幫助解決游戲開發(fā)中最重要的一些挑戰(zhàn):高效率和輕松的內(nèi)容管理闰歪。
在管理游戲資源時,往往很難維持好的標(biāo)準(zhǔn)蓖墅,從而避免讓項目變得雜亂無章库倘。最主要的問題在于不同職責(zé)的資源管理系統(tǒng)之間的耦合。而且论矾,項目中資源的存儲教翩,加載和載入后資源的使用方法都有緊密的聯(lián)系。
例如:我們可能要在Resources文件夾存儲某個精靈贪壳。這會讓Unity在構(gòu)建版本時饱亿,把精靈存到特定的存檔文件中。由于精靈存在了這樣的位置闰靴,我們必須通過Resources API來加載該精靈彪笼。
項目變得混亂的速度比你想象的更快,一種方法的選擇將造成項目長期的結(jié)果蚂且。一個好的系統(tǒng)會避免我們輕易犯下草率的錯誤配猫,一個優(yōu)秀的系統(tǒng)也會易于學(xué)習(xí)和使用。
通過使用Unity Addressables可尋址資源系統(tǒng)膘掰,我們可以將資源管理問題分離章姓。我們的目標(biāo)是保持靈活性,同時讓項目具有可維護性识埋。
本文凡伊,我們將介紹開發(fā)者使用Unity Addressables可尋址資源系統(tǒng)創(chuàng)作游戲時,會獲得的三個好處窒舟。
好處1:減少游戲的內(nèi)存壓力
在發(fā)布游戲時系忙,大多數(shù)平臺都會讓開發(fā)者提供玩游戲所需的最低硬件配置要求,以便玩家在購買時參考惠豺。
原因很簡單:要求的硬件配置越高银还,購買游戲的玩家會越少。而從另一個角度看洁墙,實現(xiàn)的內(nèi)存管理越好蛹疯,我們便可在游戲提供更多內(nèi)容和樂趣。
Unity Addressables可尋址資源系統(tǒng)的第一個好處便是:高效的內(nèi)存管理热监。
為了大致了解其效果捺弦,我們可以把這些代碼:
public?class?CharacterCustomization : MonoBehaviour
{
????[SerializeField]?private?List<Material> _armorVariations;
????[SerializeField]?private?MeshRenderer _armorRenderer;
????public?void?ChangeArmorVariation(int?variationId)? ? {
????????_armorRenderer.material = _armorVariations[variationId];
? ? }
}
轉(zhuǎn)化為下面的代碼:
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;
? ? }
}
轉(zhuǎn)化后實現(xiàn)的效果如下圖所示,我們可以輕松節(jié)省內(nèi)存使用。
了解使用可尋址資源系統(tǒng)實現(xiàn)更好內(nèi)存管理的內(nèi)容列吼,請閱讀:《使用Unity Addressables可尋址資源系統(tǒng)》幽崩。
好處2:輕松快捷地加入DLC內(nèi)容
使用Unity Addressables的第二個好處:可以讓開發(fā)者完全控制存儲和加載游戲資源,從而有助于開發(fā)者添加和出售可下載內(nèi)容(DLC)寞钥。
即使目前不考慮發(fā)布DLC內(nèi)容慌申,只要在項目中使用Addressables系統(tǒng),我們就已經(jīng)提前為這項工作做好了準(zhǔn)備理郑。
我們也有其它方法來出售DLC內(nèi)容蹄溉,例如:使用Asset Bundles,但這些方法在實現(xiàn)相同作用的同時香浩,會帶來更高的開銷类缤,因此這些方法會逐漸被棄用。維護正常運行的Asset Bundle管線非常消耗時間和精力邻吭,需要大量復(fù)雜的專業(yè)知識。
在Unity中有很多方法可以實現(xiàn)DLC內(nèi)容宴霸,但對于初學(xué)者來說囱晴,下面代碼是很好的學(xué)習(xí)起點:
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;
????????????}
????????}
????}
}
通過以上代碼,你應(yīng)該了解其中的原理瓢谢。我們能夠使用Unity Addressables畸写,通過少量成本為玩家?guī)砀鄻啡ぃ螛范粸椋?/p>
好處3:減少迭代時間
使用Unity?Addressables會減少在多個過程的等待時間氓扛。
我們都體驗過按下Unity的Play按鈕后枯芬,等待約半分鐘的時間。如果把構(gòu)建版本部署到移動平臺或WebGL平臺采郎,那么情況還會更糟千所。這種等待時間會大幅增加迭代所花的時間。
任何玩家都不喜歡等待蒜埋,Addressables系統(tǒng)會提供以下幫助:
減少構(gòu)建大小
游戲往往有很多內(nèi)容淫痰,玩家喜歡體驗內(nèi)容,而開發(fā)者喜歡創(chuàng)作內(nèi)容整份,并將把游戲內(nèi)容提供給玩家待错。但這并不意味著,我們創(chuàng)作的每個資源都要包含在玩家安裝的構(gòu)建版本中烈评。實際上火俄,我們要盡可能移除不必要的內(nèi)容。
玩家都希望盡快開始玩游戲讲冠。如果游戲需要2GB的數(shù)據(jù)流量瓜客,以及半小時的下載時間,玩家會對此感到不滿。這樣忆家,玩家可能會更傾向于下載《Candy Crush》這類大小低于50MB的游戲犹菇。
其中一種應(yīng)對策略是:只在安裝程序包含主菜單等運行游戲所需的資源,然后在后臺下載剩余游戲內(nèi)容芽卿,首先要下載的是游戲的關(guān)卡內(nèi)容揭芍。
這也會使開發(fā)期間的部署速度變得更快。我們將能夠每天迭代更多次數(shù)卸例,這個好處會在長期時間中累積效果称杨。
減少加載時間
作為游戲開發(fā)者和玩家,我們都討厭等待筷转。等待會讓我們失去玩游戲的狀態(tài)姑原,我們的游戲時間可能在不經(jīng)意間就結(jié)束了。
Unity正在努力通過改善編輯器和游戲的發(fā)布方式呜舒,減少玩家開始玩游戲的時間锭汛。未來有很多值得期待的功能,例如:Unity 2019.3中避免域重載(domain reloads)的功能很值得期待袭蝗,但如今它仍處于Beta版唤殴。
假設(shè)我們正在開發(fā)中世紀(jì)題材的游戲。數(shù)月前到腥,我們?yōu)橛螒驅(qū)崿F(xiàn)了護甲類型朵逝。開發(fā)過程非常順利,我們生成了超過100MB的游戲內(nèi)容乡范。
接下來配名,我們繼續(xù)開發(fā)其它內(nèi)容,例如:刀劍對決晋辆。我們發(fā)現(xiàn)渠脉,每次按下Play按鈕測試功能時,都會從已開發(fā)功能中加載大量數(shù)據(jù)栈拖,而且加載這些數(shù)據(jù)也需要大量時間连舍。
按下Play按鈕測試“刀劍對決”的動畫時,由于要加載之前實現(xiàn)的護甲功能涩哟,我們會額外等待5秒時間索赏。由于內(nèi)存帶寬有限,因此加載過程耗費的時間大多發(fā)生在I/O過程中贴彼。此外潜腻,CPU也要對該過程進行處理。
作為開發(fā)者器仗,我們會在Unity編輯器中耗費相應(yīng)的時間融涣。而玩家則要在已發(fā)布的游戲中等待更多時間童番。
了解到這個情況帶來的影響后,我們要使用什么方法解決該問題呢威鹿?
Unity Addressables能夠通過兩種方法幫助我們剃斧。
1
減少玩家的加載時間?
我們可以減少玩家的等待時間。使用資源的間接引用而不是直接引用忽你,這樣會大幅改善加載時間幼东。
通過使用間接引用,即AssetReference科雳,Unity不會同時加載所有內(nèi)容根蟹,而只在必要時加載部分內(nèi)容。更重要的是糟秘,我們可以直接控制加載內(nèi)容的時間简逮。
2
減少Unity編輯器上的迭代時間??
你對Unity Addressables窗口中的Play Mode Script有多少了解呢?Play Mode Script會定義Unity編輯器如何加載標(biāo)記Addressable的資源尿赚。
選中Packed Play Mode散庶,Unity會直接加載預(yù)構(gòu)建的可尋址資源,僅使用少量處理開銷吼畏,從而有效減少Unity編輯器中的迭代時間督赤。
使用該功能前,請記得先點擊Build Player Content來構(gòu)建玩家內(nèi)容泻蚊。
我們可以試想一下,把這些方法應(yīng)用到最急需的內(nèi)容時會產(chǎn)生怎樣的效果丑婿。
小結(jié)?
本文性雄,我們了解了Unity Addressables能夠幫助進行更好的創(chuàng)作,并給玩家提供更多內(nèi)容羹奉。?我們將從中受益秒旋,讓項目在未來數(shù)月或來年得到提升。