我怎样才能使这个字符串与协程字典一起工作?

How can I make this string to coroutine dictionary working?

我目前正在尝试在 unity 下制作协程字典。这个想法是,有几个角色,当玩家按下一个按钮时,它会调用一个查找字典的函数,并 运行 建立一个与角色能力相对应的协程(因为每个角色都有不同的能力)。

我的代码如下所示:

private string characterName // The name of the player's character

private Dictionary<string, IEnumerator> abilitiesDictionary = new Dictionary<string, IEnumerator>(); 

void Start() // I'm assigning values to the dictionary in the start function
{
    abilitiesDictionary["character01"] = Routine01();
    abilitiesDictionary["character02"] = Routine02();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.A))
    {
         StartCoroutine(abilitiesDictionary[characterName]
    }
}

private IEnumerator Routine01()
{
    yield return new WaitForSeconds(1);
    print("Routine 01 has run !") 
}

private IEnumerator Routine02()
{
    yield return new WaitForSeconds(1);
    print("Routine 02 has run !") 
}

但是,我有一个问题:协程只会 运行 每个场景重新加载一次。我只能 运行 一次,之后它就不再工作了。我有什么误解吗?我不完全理解 IEnumerator 在统一用于协程目的时迭代的方式。

感谢您的宝贵时间和回答

不存储枚举器,而是存储函数。

private Dictionary<string, Func<IEnumerator>> coroutines = new Dictionary<string, Func<IEnumerator>>();

将例程添加到字典

coroutines.Add("1", Routine1);
coroutines.Add("2", Routine2);

执行

StartCoroutine(coroutines["1"].Invoke());

C# 中的 IEnumerator 是一种用于遍历可枚举 (IEnumerable) 的东西。大多数情况下,这用于遍历集合(数组、列表等)。一旦枚举器被用于遍历,它应该被重置以允许再次遍历。

您的函数 Routine01 returns 一个 IEnumerator。当您使用此函数初始化字典时,您会调用它(在函数名称后用双括号表示 - Routine01())。这意味着您创建了一个 IEnumerator once。之后,无论您按键访问字典多少次,每次都会得到相同的 IEnumerator。

在 Unity 中,IEnumerator 以 pseudo-parallel 的方式用于 运行 多项任务。简而言之,当迭代这个枚举器时,Unity 引擎神奇地迭代这个并行任务 - 它 returns 一次又一次地到你的 IEnumerator 直到它描述的任务结束(在你的情况下 - 直到一秒钟过去)。

您的错误是每次都使用相同的 IEnumerator(您使用 Routine01() 创建了它一次,并在每次按键时访问它)。如果迭代已经结束,Unity 无法迭代您的 IEnumerator。它什么都不做。您应该在每次按下该键时生成一个新的 IEnumerator,或者在现有枚举器上调用 Reset(),这样 Unity 就可以 re-iterate 通过它。

@hijinxbassist 在他的回答中展示了如何实现前者(每次都生成新的 IEnumerator)