Utilisation des ensembles d'actifs dans Unity

Unity a de nombreuses fonctionnalités utiles, l'une d'entre elles est la prise en charge des ensembles d'actifs.

Que sont les ensembles d'actifs ?

Les ensembles d'éléments sont des fichiers qui contiennent des éléments de jeu, des éléments simples tels que des modèles 3D, des textures et des clips audio à des éléments plus complexes, tels que des scènes et Préfabriqués.

Cependant, les scripts ne peuvent pas être inclus dans les Asset Bundles, seulement leurs références, alors soyez prudent lorsque vous les renommez ou les déplacez, car cela rompra la connexion et vous devrez reconstruire les Asset Bundles pour les faire fonctionner à nouveau.

Quand utiliser les bundles d'actifs ?

Utilisez les ensembles d'actifs lorsque votre jeu contient de nombreux actifs et que leur inclusion dans la version affecte le temps de téléchargement initial.

Exportation de groupes d'actifs

L'exportation des ensembles d'actifs s'effectue en deux étapes: attribuer des noms d'ensembles d'actifs et les créer à l'aide de l'éditeur script.

Affectation de noms de groupes d'actifs

Pour attribuer le nom du groupe d'éléments, sélectionnez l'élément dans la vue Projet (cela peut être Préfabriqué, Texture ou même une Scène), puis dans la vue Inspecteur tout en bas, cliquez sur le menu déroulant, puis cliquez sur 'New...' (ou cliquez sur le nom du groupe d'actifs existant).

L'attribution du même nom de groupe à plusieurs ressources les regroupera dans le même groupe de ressources. Il est conseillé de regrouper les scènes séparément du reste des actifs.

De plus, vous n'avez pas besoin d'attribuer un nom de groupe d'actifs à chaque actif. En règle générale, il vous suffit d'attribuer le nom du bundle au préfabriqué ou à l'actif principal, le reste des dépendances sera automatiquement inclus.

Création d'ensembles d'actifs

Pour créer des ensembles d'éléments, suivez les étapes ci-dessous:

  • Créez un nouveau dossier appelé Editor (si vous n'en avez pas)
  • Créez un nouveau script dans le dossier Editor, nommez-le BuildAssetBundles puis collez le code ci-dessous à l'intérieur:

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);
    }
}

Après l'avoir enregistré, vous remarquerez qu'il ajoutera un bouton de menu (Build -> Build AssetBundles). Cliquez dessus pour créer les ensembles d'actifs et les placer dans le dossier "__Bundles".

Chargement des ensembles d'actifs

Pour charger l'Asset Bundle, il doit d'abord être téléchargé à l'aide de UnityWebRequest, puis décompressé à l'aide d'une fonction spéciale. En règle générale, il existe 2 types de bundles d'assets, ceux qui contiennent des assets et ceux qui contiennent des scènes.

Chargement d'assets à partir des ensembles d'assets

Le code ci-dessous télécharge le groupe d'éléments nommé "fpsplayer", puis extrait le préfabriqué nommé "FPSPlayer" et l'instancie dans la scène:

        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);
            }
        }

Chargement de scènes à partir des ensembles de ressources

Le chargement de la scène à partir de l'asset bundle se fait légèrement différemment.

Le code ci-dessous téléchargera l'Asset Bundle avec une scène et le rendra disponible pour le chargement:

        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");
            }
        }
Articles suggérés
Guide de l'audio dans Unity
Comment peindre des arbres sur un terrain dans Unity
Comment importer des animations dans Unity
Stratégies pour protéger les jeux Unity contre le piratage
Comparaison des environnements de développement 2D et 3D dans Unity
Mise en œuvre des concepts de programmation orientée objet (POO) dans Unity
Choisir la Skybox adaptée à votre environnement dans Unity