खोज…


वाक्य - विन्यास

  • सार्वजनिक स्थैतिक वस्तु PrefabUtility.InstantiatePrefab (ऑब्जेक्ट लक्ष्य);
  • सार्वजनिक स्थैतिक वस्तु AssetDatabase.LoadAssetAtPath (स्ट्रिंग संपत्तिपथ, प्रकार प्रकार);
  • सार्वजनिक स्थैतिक वस्तु Object.Instantiate (ऑब्जेक्ट मूल);
  • सार्वजनिक स्थैतिक वस्तु संसाधन। लोड (स्ट्रिंग पथ);

परिचय

प्रीफ़ैब एक संपत्ति प्रकार है जो अपने घटकों, गुणों, संलग्न घटकों और क्रमबद्ध संपत्ति मूल्यों के साथ एक पूर्ण गेमऑब्जेक्ट के भंडारण की अनुमति देता है। कई परिदृश्य हैं जहां यह उपयोगी है, जिनमें शामिल हैं:

  • एक दृश्य में वस्तुओं को डुप्लिकेट करना
  • कई दृश्यों में एक सामान्य वस्तु साझा करना
  • एक बार एक प्रीफ़ैब को संशोधित करने और कई ऑब्जेक्ट / दृश्यों में परिवर्तन लागू करने में सक्षम होने के नाते
  • मामूली संशोधनों के साथ डुप्लिकेट ऑब्जेक्ट बनाना, जबकि आम तत्वों को एक बेस प्रीफैब से संपादन योग्य होना चाहिए
  • रनटाइम पर त्वरित खेल

एकता में अंगूठे के प्रकार का एक नियम है जो कहता है कि "सब कुछ प्रीफैब होना चाहिए"। हालांकि यह शायद अतिशयोक्ति है, यह कोड के पुन: उपयोग और गेमऑब्जेक्ट के निर्माण को एक पुन: प्रयोज्य तरीके से प्रोत्साहित करता है, जो कि स्मृति कुशल और अच्छा डिजाइन दोनों है।

प्रीफ़ैब बनाना

प्रीफ़ैब बनाने के लिए, दृश्य पदानुक्रम से एक गेम ऑब्जेक्ट को एसेट्स फ़ोल्डर या सबफ़ोल्डर में खींचें:

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

गेम ऑब्जेक्ट नाम नीला हो जाता है, यह दर्शाता है कि यह एक प्रीफ़ैब से जुड़ा हुआ है
अब यह ऑब्जेक्ट एक प्रीफैब इंस्टेंस है , एक क्लास के ऑब्जेक्ट इंस्टेंस की तरह।

तात्कालिकता के बाद एक प्रीफ़ैब को हटाया जा सकता है। उस स्थिति में पहले से जुड़ी गेम ऑब्जेक्ट का नाम लाल हो जाता है:

यहाँ छवि विवरण दर्ज करें

प्रीफैब इंस्पेक्टर

यदि आप पदानुक्रम दृश्य में एक प्रीफ़ैब का चयन करते हैं, तो आप देखेंगे कि यह निरीक्षक एक साधारण गेम ऑब्जेक्ट से थोड़ा अलग है:

यहाँ छवि विवरण दर्ज करें

बनाम

यहाँ छवि विवरण दर्ज करें

बोल्ड गुणों का मतलब है कि उनके मूल्य प्रीफैब मूल्यों से भिन्न हैं। आप मूल प्रीफ़ैब मूल्यों को प्रभावित किए बिना एक त्वरित प्रीफ़ैब की किसी भी संपत्ति को बदल सकते हैं। जब किसी मूल्य को प्रीफैब उदाहरण में बदल दिया जाता है, तो यह बोल्ड हो जाता है और प्रीफैब में उसी मूल्य के किसी भी बाद के बदलाव को बदले हुए उदाहरण में परिलक्षित नहीं किया जाएगा।

आप रिवर्ट बटन पर क्लिक करके मूल प्रीफ़ैब मानों पर वापस लौट सकते हैं, जिसमें उदाहरण में मूल्य परिवर्तन भी दिखाई देंगे। इसके अतिरिक्त, एक व्यक्तिगत मूल्य को वापस करने के लिए, आप इसे राइट क्लिक कर सकते हैं और प्रीफ़ैब में रिवर्ट वैल्यू दबा सकते हैं। एक घटक को वापस करने के लिए, इसे राइट क्लिक करें और Prefab पर वापस लौटें

