استخدام حزمة الأصول في الوحدة

Unity يحتوي على العديد من الميزات المفيدة، أحدها هو دعم حزم الأصول.

ما هي حزم الأصول؟

حزم الأصول هي ملفات تحتوي على أصول اللعبة، بدءًا من الأصول البسيطة مثل النماذج ثلاثية الأبعاد والأنسجة ومقاطع الصوت، إلى الأصول الأكثر تعقيدًا، مثل Scenes وPrefabs.

ومع ذلك، لا يمكن تضمين البرامج النصية في حزم الأصول، بل مراجعها فقط، لذا كن حذرًا عند إعادة تسميتها أو نقلها، حيث سيؤدي ذلك إلى قطع الاتصال وستحتاج إلى إعادة بناء حزم الأصول لجعلها تعمل مرة أخرى.

متى يجب استخدام حزم الأصول؟

استخدم حزم الأصول عندما تحتوي لعبتك على الكثير من الأصول ويؤثر تضمينها في الإصدار على وقت التنزيل الأولي.

تصدير حزم الأصول

يتم تصدير حزم الأصول في خطوتين: تعيين أسماء حزم الأصول وإنشائها باستخدام المحرر script.

تعيين أسماء حزم الأصول

لتعيين اسم حزمة الأصول، حدد الأصل في عرض المشروع (يمكن أن يكون جاهزًا أو نسيجًا أو حتى مشهدًا)، ثم في عرض المفتش في الجزء السفلي، انقر على القائمة المنسدلة، ثم انقر فوق 'New...' (أو انقر فوق اسم حزمة الأصول الموجودة).

سيؤدي تعيين نفس اسم الحزمة لأصول متعددة إلى تجميعها معًا في نفس حزمة الأصول. يُنصح بحزم المشاهد بشكل منفصل عن بقية الأصول.

بالإضافة إلى ذلك، لا يتعين عليك تعيين اسم حزمة الأصول لكل أصل. عادةً ما تحتاج فقط إلى تعيين اسم الحزمة للمبنى الجاهز أو الأصل الرئيسي، وسيتم تضمين بقية التبعيات تلقائيًا.

بناء حزم الأصول

لإنشاء حزم الأصول، اتبع الخطوات التالية:

  • قم بإنشاء مجلد جديد يسمى Editor (إذا لم يكن لديك أي مجلد)
  • قم بإنشاء سكريبت جديد داخل مجلد Editor، وقم بتسميته BuildAssetBundles ثم الصق الكود أدناه داخله:

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

بعد حفظه ستلاحظ أنه سيضيف زر القائمة (Build -> Build AssetBundles). سيؤدي النقر عليه إلى إنشاء حزم الأصول ووضعها في المجلد "__Bundles".

تحميل حزم الأصول

لتحميل حزمة الأصول، يجب أولاً تنزيلها باستخدام UnityWebRequest ثم فكها باستخدام وظيفة خاصة. بشكل عام، هناك نوعان من حزم الأصول، تلك التي تحتوي على أصول وتلك التي تحتوي على مشاهد.

تحميل الأصول من حزم الأصول

يقوم الكود أدناه بتنزيل Asset Bundle المسمى "fpsplayer" ثم يستخرج المبنى الجاهز المسمى "FPSPlayer" وينشئ مثيلاً له في المشهد:

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

تحميل المشاهد من حزم الأصول

يتم تحميل المشهد من حزمة الأصول بشكل مختلف قليلاً.

سيقوم الكود أدناه بتنزيل حزمة الأصول مع مشهد وجعلها متاحة للتحميل:

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