Asset Bundle-bruk i Unity
Unity har mange nyttige funksjoner, en av dem er støtte for Asset Bundles.
Hva er aktivapakker?
Asset Bundles er filer som inneholder spillressurser, fra enkle eiendeler som 3D-modeller, teksturer og lydklipp, til mer komplekse, som Scenes og Prefabs.
Skript kan imidlertid ikke inkluderes i Asset Bundles, bare referansene deres, så vær forsiktig når du gir dem nytt navn eller flytter dem, da det vil bryte forbindelsen og du må gjenoppbygge Asset Bundles for å få dem til å fungere igjen.
Når skal man bruke aktivapakker?
Bruk Asset Bundles når spillet ditt har mange eiendeler og å inkludere dem i bygget påvirker den første nedlastingstiden.
Eksport av aktivapakker
Eksportering av aktivapakker gjøres i to trinn: å tildele navn på aktivabunter og bygge dem ved hjelp av redigeringsskriptet .
Tilordne navn på aktivabunter
For å tildele Asset Bundle-navnet, velg ressursen i prosjektvisningen (dette kan være prefab, tekstur eller til og med en scene), og klikk deretter på rullegardinmenyen i inspektørvisningen helt nederst, og klikk deretter 'New...' (eller klikk på navnet på den eksisterende ressursgruppen).
Hvis du tildeler samme pakkenavn til flere eiendeler, vil de pakkes sammen i samme pakke. Det anbefales å pakke Scener separat fra resten av eiendelene.
Du trenger heller ikke å tildele et Asset Bundle-navn til hver eiendel. Vanligvis trenger du bare å tildele pakkenavnet til hovedprefabrikken eller aktivaen, resten av avhengighetene vil bli inkludert automatisk.
Bygg aktivapakker
Følg trinnene nedenfor for å bygge aktivapakker:
- Opprett en ny mappe kalt Editor (hvis du ikke har noen)
- Opprett et nytt skript i Editor-mappen, navngi det BuildAssetBundles og lim inn koden nedenfor i den:
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);
}
}
Etter å ha lagret den vil du legge merke til at den vil legge til en menyknapp (Bygg -> Bygg AssetBundles). Hvis du klikker på den, bygges Asset Bundles og plasseres i "__Bundles"-mappen.
Laster inn aktivapakker
For å laste Asset Bundle må den først lastes ned ved hjelp av UnityWebRequest og deretter pakkes ut ved hjelp av en spesiell funksjon. Generelt er det 2 typer aktivapakker, de som inneholder aktiva og de som inneholder scener.
Laster inn eiendeler fra aktivapakkene
Koden nedenfor laster ned Asset Bundle kalt "fpsplayer" og trekker deretter ut Prefab-navnet "FPSPlayer" og instansierer den i scenen:
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);
}
}
Laster inn scener fra aktivapakkene
Lasting av scene fra Asset Bundle gjøres litt annerledes.
Koden nedenfor vil laste ned Asset Bundle with a Scene og gjøre den tilgjengelig for innlasting:
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");
}
}