Assetbundelgebruik in eenheid
Unity heeft veel handige functies, een daarvan is ondersteuning voor Asset Bundles.
Wat zijn activabundels?
Assetbundels zijn bestanden die game-items bevatten, van eenvoudige items zoals 3D-modellen, texturen en audioclips, tot complexere items, zoals scènes en prefabs.
Scripts kunnen echter niet in Asset Bundles worden opgenomen, alleen hun referenties. Wees dus voorzichtig als u ze hernoemt of verplaatst, omdat hierdoor de verbinding wordt verbroken en u de Asset Bundles opnieuw moet opbouwen om ze weer te laten werken.
Wanneer moet u activabundels gebruiken?
Gebruik activabundels als uw game veel activa bevat en het opnemen ervan in de build van invloed is op de initiële downloadtijd.
Activabundels exporteren
Het exporteren van activabundels gebeurt in twee stappen: het toewijzen van namen aan activabundels en het bouwen ervan met behulp van het Editor script.
Namen van activabundels toewijzen
Om de naam van de assetbundel toe te wijzen, selecteert u het asset in de projectweergave (dit kan prefab, textuur of zelfs een scène zijn). Klik vervolgens in de infovenster helemaal onderaan op het vervolgkeuzemenu en klik vervolgens op 'New...' (of klik op de bestaande naam van de activabundel).
Als u dezelfde bundelnaam aan meerdere activa toewijst, worden ze samen in dezelfde activabundel verpakt. Het is raadzaam om scènes apart van de rest van de spullen in te pakken.
Bovendien hoeft u niet aan elk item een Asset Bundle-naam toe te wijzen. Normaal gesproken hoeft u alleen de bundelnaam aan het hoofdprefab of asset toe te wijzen; de rest van de afhankelijkheden wordt automatisch opgenomen.
Activabundels bouwen
Volg de onderstaande stappen om activabundels samen te stellen:
- Maak een nieuwe map met de naam Editor (als u die nog niet heeft)
- Maak een nieuw script in de Editor-map, noem het BuildAssetBundles en plak de onderstaande code erin:
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);
}
}
Nadat je het hebt opgeslagen, zul je merken dat er een menuknop wordt toegevoegd (Build -> Build AssetBundles). Als u erop klikt, worden de activabundels samengesteld en in de map "__Bundles" geplaatst.
Activabundels laden
Om de Asset Bundle te laden, moet deze eerst worden gedownload met UnityWebRequest en vervolgens worden uitgepakt met behulp van een speciale functie. Over het algemeen zijn er twee soorten activabundels: pakketten die activa bevatten en pakketten die scènes bevatten.
Activa uit de activabundels laden
De onderstaande code downloadt de activabundel met de naam "fpsplayer", extraheert vervolgens het prefab met de naam "FPSPlayer" en instantieert deze in de 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);
}
}
Scènes uit de activabundels laden
Het laden van scènes uit de activabundel gaat iets anders.
Met de onderstaande code wordt de activabundel met een scène gedownload en beschikbaar gemaakt voor laden:
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");
}
}