还在用难用的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可以帮助进行更好的创做,并给玩家提供更多内容。 咱们将从中受益,让项目在将来数月或来年获得提高。

相关文章
相关标签/搜索