एकता में एसेट बंडल का उपयोग
Unity इसमें कई उपयोगी विशेषताएं हैं, उनमें से एक एसेट बंडलों के लिए समर्थन है।
एसेट बंडल क्या हैं?
एसेट बंडल ऐसी फ़ाइलें होती हैं जिनमें गेम एसेट शामिल होते हैं, जिनमें साधारण एसेट जैसे 3डी मॉडल, टेक्सचर और ऑडियो क्लिप से लेकर अधिक जटिल एसेट, जैसे सीन और प्रीफ़ैब्स शामिल होते हैं।
हालाँकि, स्क्रिप्ट को एसेट बंडलों में शामिल नहीं किया जा सकता है, केवल उनके संदर्भों को शामिल किया जा सकता है, इसलिए उनका नाम बदलते या स्थानांतरित करते समय सावधान रहें, क्योंकि इससे कनेक्शन टूट जाएगा और आपको उन्हें फिर से काम करने के लिए एसेट बंडलों को फिर से बनाने की आवश्यकता होगी।
एसेट बंडल का उपयोग कब करें?
एसेट बंडल का उपयोग तब करें जब आपके गेम में बहुत अधिक संपत्ति हो और उन्हें बिल्ड में शामिल करने से प्रारंभिक डाउनलोड समय प्रभावित हो।
परिसंपत्ति बंडलों का निर्यात
एसेट बंडलों का निर्यात दो चरणों में किया जाता है: एसेट बंडल नाम निर्दिष्ट करना और संपादक script का उपयोग करके उनका निर्माण करना।
एसेट बंडल नाम निर्दिष्ट करना
एसेट बंडल नाम निर्दिष्ट करने के लिए, प्रोजेक्ट व्यू में एसेट का चयन करें (यह प्रीफ़ैब, टेक्सचर या यहां तक कि एक दृश्य भी हो सकता है), फिर सबसे नीचे इंस्पेक्टर व्यू में ड्रॉपडाउन मेनू पर क्लिक करें, फिर 'New...' पर क्लिक करें (या मौजूदा एसेट बंडल नाम पर क्लिक करें)।
एकाधिक परिसंपत्तियों को एक ही बंडल नाम निर्दिष्ट करने से वे एक ही परिसंपत्ति बंडल में एक साथ पैक हो जाएंगी। दृश्यों को बाकी संपत्तियों से अलग पैक करने की सलाह दी जाती है।
साथ ही, आपको प्रत्येक संपत्ति के लिए एक एसेट बंडल नाम निर्दिष्ट करने की आवश्यकता नहीं है। आमतौर पर आपको केवल मुख्य प्रीफ़ैब या एसेट को बंडल नाम निर्दिष्ट करने की आवश्यकता होती है, बाकी निर्भरताएं स्वचालित रूप से शामिल हो जाएंगी।
संपत्ति बंडलों का निर्माण
एसेट बंडल बनाने के लिए, नीचे दिए गए चरणों का पालन करें:
- संपादक नामक एक नया फ़ोल्डर बनाएं (यदि आपके पास कोई नहीं है)
- एडिटर फ़ोल्डर के अंदर एक नई स्क्रिप्ट बनाएं, इसे 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);
}
}
इसे सहेजने के बाद आप देखेंगे कि इसमें एक मेनू बटन (बिल्ड -> बिल्ड एसेटबंडल्स) जोड़ा जाएगा। इसे क्लिक करने से एसेट बंडल बनेंगे और उन्हें "__Bundles" फ़ोल्डर में रखा जाएगा।
संपत्ति बंडल लोड हो रहा है
एसेट बंडल को लोड करने के लिए पहले इसे UnityWebRequest का उपयोग करके डाउनलोड करना होगा और फिर एक विशेष फ़ंक्शन का उपयोग करके अनपैक करना होगा। आम तौर पर, एसेट बंडल 2 प्रकार के होते हैं, वे जिनमें एसेट होते हैं और वे जिनमें दृश्य होते हैं।
एसेट बंडलों से संपत्ति लोड हो रही है
नीचे दिया गया कोड "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");
}
}