我怎样才能使这个字符串与协程字典一起工作?
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)
我目前正在尝试在 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)