C# 是否可以将变量类型返回到调用协同程序的脚本?

C# 是否可以将变量类型返回到调用协同程序的脚本?,c#,unity3d,C#,Unity3d,好的,我在游戏中有一个对话系统。它的设计非常简单。每个对话包含NPC将要说的节点列表,对于每个节点,还有一个选项列表,玩家可以选择结束对话或继续。对话部分完美无瑕。我想做的是把它和任务系统结合起来。在我进入我的任务系统之前,我需要找到一种方法将我的对话系统连接到我的任务系统或NPC(最好是我的NPC)。我的对话系统是以单例模式建立的,每个NPC只需调用一个方法,根据其局部对话变量与玩家开始对话 我一直坐在这里思考如何将一个值从对话管理器传递给我的NPC,但是考虑到我的run方法是一个协程,如果需

好的,我在游戏中有一个对话系统。它的设计非常简单。每个对话包含NPC将要说的节点列表,对于每个节点,还有一个选项列表,玩家可以选择结束对话或继续。对话部分完美无瑕。我想做的是把它和任务系统结合起来。在我进入我的任务系统之前,我需要找到一种方法将我的对话系统连接到我的任务系统或NPC(最好是我的NPC)。我的对话系统是以单例模式建立的,每个NPC只需调用一个方法,根据其局部对话变量与玩家开始对话

我一直坐在这里思考如何将一个值从对话管理器传递给我的NPC,但是考虑到我的
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)。

问题在于,要检索返回值的函数必须等待协程结束,这将在程序正常时停止程序,同步函数。问题是,要检索返回值的函数必须等待协程结束,如果它是一个正常的同步函数,这只会停止程序。