Construire et charger Assetbundles dans Unity

Je ne parviens pas à faire fonctionner Unity Assetbundles dans une version iOS.

Dans Unity, je construis les assetbundles:

using UnityEditor; public class CreateAssetBundles { [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.iOS); } } 

Et ils fonctionnent bien dans Unity. en les utilisant avec

 AssetBundle bundleLoadRequest = AssetBundle.LoadFromFile("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToSsortingng()); 

et / ou

 WWW wwww = WWW.LoadFromCacheOrDownload("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToSsortingng(), 4); 

(Sans le préfixe “file: //”, les bundles ne fonctionneront pas dans Unity ni Xcode)

Je construis le projet pour Xcode et l’exécute dans Xcode et reçois cette erreur:

Impossible d’ouvrir le fichier d’archive: / Users / user / Documents / Workspaces / unityproject / Assets / AssetBundles / iOS / lchairanimations

Cela pourrait être lié en quelque sorte à la définition du chemin correct, mais comme j’ai copié le dossier assetbundle par la suite dans le projet Xcode, le problème persiste.

Dans cet exemple ci-dessous, je montrerai comment append un nouvel actif appelé “chien” à notre AssetBundle nommé “animaux” et le construire puis le charger pendant l’exécution.

Configuration des dossiers de construction:

1 Sélectionnez l’actif tel qu’un fichier image. Dans ce cas, c’est le fichier “dog.jpeg” . Voir le menu dans l’onglet “Inspecteur”. Parfois, l’option AssetBundle est masquée, faites-la glisser pour l’afficher. Voir le gif animé ci-dessous pour savoir comment faire cela. AssetBundle par défaut est “Aucun” . Cliquez sur l’option “Aucune” , puis sur “Nouveau” , créez un nouvel AssetBundle et nommez-le “animaux”.

entrez la description de l'image ici

2 Créez un dossier nommé StreamingAssets dans le dossier Assets. C’est le dossier dans lequel nous allons construire AssetBundle. L’orthographe compte et est sensible à la casse alors assurez-vous de le nommer correctement.

entrez la description de l'image ici

3 Créez un sous-dossier dans le dossier StreamingAssets pour contenir AssetBundle. Pour cet exemple, nommez ce dossier AssetBundles afin de pouvoir l’utiliser pour reconnaître son contenu.

entrez la description de l'image ici


Bâtiment AssetBundle:

4 Voici le script de construction.

Un . Créez un script nommé ExportAssetBundles et placez-le dans un dossier nommé “Editor” dans le dossier Assets, puis copiez le code ci-dessous:

 using System.IO; using UnityEditor; using UnityEngine; public class ExportAssetBundles { [MenuItem("Assets/Build AssetBundle")] static void ExportResource() { ssortingng folderName = "AssetBundles"; ssortingng filePath = Path.Combine(Application.streamingAssetsPath, folderName); //Build for Windows platform BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); //Uncomment to build for other platforms //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.iOS); //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.Android); //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.WebGL); //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX); //Refresh the Project folder AssetDatabase.Refresh(); } } 

entrez la description de l'image ici

B. Construisez votre AssetBudle en allant dans le menu Actifs -> Construire AssetBundle .

Vous devriez voir AssetBundles intégré dans le répertoire Assets/StreamingAssets/AssetBundles . Sinon, actualisez l’onglet Projet.

entrez la description de l'image ici


Chargement de AssetBundle pendant l’exécution :

5 Lors du chargement, Application.streamingAssetsPath doit être utilisé pour accéder au dossier StreamingAssets . Pour accéder à tous les dossiers, utilisez Application.streamingAssetsPath + "/AssetBundle/" + assetbunlenameWithoutExtension; . Les API AssetBundle et AssetBundleRequest sont utilisées pour charger AssetBundle. Texture2D une image, Texture2D est transmise. Si vous utilisez un préfabriqué, passez GameObject place puis instanciez-le. Voir le commentaire dans le code pour savoir où ces modifications doivent être apscopes. Il est recommandé d’utiliser Path.Combine pour combiner les noms de chemin d’access, le code ci-dessous doit donc utiliser cette option.

Vous trouverez ci-dessous une fonction de chargement simple:

 IEnumerator LoadAsset(ssortingng assetBundleName, ssortingng objectNameToLoad) { ssortingng filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "AssetBundles"); filePath = System.IO.Path.Combine(filePath, assetBundleName); //Load "animals" AssetBundle var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(filePath); yield return assetBundleCreateRequest; AssetBundle asseBundle = assetBundleCreateRequest.assetBundle; //Load the "dog" Asset (Use Texture2D since it's a Texture. Use GameObject if prefab) AssetBundleRequest asset = asseBundle.LoadAssetAsync(objectNameToLoad); yield return asset; //Resortingeve the object (Use Texture2D since it's a Texture. Use GameObject if prefab) Texture2D loadedAsset = asset.asset as Texture2D; //Do something with the loaded loadedAsset object (Load to RawImage for example) image.texture = loadedAsset; } 

Choses à faire avant de charger note:

Un . Nom de Assetbundle est des animals .

B. Nom de l’actif / de l’object que nous voulons charger parmi les animaux Assetbundle est un dog Il s’agit d’un simple jpg d’un chien.

entrez la description de l'image ici

C. Le chargement est simple comme ceci:

 ssortingng nameOfAssetBundle = "animals"; ssortingng nameOfObjectToLoad = "dog"; public RawImage image; void Start() { StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad)); }