C# 我不知道我是否用得太多';返回新的WaitForSeconds';在协程函数中

C# 我不知道我是否用得太多';返回新的WaitForSeconds';在协程函数中,c#,unity3d,coroutine,C#,Unity3d,Coroutine,**单元5.6.5f1/C# 我使用了一个协同程序来运行动画 而不是在update函数中创建多个if语句 我认为合作会更好 但我想我用了太多的“收益回报新WaitForSeconds” 以这种方式编写协同程序是常见的吗 private IEnumerator AnimationControl() { yield return new WaitForSeconds(41f); objAni.gameObject.SetActive(true); obj2An

**单元5.6.5f1/C#

我使用了一个协同程序来运行动画

而不是在update函数中创建多个if语句

我认为合作会更好

但我想我用了太多的“收益回报新WaitForSeconds”

以这种方式编写协同程序是常见的吗

private IEnumerator AnimationControl()
{
    yield return new WaitForSeconds(41f);        
    objAni.gameObject.SetActive(true);
    obj2Ani.gameObject.SetActive(true);
    obj3Ani.gameObject.SetActive(true);
    objAni.Play("Stay");
    obj2Ani.Play("Stay");
    obj3Ani.Play("Stay");

    yield return new WaitForSeconds(5.667f);        
    objAni.Play("Run");
    obj2Ani.Play("Run");
    obj3Ani.Play("Action");

    yield return new WaitForSeconds(3.666f);
    objAni.Play("Fire01");

    yield return new WaitForSeconds(2.334f);
    obj3Ani.Play("Panic");
    obj2Ani.gameObject.SetActive(false);

    yield return new WaitForSeconds(8.333f);
    objAni.Play("Fire02");

    yield return new WaitForSeconds(6.333f);      
    objAni.Play("Fire03");

    yield return new WaitForSeconds(6.1337f);       
    obj3Ani.Play("Stay");
    objAni.Play("Stay");

    yield return new WaitForSeconds(3.2003f);        
    obj3Ani.Play("Surprise02");
    objAni.Play("Surprise");

    yield return new WaitForSeconds(3.333f);                
    obj3Ani.Play("Run");
    objAni.Play("Run");

    yield return new WaitForSeconds(6f);
    objAni.Play("Stay");

    yield return new WaitForSeconds(1.667f);      
    objAni.Play("Run");

    yield return new WaitForSeconds(2.333f);        
    obj3Ani.gameObject.SetActive(false);

    yield return new WaitForSeconds(0.667f);        
    objAni.gameObject.SetActive(false);

    yield return new WaitForSeconds(1.333f);
    textObj.SetActive(false);

    yield return new WaitForSeconds(2.667f);
    endingObj.SetActive(true);
    allObj.SetActive(false);
}

感谢阅读。

这正是协同程序的用途,即按顺序执行许多代码,甚至随时等待。其实不算太多。我看到的唯一问题是每次都创建新的
WaitForSeconds
。如果您知道等待的时间或硬编码时间,请在函数外部声明
WaitForSeconds
,然后对其让步。这实际上取决于调用
AnimationControl
函数的频率

比如说,

private IEnumerator AnimationControl()
{
    yield return new WaitForSeconds(41f);
    objAni.gameObject.SetActive(true);
    obj2Ani.gameObject.SetActive(true);
    obj3Ani.gameObject.SetActive(true);
    objAni.Play("Stay");
    obj2Ani.Play("Stay");
    obj3Ani.Play("Stay");

    yield return new WaitForSeconds(5.667f);
    objAni.Play("Run");
    obj2Ani.Play("Run");
    obj3Ani.Play("Action");
}
变成

WaitForSeconds wTime1 = new WaitForSeconds(41f);
WaitForSeconds wTime2 = new WaitForSeconds(5.667f);

private IEnumerator AnimationControl()
{
    yield return wTime1;
    objAni.gameObject.SetActive(true);
    obj2Ani.gameObject.SetActive(true);
    obj3Ani.gameObject.SetActive(true);
    objAni.Play("Stay");
    obj2Ani.Play("Stay");
    obj3Ani.Play("Stay");

    yield return wTime2;
    objAni.Play("Run");
    obj2Ani.Play("Run");
    obj3Ani.Play("Action");
}


如果您真的想减少
WaitForSeconds
代码,可以围绕它创建一个包装类。这个类应该保留等待的时间,甚至更好,
WaitForSeconds
实例,然后使用
Action
表示等待后要执行的代码。创建此
类的
列表
,在其上循环,等待,然后执行
操作
变量中的代码

包装器类:

public class AnimControlInfo
{
    public WaitForSeconds waitTime;
    public Action action;
}
创建它的列表:

List<AnimControlInfo> animInfo = new List<AnimControlInfo>();
然后使用新的
AnimationControl
功能等待并播放动画或激活/取消激活游戏对象:

private IEnumerator AnimationControl()
{
    //Loop over the List, wait then do action
    for (int i = 0; i < animInfo.Count; i++)
    {
        yield return animInfo[i].waitTime;
        if (animInfo[i].action != null)
            animInfo[i].action();
    }
}
private IEnumerator AnimationControl()
{
//在列表上循环,等待,然后执行操作
for(int i=0;i

AnimationControl
功能中的代码量已减少。它还减少了对
WaitForSeconds
类的过度使用。

这看起来像是一场即将发生的灾难。您应该研究如何在Unity中制作适当的动画。最好在每次等待后提及并显示您正在运行的代码。我认为这将决定是否有更好的方法来做这件事看起来你正在尝试做一个剪接场景。协同程序可能会起作用,但正确的方法是使用动画师和时间线。
private IEnumerator AnimationControl()
{
    //Loop over the List, wait then do action
    for (int i = 0; i < animInfo.Count; i++)
    {
        yield return animInfo[i].waitTime;
        if (animInfo[i].action != null)
            animInfo[i].action();
    }
}