C# 是否可以将变量类型返回到调用协同程序的脚本?
好的,我在游戏中有一个对话系统。它的设计非常简单。每个对话包含NPC将要说的节点列表,对于每个节点,还有一个选项列表,玩家可以选择结束对话或继续。对话部分完美无瑕。我想做的是把它和任务系统结合起来。在我进入我的任务系统之前,我需要找到一种方法将我的对话系统连接到我的任务系统或NPC(最好是我的NPC)。我的对话系统是以单例模式建立的,每个NPC只需调用一个方法,根据其局部对话变量与玩家开始对话 我一直坐在这里思考如何将一个值从对话管理器传递给我的NPC,但是考虑到我的C# 是否可以将变量类型返回到调用协同程序的脚本?,c#,unity3d,C#,Unity3d,好的,我在游戏中有一个对话系统。它的设计非常简单。每个对话包含NPC将要说的节点列表,对于每个节点,还有一个选项列表,玩家可以选择结束对话或继续。对话部分完美无瑕。我想做的是把它和任务系统结合起来。在我进入我的任务系统之前,我需要找到一种方法将我的对话系统连接到我的任务系统或NPC(最好是我的NPC)。我的对话系统是以单例模式建立的,每个NPC只需调用一个方法,根据其局部对话变量与玩家开始对话 我一直坐在这里思考如何将一个值从对话管理器传递给我的NPC,但是考虑到我的run方法是一个协程,如果需
run
方法是一个协程,如果需要的话,我不知道如何在退出协程后返回该值。我觉得这应该是可能的,但我真的想不出一个方法来做到这一点。任何帮助都将不胜感激
理想的情况是让RunDialogue
方法返回变量类型(bool?),但只有在run
方法中调用了EndDialogue
之后。如果返回true,则分配任务,否则不执行任何操作
从对话框管理器:
public void RunDialogue(Dialogue dia)
{
StartCoroutine(run(dia));
}
IEnumerator run(Dialogue dia)
{
DialoguePanel.SetActive(true);
//start the convo
int node_id = 0;
//if the node is equal to -1 end the conversation
while (node_id != -1)
{
//display the current node
DisplayNode(dia.Nodes[node_id]);
//reset the selected option
selected_option = -2;
//wait here until a selection is made by button click
while (selected_option == -2)
{
yield return new WaitForSeconds(0.25f);
}
//get the new id since it has changed
node_id = selected_option;
}
//the user exited the conversation
EndDialogue();
}
从NPC:
public override void Interact()
{
DialogueManager.Instance.RunDialogue(dialogue);
}
有一种方法可以使协同程序返回一个值。需要一些嵌套,如果您想这样做,可以查看此视频: 否则,您可以将回调传递给协同程序。这可能对你有用 在有意义的地方添加一些功能(例如NPC): 将其添加到对话通话中:
public override void Interact()
{
DialogueManager.Instance.RunDialogue(dialogue, OnGiveQuest);
}
然后将RunDialogue
和run
更改为接受回调:
public void RunDialogue(Dialogue dia, System.Action callback = null)
{
StartCoroutine(run(dia, callback));
}
现在,对于协同程序,您可以将回调进一步传递到EndDialogue
,或者在结束调用后在这里处理它
IEnumerator run(Dialogue dia, System.Action callback = null)
{
...
//the user exited the conversation
EndDialogue();
if(callback != null)
callback();
}
现在,我的方法是,如果你想开始一个任务,你只需要添加回调。否则您只需将其忽略(默认值为null)。有一种方法可以使协同程序返回一个值。需要一些嵌套,如果您想这样做,可以查看此视频: 否则,您可以将回调传递给协同程序。这可能对你有用 在有意义的地方添加一些功能(例如NPC): 将其添加到对话通话中:
public override void Interact()
{
DialogueManager.Instance.RunDialogue(dialogue, OnGiveQuest);
}
然后将RunDialogue
和run
更改为接受回调:
public void RunDialogue(Dialogue dia, System.Action callback = null)
{
StartCoroutine(run(dia, callback));
}
现在,对于协同程序,您可以将回调进一步传递到EndDialogue
,或者在结束调用后在这里处理它
IEnumerator run(Dialogue dia, System.Action callback = null)
{
...
//the user exited the conversation
EndDialogue();
if(callback != null)
callback();
}
现在,我的方法是,如果你想开始一个任务,你只需要添加回调。否则,您只需将其忽略(默认值为null)。问题在于,要检索返回值的函数必须等待协程结束,这将在程序正常时停止程序,同步函数。问题是,要检索返回值的函数必须等待协程结束,如果它是一个正常的同步函数,这只会停止程序。