C# 为什么我';当尝试播放动画剪辑时,我遇到异常InvalidOperationException?

C# 为什么我';当尝试播放动画剪辑时,我遇到异常InvalidOperationException?,c#,unity3d,C#,Unity3d,我正在尝试播放包含maximo的所有动画剪辑 我调用方法Init并开始播放动画的唯一一个剧本是在以下脚本中: foreach (var randClip in clipsList) 您在中的AnimatorController的更新中多次启动协同程序 playanimation.Init(); 这是“不允许的”->请查看您的异常 确保只运行一次例程: clipsList.Shuffle(); 或/和通常优化AnimatorController以避免这些冗余调用。您在中的AnimatorC

我正在尝试播放包含
maximo
的所有动画剪辑

我调用方法Init并开始播放动画的唯一一个剧本是在以下脚本中:

foreach (var randClip in clipsList)

您在中的
AnimatorController
更新中多次启动协同程序

playanimation.Init();
这是“不允许的”->请查看您的异常


确保只运行一次例程:

clipsList.Shuffle();

或/和通常优化
AnimatorController
以避免这些冗余调用。

您在中的
AnimatorController
更新中多次启动协同程序

playanimation.Init();
这是“不允许的”->请查看您的异常


确保只运行一次例程:

clipsList.Shuffle();

或/并通常优化
动画控制器
,以避免这些冗余调用。

尝试了脚本,但无法复制。在foreach循环中是否还有其他更改
randClip
列表的操作,如添加或删除项目?请查看错误消息。它告诉你什么?它告诉您“枚举操作可能无法执行”,因为“集合已被修改”。现在,正如您所指出的,这里抛出异常:
foreach(clipsList中的var randClip)
。那么,这个错误可能涉及哪些集合?在何处(何时)修改该集合?如果您弄明白了这一点,那么您将需要弄明白(这是您必须进行的疑难解答中更困难的部分)为什么在调用
foreach(clipsList中的var randClip)时调用修改集合的方法
loop is executingAs在你发布它时说它对我有效。我在我的问题中添加了唯一一个调用方法Init并开始播放动画的脚本。但我不确定为什么这会是一个问题。我尝试了你的脚本,但无法复制它。在foreach循环中是否还有其他更改
randClip
列表的操作,如添加或删除项目?请查看错误消息。它告诉你什么?它告诉您“枚举操作可能无法执行”,因为“集合已被修改”。现在,正如您所指出的,这里抛出异常:
foreach(clipsList中的var randClip)
。那么,这个错误可能涉及哪些集合?在何处(何时)修改该集合?如果您弄明白了这一点,那么您将需要弄明白(这是您必须进行的疑难解答中更困难的部分)为什么在调用
foreach(clipsList中的var randClip)时调用修改集合的方法
loop is executingAs在你发布它时说它对我有效。我在我的问题中添加了唯一一个调用方法Init并开始播放动画的脚本。但是我不确定为什么这会是一个问题。对于这个错误,这可以正常工作,但是现在我在编辑器中得到警告,每次它试图在以下行的while循环中播放动画:animator.play(randClip.name);警告是:无效的层索引“-1”所有这些mixamo动画都在子状态机中,而不是在另一层中。但当我在唤醒结束时放置断点时,我看到剪辑包含所有mixamo动画剪辑。所以我不知道为什么会有这样的警告?这是为了避免播放剪辑。@DubiDuboni我不知道你的完整设置。对我来说,在子状态机(
subMachine
)中放置状态/剪辑时,它也在工作(请参阅)。我没有收到任何警告或错误。对于此错误,这可以正常工作,但现在每当编辑器尝试在以下行的while循环中播放动画时,我都会收到警告:animator.play(randClip.name);警告是:无效的层索引“-1”所有这些mixamo动画都在子状态机中,而不是在另一层中。但当我在唤醒结束时放置断点时,我看到剪辑包含所有mixamo动画剪辑。所以我不知道为什么会有这样的警告?这是为了避免播放剪辑。@DubiDuboni我不知道你的完整设置。对我来说,在子状态机(
subMachine
)中放置状态/剪辑时,它也在工作(请参阅)。我没有收到任何警告或错误。
clipsList.Shuffle();
private bool wasInitialized;

public void Init()
{
    // Only start the coroutine if not initialized yet
    if (!wasInitialized && clipsList.Count > 0)
    {
        wasInitialized = true;
        StartCoroutine(PlayRandomly());
    }
}