2016-05-23 10 views
5

मैं सुंदर गूंगा स्थिति में फंस गया: मैं सामान्य वर्ग का नया उदाहरण बना रहा हूं लेकिन यह "अजीब" शून्य देता है।एकता: नया वर्ग उदाहरण बनाते समय शून्य

Rule rule2 = new Rule(); // initiate the class 
    Debug.Log(rule2); //1st debug 
    rule2.RuleSetup(r: "CaughtEnough", li: 0); //setting up the parameters 
    Debug.Log(rule2.rule); //2nd debug 

1 डिबग मुझे पैरामीटर सेट अप काम करता है एक ही समय में

null 
    UnityEngine.Debug:Log(Object) 

देता है, और 2 डिबग मुझे

CaughtEnough 
    UnityEngine.Debug:Log(Object) 

जो क्या उचित कक्षा में होना चाहिए है देता है उदाहरण।

एक (केवल अब तक) मुद्दा यह है कि यह मेरे लिए ला रहा है कि अगर इस नियम वर्ग उदाहरण whitin मैं

Invoke(rule, 0f); 

फोन यह मेरे NullReferenceException त्रुटि देता है। लेकिन साथ ही वास्तविक कार्य

CaughtEnough(); 

ठीक काम करता है और अपेक्षित काम करता है।

कोई विचार क्या समस्या का स्रोत हो सकता है और इसे कैसे दूर किया जा सकता है?

युपीडी भी नियम वर्ग की स्थापना के भाग पोस्टिंग, पूछा, जैसे कि यह स्पष्ट है

public class Rule : MonoBehaviour { 

public string rule; 

public int leftInt; 
public Dictionary<string, int> leftDict; 
public float countdown; 

public int outcome; 

public CatchManager catchMan; 
public Net net; 

// Use this for initialization 
void Start() { 
    RuleSetup(); 
} 

public void RuleSetup(string r = "NoRule", int li = 0, Dictionary<string, int> ld = null, float cd = float.PositiveInfinity) { 
    rule = r; 
    leftInt = li; 
    leftDict = ld; 
    countdown = cd; 
} 
..... 
+0

प्रतिस्थापित बस की जाँच करता है, तो rule2 अगर (rule2 == नल) {Debug.Log करके रिक्त है ("शून्य")} else {Debug.Log ("शून्य नहीं")}। अपनी नियम कक्षा भी पोस्ट करें ताकि हम देख सकें कि नियमसेट क्या है। – Programmer

+0

धन्यवाद, मैंने आपके सुझाव के अनुसार चेक किया है, और नियम 2 वास्तव में शून्य है। – Alex

उत्तर

14
public class Rule : MonoBehaviour{} 
Rule rule2 = new Rule(); 

आप नहीं कर सकते उपयोग new कीवर्ड नया उदाहरण बनाने के लिए करता है, तो आप कर रहे हैं MonoBehaviour से विरासत।

आप एक MonoBehaviour 'नए' कीवर्ड का उपयोग बनाने के लिए कोशिश कर रहे हैं:

आप अपवाद है कि कहते मिलना चाहिए। इसकी अनुमति नहीं है। MonoBehaviours को केवल AddComponent() का उपयोग करके जोड़ा जा सकता है। वैकल्पिक रूप से, अपनी स्क्रिप्ट सभी

आपका कोड काम किया है | पर स्क्रिप्ट योग्य है या नहीं आधार वर्ग से विरासत सकते हैं यदि आप public class Rule {} था, लेकिन आप public class Rule : MonoBehaviour {} है।

वर्ग के नया उदाहरण है कि MonoBehaviour से निकला बनाना:

उदाहरण वर्ग:

public class Rule : MonoBehaviour 
{ 
    public Rule(int i) 
    { 

    } 
} 

आप MonoBehaviour से विरासत हैं, तो आप या तो उपयोग करना चाहिए GameObject.AddComponent या Instantiate का नया उदाहरण बनाने के लिए यह।

Rule rule2 = null; 
void Start() 
{ 
    rule2 = gameObject.AddComponent<Rule>(); 
} 

या

public Rule rulePrefab; 
Rule rule2; 
void Start() 
{ 
    rule2 = Instantiate(rulePrefab) as Rule; 
} 

Rule स्क्रिप्ट पहले से ही मौजूद हैं और GameObject से जुड़ा हुआ है, तो आप बनाने/जोड़/कि स्क्रिप्ट का नया उदाहरण का दृष्टांत की जरूरत नहीं है। GameObject से स्क्रिप्ट उदाहरण प्राप्त करने के लिए बस GetComponent फ़ंक्शन का उपयोग करें।

Rule rule2; 
void Start() 
{ 
    rule2 = GameObject.Find("NameObjectScriptIsAttachedTo").GetComponent<Rule>(); 
} 

आप देखेंगे कि आप निर्माता में पैरामीटर का उपयोग नहीं कर सकते हैं जब आप MonoBehaviour से अपनी स्क्रिप्ट निकाले जाते हैं।



MonoBehaviour से वर्ग कि व्युत्पन्न नहीं करता है नया उदाहरण बनाना:

उदाहरण वर्ग: (ध्यान दें कि यह "MonoBehaviour"

public class Rule 
{ 
    public Rule(int i) 
    { 

    } 
} 
से निकाले जाते हैं नहीं है

यदि आप इनहे नहीं करते हैं MonoBehaviour से rit, आपको इसका नया उदाहरण बनाने के लिए new कीवर्ड का उपयोग करना चाहिए। अब, यदि आप चाहें तो कन्स्ट्रक्टर में पैरामीटर का उपयोग कर सकते हैं।

Rule rule2 = null; 

void Start() 
{ 
    rule2 = new Rule(3); 
} 

संपादित:

एकता के नवीनतम संस्करण में, एक स्क्रिप्ट है कि new कीवर्ड के साथ MonoBehaviour से विरासत आप त्रुटि नहीं हो सकता है और null भी नहीं हो सकता है की नया उदाहरण बनाने लेकिन सभी कॉलबैक फ़ंक्शंस निष्पादित नहीं करेंगे। इनमें Awake, Start, Update फ़ंक्शंस और अन्य शामिल हैं। इसलिए, आपको अभी भी इस उत्तर के शीर्ष पर उल्लिखित ठीक से करना होगा।

+1

उसे नहीं पता था, धन्यवाद। यह वास्तव में एक अजीब सम्मेलन के रूप में मुझे लगता है। – Alex

+1

@ एलेक्स न्यू यूनिटी उपयोगकर्ताओं का अनुभव है और इसमें मुझे शामिल है।ओह और 'नियम' स्क्रिप्ट – Programmer

+1

के अंदर 'कैचमेनगर' और 'नेट' के उदाहरण बनाते समय वही काम करना सुनिश्चित करें, फिर भी, सबकुछ वास्तव में prefabs n 'staff के साथ ठोस ऑब्जेक्ट्स है। पता नहीं क्यों मैंने सोचा कि मैं नियम के मामले में सिर्फ एक वर्ग के साथ जा सकता हूं :) – Alex

2

बस आ अनुवर्ती, मैं कैसे यह कर समाप्त हो गया और क्यों:

  1. मैं अब Rule वर्ग MonoBehaviour से ट्रैकिंग cretion और gameObjects है, जो दिखाई का विलोपन से बचने के लिए वारिस दर्द।

  2. Invoke के रूप में विधि सामान्य कक्षाओं में मौजूद नहीं है, मैं यह प्रतिबिंब के साथ, के रूप में वर्णित here

संबंधित मुद्दे