Uso do pacote de ativos no Unity

Unity tem muitos recursos úteis, um deles é o suporte para pacotes de ativos.

O que são pacotes de recursos?

Pacotes de recursos são arquivos que contêm recursos do jogo, desde recursos simples, como modelos 3D, texturas e clipes de áudio, até recursos mais complexos, como como Cenas e Prefabs.

Scripts, no entanto, não podem ser incluídos em Asset Bundles, apenas suas referências, portanto, tenha cuidado ao renomeá-los ou movê-los, pois isso interromperá a conexão e você precisará reconstruir o Pacotes de recursos para fazê-los funcionar novamente.

Quando usar pacotes de recursos?

Use pacotes de recursos quando seu jogo tiver muitos recursos e incluí-los na compilação afeta o tempo de download inicial.

Exportando pacotes de recursos

A exportação de pacotes de recursos é feita em duas etapas: atribuir nomes de pacotes de recursos e criá-los usando o editor script.

Atribuição de nomes de pacotes de recursos

Para atribuir o nome do Asset Bundle, selecione o recurso na visualização Project (pode ser Prefab, Texture ou até mesmo uma Cena) e, na visualização Inspector, na parte inferior, clique no menu suspenso, em seguida, clique em 'Novo...' (ou clique no nome do pacote de recursos existente).

Atribuir o mesmo nome de pacote a vários recursos irá agrupá-los no mesmo pacote de recursos. É aconselhável empacotar cenas separadamente do resto dos recursos.

Além disso, você não precisa atribuir um nome de pacote de recursos a cada recurso. Normalmente, você só precisa atribuir o nome do pacote ao pré-fabricado ou recurso principal, o restante das dependências será incluído automaticamente.

Criando pacotes de recursos

Para criar pacotes de recursos, siga as etapas abaixo:

  • Crie uma nova pasta chamada Editor (se você não tiver nenhuma)
  • Crie um novo script dentro da pasta Editor, nomeie-o BuildAssetBundles e cole o código abaixo dentro dele:

BuildAssetBundles.cs

using UnityEngine;
using UnityEditor;

public class BuildAssetBundles
{
    [MenuItem("Build/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string outputFolder = "Assets/__Bundles";

        //Check if __Bundles folder exist
        if (!AssetDatabase.IsValidFolder(outputFolder))
        {
            Debug.Log("Folder '__Bundles' does not exist, creating new folder");

            AssetDatabase.CreateFolder("Assets", "__Bundles");
        }

        BuildPipeline.BuildAssetBundles(outputFolder, BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget);
    }
}

Depois de salvá-lo, você notará que ele adicionará um botão de menu (Build -> Build AssetBundles). Clicar nele criará os pacotes de recursos e os colocará na pasta "__Bundles".

Carregando pacotes de recursos

Para carregar o Asset Bundle, primeiro ele precisa ser baixado usando UnityWebRequest e depois descompactado usando uma função especial. Geralmente, existem 2 tipos de pacotes de recursos, aqueles que contêm recursos e aqueles que contêm cenas.

Carregando recursos dos pacotes de recursos

O código abaixo faz o download do Asset Bundle chamado "fpsplayer", em seguida, extrai o Prefab chamado "FPSPlayer" e o instancia na cena:

        int assetBundleVersion = 1; // Changing this number will force Asset Bundle reload
        string assetBundlePath = "file://" + Application.dataPath + "/__Bundles/" + "fpsplayer"; // Path to Asset Bundle file
        using (UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(assetBundlePath, (uint)assetBundleVersion, 0))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.LogError("AssetBundle Error: " + www.error);
                yield return null;
            }
            else
            {
                // Get downloaded Asset Bundle
                AssetBundle assetBundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(www);
                // Extract Prefab named "FPSPlayer" from the Asset Bundle
                GameObject playerPrefab = assetBundle.LoadAsset("FPSPlayer") as GameObject;
                // Instantiate Player Prefab
                Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
                // Unload Asset Bundle from memory (but do not destroy the existing instance(s))
                assetBundle.Unload(false);
            }
        }

Carregando cenas dos pacotes de recursos

O carregamento da cena do Asset Bundle é feito de maneira ligeiramente diferente.

O código abaixo fará o download do Asset Bundle com uma cena e o disponibilizará para carregamento:

        int assetBundleVersion = 1; // Changing this number will force Asset Bundle reload
        string assetBundlePath = "file://" + Application.dataPath + "/__Bundles/" + "testscene"; // Path to Asset Bundle file
        using (UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(assetBundlePath, (uint)assetBundleVersion, 0))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.LogError("AssetBundle Error: " + www.error);
                yield return null;
            }
            else
            {
                // Get downloaded Asset Bundle (This will make the Scene available for load)
                AssetBundle assetBundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(www);
                // Load the Scene extracted from the Asset Bundle
                UnityEngine.SceneManagement.SceneManager.LoadScene("TestScene");
            }
        }
Artigos sugeridos
Guia para áudio no Unity
Ativos de uso geral indispensáveis ​​para a unidade
Estratégias para proteger os jogos Unity da pirataria
Como pintar árvores no terreno no Unity
Como importar animações para o Unity
Escolhendo o Skybox certo para o seu ambiente no Unity
Como fazer um jogo inspirado em FNAF no Unity