2016-11-09 19 views
5

Jak możesz przekazać Monobehaviour wewnątrz instancji klasy innej niż Monobehaviour? Znalazłem to: link, w którym TonyLi wspomina, że ​​możesz przekazać Monobehaviour, aby rozpocząć i zatrzymać kontury wewnątrz instancji klasy, ale nie pokazuje, jak możesz to zrobić. Robi to theEvent.StartEvent (myMonoBehavour); ale on nie pokazuje, skąd pochodzi mójMonobehavour. Rozglądałem się w Internecie, ale nie potrafię znaleźć odpowiedzi.Użyj coroutine wewnątrz klasy innej niż MonoBehaviour

  • Edit

Oto co próbuję zrobić. Chcę uruchomić coroutine wewnątrz instancji klasy. Chciałbym również móc powstrzymać coroutine wewnątrz instancji klasy. Chcę to zrobić w ten sposób, że nie mam żadnych obiektów w mojej scenie, które mają dużych menedżerów, a także, że mogę ponownie użyć kodu dla dowolnego obiektu, który chcę pingpong w ten sposób. Kod przesuwa obiekt Gameobject w jednym kierunku, a następnie robi przerwę i przesuwa go w innym kierunku, i znowu robi przerwę itp. Ale nie mogę uruchomić korupcji spoza klasy.

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 
      ); 
    } 
} 

Druga klasa to gdzie mój współprogram jest.

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

Tak, na chwilę zadam moje pytanie. –

+0

Przebudowałem to pytanie. –

+0

Sprawdź odpowiedź, którą zostawiłem. Możesz użyć słowa kluczowego 'this'. – Programmer

Odpowiedz

7

TonyLi wspomina, że ​​można przekazać Monobehaviour do uruchamiania i zatrzymywania współprogram wewnątrz instancji klasy, ale robi nie pokazuje, w jaki sposób możesz to zrobić. Robi to:

Możesz to zrobić za pomocą słowa kluczowego this. To słowo kluczowe otrzyma bieżącą instancję z MonoBehaviour.

W tym przykładzie jest to drzewo, co zdarza się mieć komponent MonoScript:

enter image description here

Ten szczególny przypadek MonoScript może, jeśli chce, (ponieważ jest to aC# Program) instancji ogólnie C# klasy, NonMonoScript:

Klasa przekazać MonoBehaviour od:

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

klasy, który odbiera przechodzą MonoBehaviour instancję:

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!"); 
    } 
} 

Można również zapisać mono odwołanie z funkcji monoParser w zmiennej lokalnej być ponownie użyte.

+0

Dude - przeczytaj opis Mike'a: * "tak, że mogę ponownie użyć kodu dla każdego obiekt, który chcę pingpongować w ten sposób: kod przesuwa obiekt w jednym kierunku, a następnie robi przerwę i przesuwa go w innym kierunku "* WSZYSTKO, CO WYGLĄDA, TO JEST SKŁADNIKIEM PING-POING !!!!!!!! !!! – Fattie

+1

Dzięki chłopaki! Programista był dokładnie tym, czego szukałem. Joe Blow Zdaję sobie sprawę, że nie jest to najmądrzejszy sposób radzenia sobie z problemem, w którym się zajmuję i do twojego odkrycia. Ponieważ to był awnser, którego szukałem, wezmę to za awnser. –

+0

@MikeOttink Nie ma za co. Raz natknąłem się na ten problem polegający na niemożności korzystania z funkcji "StartCoroutine" i "StopCoroutine". Tak to rozwiązałem. Czasami nie musisz wyprowadzać swojego skryptu z 'MonoBehaviour'. Innym razem. To zależy od twojej sytuacji, ale ta odpowiedź jest tylko po to, aby pokazać, jak przekazać 'MonoBehaviour' innemu skryptowi, tak jak prosiłeś. Odpowiedź Joe powinna również zadziałać. Szczęśliwe kodowanie! – Programmer