एकता के निरीक्षक में मुख्य-मूल्य जोड़े (एक शब्दकोश की तरह) कैसे संपादित करें?


18

मेरे पास एक वर्तनी प्रणाली है जिसे मैं बना रहा हूं, सिद्धांत इस प्रकार है:

  • प्रत्येक मंत्र एक स्वायत्त prefab है। इसमें कुछ गुणों (आधार क्षति, अवधि ...) के साथ एक स्क्रिप्ट शामिल है जिसे निरीक्षक में संशोधित किया जा सकता है।
  • मेरे पास कोड में सभी संभव मंत्रों को सूचीबद्ध करने वाला एक स्पेल एनम है, जिसका उपयोग गेम लॉजिक में किया जाता है
  • जब मैं एक जादू करना चाहता हूं, तो मुझे इस मंत्र का पूर्वाभास प्राप्त करने में सक्षम होना चाहिए ताकि इसे तुरंत पढ़ा जा सके और इसका संकेत पढ़ा जा सके
  • प्रत्येक अभिनेता (यह खिलाड़ी या दुश्मन हो) को मंत्र के लिए संभावित एनिमेशन की एक सूची की आवश्यकता होती है

मैं जिन समस्याओं को लागू करने की कोशिश कर रहा हूं, वे हैं:

  • प्रत्येक अभिनेता के एनिमेशन को सूचीबद्ध करने के लिए मैं एक का उपयोग कर सकता था Dictionary<Spell, Animation>, लेकिन शब्दकोशों को निरीक्षक द्वारा समर्थित नहीं किया जाता है, जिससे कई अभिनेताओं के प्रकारों को आसानी से संपादित करना मुश्किल हो जाता है।
  • मुझे आसानी से संबंधित एनम से एक वर्तनी प्रीफ़ैब का उपयोग करने के लिए किसी तरह की आवश्यकता है। यहां भी मैं एक शब्दकोश का उपयोग कर सकता हूं, लेकिन मैं केवल निरीक्षक में प्रीफैब का संदर्भ दे सकता हूं, कोड में नहीं, जिसका अर्थ है कि मैं इस शब्दकोश को भरने में सक्षम नहीं हूं

मैं आसानी से इसी मंत्र और एनिमेशन के लिए अपने मंत्र enums संबद्ध करने के लिए एक रास्ता देख रहा हूँ


1
क्या मुझे इस सवाल का शीर्षक बदलने का सुझाव देना चाहिए ताकि एकता के निरीक्षक में शब्दकोश-जैसा व्यवहार (कुंजी-मूल्य जोड़े) मैपिंग हो सके? यह इस तरह की समस्या को हल करने के लिए अन्य उपयोगकर्ताओं को खोजने के लिए प्रश्न को आसान बनाने में मदद करेगा, या खोज रहे हैं। हालांकि यह विशिष्ट मामला मंत्रों के बारे में है, वही तकनीक अधिक मोटे तौर पर लागू होती है।
DMGregory

@DM मैं एकता को नहीं जानता, लेकिन आपका सामान्य तर्क समझदार है। बोल्ड और संपादित करें; रोलबैक सस्ते हैं।
Anko

जवाबों:


24

यूनिटी के इंस्पेक्टर में मुख्य-मूल्य वाले जोड़े प्राप्त करने का एक त्वरित तरीका क्रमिक प्रवेश कक्षा को परिभाषित करना है, और फिर उनमें से एक सरणी या सूची <> का उपयोग करना है। जैसे ...

public class SpellAnimationMap : ScriptableObject
{
   [System.Serializable]
   public class SpellAnimationEntry
   {
       public Spell spell;
       public AnimationClip animation;
   }

   public SpellAnimationEntry[] spellAnimations;    
}

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

परिणाम इस तरह दिखता है:

स्वतः उत्पन्न निरीक्षक

(एक चाल: यदि क्रमांकित प्रविष्टि वर्ग में "नाम" फ़ील्ड है, तो उस स्ट्रिंग को "तत्व 0" शीर्षकों के बजाय प्रदर्शित किया जाएगा। यदि आपके पास अधिक जटिल डेटा है तो आप कुशलतापूर्वक नेविगेट करने में सक्षम होना चाहते हैं।)

इसे एक ScriptableObject बनाने से आप इसे इकाई प्रकारों / उदाहरणों के बीच साझा किए गए एसेट के रूप में व्यवहार कर सकते हैं, जिन्हें समान एनीमेशन सेट की आवश्यकता होती है, प्रत्येक के लिए सूची को दोहराए जाने से बचें। (अन्य वर्ग एकता में क्रमबद्ध रूप से प्रतिरूप होते हैं)। इस मार्ग पर जाने के लिए, आपको अपने एसेट फ़ोल्डर में इनका उदाहरण बनाने के लिए एक छोटी संपादक स्क्रिप्ट जोड़ने की आवश्यकता होगी ।


संपादित करें: अब यह और भी आसान है - आप इस विशेषता को अपने ScriptableObject के ऊपर जोड़ सकते हैं :

[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]

यह आपके बनाए मेनू में ScriptableObject डालता है, जैसे: एकता में एक अनुकूलित बनाएँ मेनू दिखा स्क्रीनशॉट


आप वैकल्पिक रूप से सरणी को निजी और क्रमबद्ध बना सकते हैं ताकि यह अभी भी निरीक्षक में दिखाई दे, लेकिन अधिक कुशल लुकअप के लिए उपभोग करने के लिए एक सार्वजनिक शब्दकोश (या सार्वजनिक GetAnimation (वर्तनी वर्तनी) विधि के साथ निजी शब्दकोश) जोड़ें। अपनी OnEnable () विधि में, SpellAnimationMap एक बार फिर से सभी क्लाइंट इंस्टेंस के बीच लाभ साझा करते हुए, इस शब्दकोश को बनाने के लिए अपने निरीक्षक-आबादी वाले सरणी के माध्यम से पुनरावृति कर सकता है। (ध्यान दें कि संपत्ति को पहली बार बनाए जाने पर OnEnable () को संपादक में भी कहा जाता है, इसलिए यह जांचना सुनिश्चित करें कि आपके पढ़ने से पहले आपका सरणी गैर-अशक्त है)

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

डिक्शनरी <,> फ़ील्ड्स को सीधे पॉप्युलेट करने के लिए कस्टम इंस्पेक्टर लिखना भी संभव है, लेकिन मुझे जो धारणा मिलती है वह यह है कि यह आसानी से काम करने के लिए उधम मचाता है।


वास्तव में एक जवाब का इंतजार करते हुए मैंने क्या किया, इसलिए, मैं इसे स्वीकार
करूंगा

0

@DMGregory द्वारा प्रदान की गई व्याख्या पढ़ें

उन लोगों के लिए जो उदाहरण पसंद करते हैं:

public class SpellHandler : ScriptableObject
{
    public Spell[] keys;
    public Animation[] values;

    private Dictionary<Spell, Animation> dic;

    void Awake()
    {
        int length = keys.Length;
        this.dic= new Dictionary<Spell, Animation>(length);
        for (int i = 0; i < length; i++)
        {
            this.dic.Add(keys[i], values[i]);
        } 
    }    
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.