क्लिक करने से वर्तमान खेल वस्तु संपत्ति मूल्यों के साथ बटन अधिलेखित पूर्वनिर्मित संपत्ति मूल्यों को लागू करें। कोई "पूर्ववत करें" बटन या पुष्टिकरण संवाद नहीं है, इसलिए इस बटन को सावधानी से संभालें।

प्रोजेक्ट के फ़ोल्डर स्ट्रक्चर में बटन हाइलाइट्स से जुड़े प्रीफैब का चयन करें।

प्रीफ़ेबेटिंग प्रीफ़ैब

प्रीफ़ैब को तुरंत तैयार करने के 2 तरीके हैं: डिज़ाइन समय या रनटाइम के दौरान।

डिजाइन समय तात्कालिकता

डिजाइन के समय पर प्रीफ़ैब्रेटिंग एक ही वस्तु के कई उदाहरणों को देखने के लिए उपयोगी है (जैसे कि आपके गेम के स्तर को डिज़ाइन करते समय पेड़ों को रखना)।

  • किसी प्रीफ़ैब को तुरंत देखने के लिए प्रोजेक्ट व्यू से पदानुक्रम तक खींचें।

    यहाँ छवि विवरण दर्ज करें

  • यदि आप एक संपादकीय एक्सटेंशन लिख रहे हैं, तो आप PrefabUtility.InstantiatePrefab() प्रोग्राम को PrefabUtility.InstantiatePrefab() विधि कहकर PrefabUtility.InstantiatePrefab() भी कर सकते हैं:

    GameObject gameObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/MainCamera.prefab", typeof(GameObject)));
    

रनटाइम इंस्टेंटेशन

कुछ तर्क के अनुसार किसी वस्तु के उदाहरण बनाने के लिए (उदाहरण के लिए हर सेकंड में एक दुश्मन को पैदा करना) उपयोगी है।

प्रीफ़ैब को तुरंत करने के लिए आपको प्रीफ़ैब ऑब्जेक्ट के संदर्भ की आवश्यकता होती है। यह आपके MonoBehaviour स्क्रिप्ट में public GameObject फ़ील्ड के द्वारा किया जा सकता है (और एकता संपादक में निरीक्षक का उपयोग करके इसका मान निर्धारित किया गया है):

public class SomeScript : MonoBehaviour {
   public GameObject prefab; 
}

या संसाधन फ़ोल्डर में prefab डालकर और Resources.Load का उपयोग करके:

GameObject prefab = Resources.Load("Assets/Resources/MainCamera");

एक बार जब आपके पास प्रीफ़ैब ऑब्जेक्ट का संदर्भ होता है, तो आप अपने कोड में कहीं भी Instantiate फ़ंक्शन का उपयोग करके इसे Instantiate कर सकते हैं (जैसे कई ऑब्जेक्ट बनाने के लिए लूप के अंदर ):

GameObject gameObject = Instantiate<GameObject>(prefab, new Vector3(0,0,0), Quaternion.identity);

नोट: Prefab शब्द रनटाइम पर मौजूद नहीं है।

नेस्टेड प्रीफैब

नेस्टेड प्रीफैब इस समय एकता में नहीं हैं। आप एक प्रीफ़ैब को दूसरे में खींच सकते हैं, और उसे लागू कर सकते हैं, लेकिन बच्चे के प्रीफ़ैब पर किसी भी परिवर्तन को नेस्टेड एक पर लागू नहीं किया जाएगा।

लेकिन एक साधारण वर्कअराउंड है - आपको पेरेंट प्रीफैब को एक साधारण स्क्रिप्ट में जोड़ना होगा, जो कि एक बच्चे को तुरंत भेज देगा।

using UnityEngine;

public class ParentPrefab : MonoBehaviour {

    [SerializeField] GameObject childPrefab;
    [SerializeField] Transform childPrefabPositionReference;

    // Use this for initialization
    void Start () {
        print("Hello, I'm a parent prefab!");
        Instantiate(
            childPrefab, 
            childPrefabPositionReference.position, 
            childPrefabPositionReference.rotation, 
            gameObject.transform
        );
    }
}

माता-पिता पूर्वपद:

जनक प्रीफब

बाल पूर्वनिर्मित:

बाल प्रीफैब

शुरू होने से पहले और बाद में दृश्य:

शुरू करने से पहले यहाँ छवि विवरण दर्ज करें



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow