2016-12-12 3 views
-1

So habe ich ein Skript, dass, wenn Sie auf eine Schaltfläche klicken, ein Film abgespielt wird. Ich habe einen IEnumerator, um zu sehen, ob der Film vorbei ist und wann es geschlossen ist. Mein Code funktionierte gut, bis ich den IEnumerator hinzugefügt habe und jetzt kann ich die playMovie-Funktion nicht aufrufen.Unity C# -Funktion funktioniert nicht mit IEnumerator

Image of why I can't call playMovie

Alle Ideen, warum dies geschieht werden könnten? Dies ist, was der Code wie folgt aussieht:

public void playMovie(Action callback) 
    { 
     GetComponent<RawImage>().texture = myMovie as MovieTexture; 
    audio = GetComponent<AudioSource>(); 
     audio.clip = myMovie.audioClip; 
     myMovie.Play(); 
     audio.Play(); 

     StartCoroutine (FindEnd (callback)); 
    } 


private IEnumerator FindEnd(Action callback) 
    { 
     while (myMovie.isPlaying) 
     { 
      yield return 0; 
     } 
     callback(); 
     yield break; 

    } 
+1

Gibt die 'StartCoroutine' Methode tatsächlich den' IEnumerator' auf? (i. e. verwendet es "foreach"?) –

+0

"und jetzt kann ich die playMovie-Funktion nicht aufrufen": Warum nicht? Was passiert, wenn Sie es versuchen? – phoog

+0

Chris: Ich habe keine Ahnung, wie ich das überprüfen soll. – Amanda

Antwort

2

Das Unity-Ereignissystem zeigt Ihre Methode nicht an, weil sie eine Aktion als Argument benötigt. Sie müssen eine Null-Argument-Überladung für die Methode vornehmen.

public void playMovie() 
{ 
    playMovie(()=>{}) 
} 

public void playMovie(Action callback) 
{ 
    GetComponent<RawImage>().texture = myMovie as MovieTexture; 
    audio = GetComponent<AudioSource>(); 
    audio.clip = myMovie.audioClip; 
    myMovie.Play(); 
    audio.Play(); 

    StartCoroutine (FindEnd (callback)); 
} 
+0

Vielen Dank! Es funktioniert jetzt. – Amanda

0

Sie keine Methode mit Action-Parameter von Ereignissystem in der Einheit Editor verweisen kann.

1

Alle Ideen, warum dies geschieht werden könnten?

Es gibt Einschränkungen beim Zuweisen des Unity UI-Ereignisses zu einer Funktion. Dies sind einige der Einschränkungen, an die ich mich erinnere:

. Die Callback-Funktion sollte nur einen Parameter haben.

. Die Callback-Funktion muss eine ungültige Funktion sein.

.Der Parametertyp der Callback-Funktion muss von Object erben.

Seit Action ist ein Delegierter, ist es nicht # 3 Anforderung nicht erfüllt und ist nicht im Editor unterstützt.

Sie können alle die Einschränkungen entfernen, indem Sie den Button Callback from script anstelle des Editors ausführen. Sie können dies tun, indem Sie sich zum Button.onClick Ereignis anmelden.

public Button playButton; 

public void playMovie(Action callback) 
{ 
    GetComponent<RawImage>().texture = myMovie as MovieTexture; 
    audio = GetComponent<AudioSource>(); 
    audio.clip = myMovie.audioClip; 
    myMovie.Play(); 
    audio.Play(); 

    StartCoroutine(FindEnd(callback)); 
} 


private IEnumerator FindEnd(Action callback) 
{ 
    while (myMovie.isPlaying) 
    { 
     yield return 0; 
    } 

    callback(); 
    yield break; 
} 

void movieDonePlayingCallBack() 
{ 

} 

void OnEnable() 
{ 
    //Register Button Event 
    playButton.onClick.AddListener(() => buttonClickCallBack(playButton)); 

} 

private void buttonClickCallBack(Button buttonPressed) 
{ 
    if (buttonPressed == playButton) 
    { 
     //Your code for when Play Button is clicked 
     playMovie(movieDonePlayingCallBack); 
    } 
} 

void OnDisable() 
{ 
    //Un-Register Button Event 
    playButton.onClick.RemoveAllListeners(); 
}