繁体   English   中英

Unity C#函数不适用于IEnumerator

[英]Unity C# function not working with IEnumerator

所以我有一个脚本,当您单击一个按钮时会播放电影。 我有一个IEnumerator来查看电影是否结束以及何时关闭。 在添加IEnumerator之前,我的代码运行良好,现在无法调用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));
    }


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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM