2016-11-09 3 views
5

के अंदर कोरआउट का प्रयोग करें, आप गैर मोनोबहेवियर कक्षा के उदाहरण के अंदर एक मोनोबहेवियर कैसे पारित कर सकते हैं? मुझे यह link मिला जहां टोनीली का उल्लेख है कि आप कक्षा के उदाहरण के अंदर कोरआउट को शुरू करने और रोकने के लिए एक मोनोबहेवियर पास कर सकते हैं, लेकिन वह यह नहीं दिखाता कि आप यह कैसे कर सकते हैं। वह यह करता है Ivent.StartEvent (myMonoBehaviour); लेकिन वह यह नहीं दिखाता कि वह कहां से मेरामोनाहेवियर प्राप्त करता है। मैंने इंटरनेट पर चारों ओर देखा लेकिन मुझे लगता है कि कैसे नहीं मिल रहा है।एक गैर मोनोहेवियर कक्षा

  • संपादित

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

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

[RequireComponent (typeof(Image))] 
public class SpecialBar : MonoBehaviour { 

    public float rangeX; 
    public float breakTime; 
    public float step; 
    float startProgress = 0.5f; 
    PingPongGameObject pingPonger; 

    Color[] teamColors = new Color[]{new Color(255,136,0),new Color(0,170,255)}; 

    void Start() 
    { 

     for(int i = 0; i < teamColors.Length; ++i) 
     { 
      teamColors[i] = StaticFunctions.NormalizeColor (teamColors[i]); 
     } 

     pingPonger = new PingPongGameObject (gameObject.transform.position, 
      new Vector3(rangeX,0.0f,0.0f), 
      gameObject, 
      startProgress, 
      breakTime, 
      step 
      ); 
    } 
} 

द्वितीय श्रेणी, जहां मेरे coroutine में है।

public class PingPongGameObject 
{ 
    float step; 
    Vector3 center; 
    Vector3 range; 
    GameObject ball; 
    float progress; 
    float breakTime; 
    Vector3 endPos; 
    Vector3 oppositePosition; 


    public PingPongGameObject(Vector3 _center, Vector3 _range, GameObject _ball, float _startProgress, float _breakTime, float _step) 
    { 
     center = _center; 
     range = _range; 
     ball = _ball; 
     progress = _startProgress; 
     breakTime = _breakTime; 
     step = _step; 
     endPos = center - range; 
     oppositePosition = center + range; 
     // This is where I want to start the coroutine 
    } 

    public IEnumerator PingPong() 
    { 


     while (progress < 1) { 
      progress += Time.deltaTime * step; 
      Vector3 newPos = Vector3.Lerp (oppositePosition, endPos, progress); 
      ball.transform.position = newPos; 
      yield return null; 
     } 
     Vector3 temp = endPos; 
     endPos = oppositePosition; 
     oppositePosition = temp; 
     progress = 0; 
     yield return new WaitForSeconds (breakTime); 
     yield return null; 
    } 

    public float Step 
    { 
     set{step = value;} 
    } 

    public void StopCoroutine() 
    { 
     // This is where I want to stop the coroutine 
    } 
} 
+0

हां, मैं सिर्फ एक पल में अपने प्रश्न में एक स्पष्टीकरण डालूंगा। –

+0

मैंने सवाल फिर से किया। –

+0

मैंने छोड़ा गया जवाब जांचें। आप 'इस' कीवर्ड का उपयोग कर सकते हैं। – Programmer

उत्तर

7

TonyLi कहा गया है कि आप शुरू करने और एक वर्ग का एक उदाहरण के अंदर coroutines को रोकने के लिए एक Monobehaviour पारित कर सकते हैं, लेकिन वह करता है यह नहीं दिखाएं कि आप कैसे ऐसा कर सकते हैं। वह यह

आप this कीवर्ड के साथ ऐसा कर सकते हैं। इस कीवर्ड को MonoBehaviour का वर्तमान उदाहरण मिलेगा।

इस उदाहरण में एक पेड़ है, जो एक घटक MonoScript है करने के लिए होता है:

enter image description here

कि MonoScript की विशेष उदाहरण कर सकते हैं अगर यह चाहता है (क्योंकि यह एसी # कार्यक्रम है) एक सामान्य सी # वर्ग का दृष्टांत, NonMonoScript:

public class MonoScript : MonoBehaviour 
{ 
    void Start() 
    { 
     NonMonoScript nonMonoScript = new NonMonoScript(); 
     //Pass MonoBehaviour to non MonoBehaviour class 
     nonMonoScript.monoParser(this); 
    } 
} 
:

कक्षा से MonoBehaviour पारित करने के लिए

कक्षा MonoBehaviour उदाहरण पारित प्राप्त करता है कि:

public class NonMonoScript 
{ 
    public void monoParser(MonoBehaviour mono) 
    { 
     //We can now use StartCoroutine from MonoBehaviour in a non MonoBehaviour script 
     mono.StartCoroutine(testFunction()); 

     //And also use StopCoroutine function 
     mono.StopCoroutine(testFunction()); 
    } 

    IEnumerator testFunction() 
    { 
     yield return new WaitForSeconds(3f); 
     Debug.Log("Test!"); 
    } 
} 

तुम भी एक स्थानीय चर में monoParser समारोह से mono संदर्भ स्टोर कर सकते हैं फिर से इस्तेमाल किया जा रहा।

+0

दोस्त - माइक के विवरण को पढ़ें: * "ताकि मैं किसी के लिए कोड का पुन: उपयोग कर सकूं ऑब्जेक्ट कि मैं इस तरह से पिंगपोंग करना चाहता हूं। कोड एक गेमबोजेक्ट को एक दिशा में ले जाता है, फिर ब्रेक लेता है और उसे दूसरी दिशा में ले जाता है "* वह एक पिंग-पॉंग घटक के लिए देख रहा है !!!!!!!! !!! – Fattie

+1

धन्यवाद दोस्तों! प्रोग्रामर यह वही था जो मैं खोज रहा था। जो ब्लो मुझे एहसास है कि यह उस समस्या से निपटने का सबसे बढ़िया तरीका नहीं हो सकता है जिसे मैं इसमें और आपकी व्याख्या में देखूंगा। चूंकि यह वह चांदनी था जिसे मैं ढूंढ रहा था, मैं इसे एक चांदनी के लिए ले जाऊंगा। –

+0

@ माइकऑटिंक आपका स्वागत है। मैं एक बार 'StartCoroutine' और' StopCoroutine' फ़ंक्शन 'का उपयोग करने में सक्षम नहीं होने की इस समस्या में भाग गया। इस तरह मैंने इसे हल किया। कभी-कभी, आपको अपनी स्क्रिप्ट 'MonoBehaviour' से प्राप्त करने की आवश्यकता नहीं है। अन्य बार आप करते हैं। यह आपकी परिस्थिति पर निर्भर करता है लेकिन यह उत्तर केवल यह दिखाने के लिए है कि 'मोनोबेविर' को आपके द्वारा पूछे जाने वाले अन्य स्क्रिप्ट में कैसे पास किया जाए। जो का जवाब भी काम करना चाहिए। हैप्पी कोडिंग! – Programmer

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