खोज…


टिप्पणियों

ScriptableObjects एसेटबंडल्स के साथ

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

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

परिचय

ScriptableObjects क्रमबद्ध ऑब्जेक्ट्स हैं जो मोनोबेहेवियर के रूप में दृश्यों या गेमबॉजेक्ट्स के लिए बाध्य नहीं हैं। इसे एक तरह से रखने के लिए, वे आपके प्रोजेक्ट के अंदर एसेट फ़ाइलों से संबंधित डेटा और विधियाँ हैं। ये ScriptableObject परिसंपत्तियाँ MonoBehaviours या अन्य ScriptableObjects को दी जा सकती हैं, जहाँ उनकी सार्वजनिक विधियों तक पहुँचा जा सकता है।

धारावाहिक संपत्ति के रूप में उनकी प्रकृति के कारण, वे उत्कृष्ट प्रबंधक वर्गों और डेटा स्रोतों के लिए बनाते हैं।

ScriptableObject संपत्ति बनाना

नीचे एक सरल ScriptableObject कार्यान्वयन है।

using UnityEngine;

[CreateAssetMenu(menuName = "StackOverflow/Examples/MyScriptableObject")]
public class MyScriptableObject : ScriptableObject
{
    [SerializeField]
    int mySerializedNumber;

    int helloWorldCount = 0;

    public void HelloWorld()
    {
        helloWorldCount++;
        Debug.LogFormat("Hello! My number is {0}.", mySerializedNumber);
        Debug.LogFormat("I have been called {0} times.", helloWorldCount);
    }
}

CreateAssetMenu विशेषता को वर्ग में जोड़कर, एकता इसे एसेट्स / क्रिएट सबमेनू में सूचीबद्ध करेगी। इस मामले में यह आस्तियों / बनाएँ / StackOverflow / उदाहरणों के अंतर्गत है।

एक बार बनाया, ScriptableObject उदाहरण अन्य लिपियों और ScriptableObjects को इंस्पेक्टर के माध्यम से पारित किया जा सकता है।

using UnityEngine;

public class SampleScript : MonoBehaviour {

    [SerializeField]
    MyScriptableObject myScriptableObject;

    void OnEnable()
    {
        myScriptableObject.HelloWorld();
    }
}

कोड के माध्यम से ScriptableObject इंस्टेंस बनाएं

आप ScriptableObject.CreateInstance<T>() माध्यम से नए ScriptableObject इंस्टेंस बनाएं

T obj = ScriptableObject.CreateInstance<T>();

जहां T , ScriptableObject विस्तार करता है।

अपने कंस्ट्रक्टरों को बुलाकर ScriptableObjects न बनाएं, अर्थात। new ScriptableObject()

रनटाइम के दौरान कोड द्वारा ScriptableObjects बनाना शायद ही कभी कहा जाता है क्योंकि उनका मुख्य उपयोग डेटा क्रमांकन है। आप इस बिंदु पर मानक कक्षाओं का उपयोग कर सकते हैं। जब आप संपादक एक्सटेंशन को स्क्रिप्ट कर रहे हैं तो यह अधिक सामान्य है।

ScriptableObjects को PlayMode में भी संपादक द्वारा क्रमांकित किया जाता है

किसी ScriptableObject उदाहरण में क्रमबद्ध फ़ील्ड एक्सेस करते समय अतिरिक्त देखभाल की जानी चाहिए।

यदि किसी क्षेत्र को public या SerializeField के माध्यम से SerializeField , तो उसका मान बदलना स्थायी होता है। MonoBehaviours जैसे playmode से बाहर निकलने पर वे रीसेट नहीं करते हैं। यह कई बार उपयोगी हो सकता है, लेकिन यह एक गड़बड़ भी कर सकता है।

इस वजह से यह क्रमबद्ध क्षेत्रों को केवल पढ़ने के लिए और सार्वजनिक क्षेत्रों से पूरी तरह बचने के लिए सबसे अच्छा है।

public class MyScriptableObject : ScriptableObject
{
    [SerializeField]
    int mySerializedValue;

    public int MySerializedValue
    {
        get { return mySerializedValue; }
    }
}

यदि आप एक ScriptableObject में सार्वजनिक मान संग्रहीत करना चाहते हैं जो कि प्ले सेशन के बीच रीसेट हो, तो निम्न पैटर्न का उपयोग करने पर विचार करें।

public class MyScriptableObject : ScriptableObject
{
    // Private fields are not serialized and will reset to default on reset
    private int mySerializedValue;

    public int MySerializedValue
    {
        get { return mySerializedValue; }
        set { mySerializedValue = value; }
    }
}

रनटाइम के दौरान मौजूदा ScriptableObjects खोजें

रनटाइम के दौरान सक्रिय ScriptableObjects को खोजने के लिए, आप Resources.FindObjectsOfTypeAll() उपयोग कर सकते हैं।

T[] instances = Resources.FindObjectsOfTypeAll<T>();

जहां T आप स्क्रिप्ट करने योग्य ओब्जेक्ट उदाहरण का प्रकार खोज रहे हैं। सक्रिय का मतलब है कि इसे पहले किसी न किसी रूप में मेमोरी में लोड किया गया है।

यह तरीका बहुत धीमा है इसलिए रिटर्न वैल्यू को कैश करना याद रखें और बार-बार कॉल करने से बचें। ScriptableObjects को सीधे अपनी स्क्रिप्ट में संदर्भित करना आपका पसंदीदा विकल्प होना चाहिए।

युक्ति: आप तेज़ लुकअप के लिए अपने स्वयं के संग्रह संग्रह बनाए रख सकते हैं। OnEnable() दौरान अपने OnEnable() को खुद को एक साझा संग्रह में पंजीकृत करें।



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