[英]Unity C# function not working with IEnumerator
所以我有一个脚本,当您单击一个按钮时会播放电影。 我有一个IEnumerator来查看电影是否结束以及何时关闭。 在添加IEnumerator之前,我的代码运行良好,现在无法调用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));
}
private IEnumerator FindEnd(Action callback)
{
while (myMovie.isPlaying)
{
yield return 0;
}
callback ();
yield break;
}
Unity事件系统不会显示您的方法,因为它将动作作为参数。 您必须对该方法进行零参数重载。
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));
}
为什么会发生这种情况的任何想法?
将Unity UI事件分配给功能时,存在一些限制。 这些是我记得的一些限制:
1。回调函数只能有一个参数。
2。回调函数必须是void函数。
3。回调函数参数类型必须继承自Object。
由于Action
为代表,它不符合#3的要求,在编辑器不支持。
您可以通过执行脚本(而不是编辑器)中的Button回调来删除所有限制。 您可以通过注册到Button.onClick
事件来实现。
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();
}
您无法在统一编辑器中从事件系统引用带有Action参数的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.