Användning av tillgångspaket i Unity
Unity har många användbara funktioner, en av dem är stöd för Asset Bundles.
Vad är tillgångspaket?
Asset Bundles är filer som innehåller speltillgångar, från enkla tillgångar som 3D-modeller, texturer och ljudklipp, till mer komplexa sådana, som scener och Prefabs.
Skript kan dock inte inkluderas i Asset Bundles, bara deras referenser, så var försiktig när du byter namn eller flyttar dem, eftersom det kommer att bryta anslutningen och du måste bygga om Asset Bundles för att få dem att fungera igen.
När ska man använda tillgångspaket?
Använd Asset Bundles när ditt spel har många tillgångar och att inkludera dem i bygget påverkar den initiala nedladdningstiden.
Exportera tillgångspaket
Export av tillgångspaket görs i två steg: att tilldela tillgångspaketnamn och bygga dem med hjälp av Editor-skriptet.
Tilldela namn på tillgångspaket
För att tilldela Asset Bundle-namnet, välj tillgången i projektvyn (detta kan vara Prefab, Texture eller till och med en scen), klicka sedan på inspektörsvyn längst ner på rullgardinsmenyn och klicka sedan på 'New...' (eller klicka på det befintliga Asset Bundle-namnet).
Att tilldela samma paketnamn till flera tillgångar kommer att packa dem i samma tillgångspaket. Det rekommenderas att packa scener separat från resten av tillgångarna.
Du behöver inte heller tilldela ett Asset Bundle-namn till varje tillgång. Vanligtvis behöver du bara tilldela paketnamnet till huvudprefab eller tillgång, resten av beroenden kommer att inkluderas automatiskt.
Bygga tillgångspaket
Följ stegen nedan för att bygga tillgångspaket:
- Skapa en ny mapp som heter Editor (om du inte har någon)
- Skapa ett nytt skript i Editor-mappen, döp det till BuildAssetBundles och klistra sedan in koden nedan i det:
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);
}
}
När du har sparat den kommer du att lägga till en menyknapp (Bygg -> Bygg AssetBundles). Om du klickar på den bygger du tillgångspaketen och placerar dem i mappen "__Bundles".
Laddar tillgångspaket
För att ladda tillgångspaketet måste det först laddas ned med UnityWebRequest och sedan packas upp med en speciell funktion. Generellt finns det två typer av tillgångspaket, de som innehåller tillgångar och de som innehåller scener.
Laddar tillgångar från tillgångspaketen
Koden nedan laddar ned Asset Bundle med namnet "fpsplayer" och extraherar sedan prefab med namnet "FPSPlayer" och instansierar 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);
}
}
Laddar scener från tillgångspaketen
Att ladda scen från Asset Bundle görs något annorlunda.
Koden nedan laddar ned tillgångspaketet med en scen och gör det tillgängligt för laddning:
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");
}
}