Unity'de Varlık Paketi Kullanımı

Unity Birçok kullanışlı özelliğe sahiptir; bunlardan biri Varlık Paketleri desteğidir.

Varlık Paketleri Nelerdir?

Varlık Paketleri, 3D modeller, dokular ve ses klipleri gibi basit varlıklardan, Sahneler ve Prefabs gibi daha karmaşık varlıklara kadar oyun varlıklarını içeren dosyalardır.

Ancak komut dosyaları Varlık Paketlerine dahil edilemez, yalnızca referansları vardır; bu nedenle bunları yeniden adlandırırken veya taşırken dikkatli olun; çünkü bu, bağlantıyı kesecektir ve Varlık Paketlerini yeniden çalışmaları için yeniden oluşturmanız gerekecektir.

Varlık Paketleri Ne Zaman Kullanılır?

Oyununuzda çok fazla varlık varsa ve bunları yapıya dahil etmek ilk indirme süresini etkiliyorsa Varlık Paketlerini kullanın.

Varlık Paketlerini Dışa Aktarma

Varlık Paketlerini dışa aktarma iki adımda gerçekleştirilir: Varlık Paketi adlarının atanması ve Düzenleyici script kullanılarak oluşturulması.

Varlık Paketi adlarını atama

Varlık Paketi adını atamak için, Proje görünümünde varlığı seçin (bu Prefabrik, Doku veya hatta bir Sahne olabilir), ardından en alttaki Denetçi görünümünde açılır menüye tıklayın, ardından 'New...' seçeneğine tıklayın (veya mevcut Varlık Paketi adına tıklayın).

Aynı paket adının birden fazla varlığa atanması, bunların aynı Varlık Paketinde paketlenmesine neden olur. Sahnelerin diğer varlıklardan ayrı olarak paketlenmesi tavsiye edilir.

Ayrıca her varlığa bir Varlık Paketi adı atamanıza gerek yoktur. Genellikle paket adını yalnızca ana prefabrike veya varlığa atamanız gerekir; bağımlılıkların geri kalanı otomatik olarak dahil edilecektir.

Varlık Paketleri Oluşturma

Varlık Paketleri oluşturmak için aşağıdaki adımları izleyin:

  • Editör adında yeni bir klasör oluşturun (eğer yoksa)
  • Editör klasörünün içinde yeni bir komut dosyası oluşturun, bunu BuildAssetBundles olarak adlandırın ve ardından aşağıdaki kodu içine yapıştırın:

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);
    }
}

Kaydettikten sonra bir menü düğmesi ekleyeceğini fark edeceksiniz (Oluştur -> AssetBundles Oluştur). Buna tıklamak Varlık Paketlerini oluşturacak ve bunları "__Bundles" klasörüne yerleştirecektir.

Varlık Paketlerini Yükleme

Varlık Paketini yüklemek için önce UnityWebRequest kullanılarak indirilmesi ve ardından özel bir işlev kullanılarak paketin açılması gerekir. Genel olarak 2 tür Varlık Paketi vardır; varlıkları içerenler ve Sahneleri içerenler.

Varlık Paketlerinden Varlıkların Yüklenmesi

Aşağıdaki kod "fpsplayer" adlı Varlık Paketini indirir, ardından "FPSPlayer" adlı Prefab'ı çıkarır ve onu Sahnede başlatır:

        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);
            }
        }

Varlık Paketlerinden Sahneler Yükleniyor

Varlık Paketinden Sahne Yükleme işlemi biraz farklı şekilde yapılır.

Aşağıdaki kod, Sahneli Varlık Paketini indirecek ve yüklemeye hazır hale getirecektir:

        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");
            }
        }