c# - Construye y carga Assetbundles en Unity
ios xcode (1)
No puedo hacer que Unity Assetbundles funcione en una compilación de iOS.
En Unity construyo los paquetes de activos:
using UnityEditor;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.iOS);
}
}
Y funcionan bien en Unity. usándolos con
AssetBundle bundleLoadRequest = AssetBundle.LoadFromFile("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToString());
y / o
WWW wwww = WWW.LoadFromCacheOrDownload("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToString(), 4);
(Sin el prefijo "file: //", los paquetes no funcionarán en Unity ni Xcode)
Construyo el proyecto para Xcode y lo ejecuto en Xcode y recibo este error:
No se puede abrir el archivo: / Users / user / Documents / Workspaces / unityproject / Assets / AssetBundles / iOS / lchairanimations
Puede estar relacionado de alguna manera con la configuración de la ruta correcta, pero como he copiado la carpeta del paquete de activos después al proyecto Xcode, el problema persiste.
En este ejemplo a continuación, demostraré cómo agregar un nuevo activo llamado "perro" a nuestro AssetBundle llamado "animales" y construirlo y luego cargarlo durante el tiempo de ejecución.
Configuración de carpetas de compilación:
1) Seleccione el activo, como el archivo de imagen. En este caso, ese es el archivo "dog.jpeg" . Vea el menú en la pestaña "Inspector". A veces, la opción AssetBundle está oculta, arrástrela para mostrarla. Vea el gif animado a continuación para saber cómo hacer esto. El AssetBundle predeterminado es "Ninguno" . Haga clic en la opción "Ninguno" , vaya a la opción "Nuevo" y cree un nuevo AssetBundle y asígnele el nombre "animales"
2)
Cree una carpeta llamada
StreamingAssets
en la carpeta Assets.
Esta es la carpeta en la que vamos a construir el AssetBundle.
La ortografía cuenta y distingue entre mayúsculas y minúsculas, así que asegúrese de nombrarla correctamente.
3)
Cree una subcarpeta en la carpeta
StreamingAssets
para contener el AssetBundle.
Para este ejemplo,
AssetBundles
nombre a esta carpeta
AssetBundles
para que pueda usarla para reconocer lo que
AssetBundles
.
Paquete de activos de construcción:
4) A continuación se muestra el script de compilación.
A.
Cree un script llamado
ExportAssetBundles
y póngalo en una carpeta llamada
"Editor"
en la carpeta Assets y luego copie el código a continuación:
using System.IO;
using UnityEditor;
using UnityEngine;
public class ExportAssetBundles
{
[MenuItem("Assets/Build AssetBundle")]
static void ExportResource()
{
string folderName = "AssetBundles";
string 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();
}
}
B. Cree su AssetBudle yendo a Activos -> Crear menú AssetBundle .
Debería ver los AssetBundles integrados dentro del directorio
Assets/StreamingAssets/AssetBundles
.
De lo contrario, actualice la pestaña Proyecto.
Carga de AssetBundle durante el tiempo de ejecución :
5)
Al cargarlo,
Application.streamingAssetsPath
debe usarse para acceder a la carpeta
StreamingAssets
.
Para acceder a todas las carpetas, use
Application.streamingAssetsPath + "/AssetBundle/" + assetbunlenameWithoutExtension;
.
AssetBundle
y
AssetBundleRequest
API se utilizan para cargar AssetBundle.
Como se trata de una imagen, se les pasa
Texture2D
.
Si usa un prefabricado, pase
GameObject
en
GameObject
lugar y luego
GameObject
.
Vea el comentario en el código para saber dónde deben hacerse estos cambios.
Se recomienda usar
Path.Combine
para combinar nombres de ruta, por lo que el siguiente código debería usarlo en su lugar.
A continuación se muestra una función de carga simple:
IEnumerator LoadAsset(string assetBundleName, string objectNameToLoad)
{
string 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<Texture2D>(objectNameToLoad);
yield return asset;
//Retrieve 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;
}
Cosas que hacer antes de cargar la nota:
A.
El nombre de Assetbundle es
animals
.
B.
Nombre del activo / objeto que queremos cargar de los animales Assetbundle es
dog
Este es un simple jpg de un perro.
C. La carga es simple como esta:
string nameOfAssetBundle = "animals";
string nameOfObjectToLoad = "dog";
public RawImage image;
void Start()
{
StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad));
}