C# 统一界面弹出

C# 统一界面弹出,c#,unity3d,C#,Unity3d,我对团结是个新手,我只是对其中的许多原则一无所知 我建立了一个对话系统,它工作得很好,但我想做一个确认框 我已经成功地打开了确认框,但我似乎不知道如何等待按下一个“是/否”按钮,然后才能将代码返回到带有正确bool的对话管理器 现在代码在对话框后面继续。这是意料之中的 我试过一个统计员,但我一定是做错了,因为这无关紧要 我刚刚清理了代码,试图从头开始 public bool AskForTakingMoney(){ takingMoneyBox.SetActive(true);

我对团结是个新手,我只是对其中的许多原则一无所知

我建立了一个对话系统,它工作得很好,但我想做一个确认框

我已经成功地打开了确认框,但我似乎不知道如何等待按下一个“是/否”按钮,然后才能将代码返回到带有正确bool的对话管理器

现在代码在对话框后面继续。这是意料之中的

我试过一个统计员,但我一定是做错了,因为这无关紧要

我刚刚清理了代码,试图从头开始

public bool AskForTakingMoney(){
        takingMoneyBox.SetActive(true);
        goldText.text = "Current Gold: " + GameManager.instance.currentGold.ToString() + "G";
        questionText.text = "Pay the " + DialogManager.instance.goldAmount + "G?";
        //Wait here until yes or no button pushed
        return saysYes;
    }
    public void SaysYes(){
        saysYes = true;
        selectedAnswer = true;
        takingMoneyBox.SetActive(false);
    }
     public void SaysNo(){
        saysYes = false;
        selectedAnswer = true;
        takingMoneyBox.SetActive(false);

    }
我真的只需要返回功能不返回,直到是或否按钮被按下


我完全不知所措。

制作两个按钮,在AskForTakingMoney()末尾将它们设置为活动,使这些按钮指向SaysYes();并说:()


编辑:如果需要澄清,请发表评论。我可能不太明白你的意思。你有按钮设置吗

如果通过检查所选的拒绝变量按下按钮,则需要函数不关心返回他们单击的内容,以及每个帧检查(在更新方法中,或在协同程序中)

或者,您可以在单独的线程中运行一些代码,并使用WaitHandle,使线程暂停,直到按下按钮为止

使用代码的示例:

using System.Threading;
using UnityEngine;

public class Manager : MonoBehaviour
{
    EventWaitHandle handle = new EventWaitHandle(false,EventResetMode.AutoReset);
    Thread _thread;
    public void StartThread()
    {
        _thread = new Thread(BackgroundThreadFunction);
        _thread.Start();
    }

    public void BackgroundThreadFunction()
    {
        if (AskForTakingMoney())
        {
            //Yes
        }
        else
        {
            //No
        }
    }

    public bool AskForTakingMoney()
    {
        takingMoneyBox.SetActive(true);
        goldText.text = "Current Gold: " + GameManager.instance.currentGold.ToString() + "G";
        questionText.text = "Pay the " + DialogManager.instance.goldAmount + "G?";

        //Wait here until yes or no button pushed
        handle.WaitOne();

        return saysYes;
    }

    public void SaysYes()
    {
        saysYes = true;
        selectedAnswer = true;
        takingMoneyBox.SetActive(false);

        handle.Set();
    }

    public void SaysNo()
    {
        saysYes = false;
        selectedAnswer = true;
        takingMoneyBox.SetActive(false);

        handle.Set();
    }
}

如果您想显示一个弹出窗口,那么弹出窗口应该负责接下来发生的事情

因此,您的
AskForTakingMoney
永远不会返回值。相反,您需要为Yes和No按钮分配
onclick
事件

您的代码应该是:

public void AskForTakingMoney(){
        takingMoneyBox.SetActive(true);
        goldText.text = "Current Gold: " + GameManager.instance.currentGold.ToString() + "G";
        questionText.text = "Pay the " + DialogManager.instance.goldAmount + "G?";
    }

    public void SaysYes(){           
        takingMoneyBox.SetActive(false);
        // Your withdraw money code here.
    }

     public void SaysNo(){
        takingMoneyBox.SetActive(false);
    }
然后在编辑器中,单击“是”按钮。 您应该会看到一个像图中一样的onclick字段。单击加号,然后拖入MonoBehavior对象,该对象包含具有上述函数的代码。 将其拖入后,您应该能够从“YourScriptName”->“SaysYes()”下出现的下拉列表中选择
SaysYes

对你的“否”按钮也做同样的操作,你应该都设置好了


这就是它的设置方式。如果角色需要钱来完成任务,我的对话管理器就会调用“拿钱”脚本。这就是所谓的确认弹出窗口。照你说的做。我需要脚本返回true或false值(除非我接近错误的值),以便让对话框管理员知道如何取款或放弃对话框。您可以通过将
取款代码
添加到
SaysYes()
方法中来取款。放弃对话框只不过是在
SaysNo()
方法中将对话框设置为非活动状态。这是有道理的,但在继续下一行代码之前,对话框管理器仍需要知道您是否按下了“是”键。编辑-我明白你的意思。让我玩一些代码,看看我想出了什么。我在理解你的问题陈述时有些困难。你不能简单地从
SaysYes()
方法中调用类似于
DialogManager.Instance.yes的东西吗?好的,我认为你解释流程的方式在很大程度上是有效的。现在发生的是我的DialogManager控制着对话框的流程,当涉及到我预先确定的字符串时,当角色要钱时,在这个脚本中弹出窗口。这取决于角色说是还是否,这将决定对话是否会继续。但是我想我要尝试的是你的代码,不管怎样,只要让它移到下一行,按下no按钮就会关闭no按钮上的所有内容。这就是它的设置方式。问题是,对话框管理器是调用此弹出窗口的工具,它需要知道您是否选择了“是”或“否”。现在,它调用“拿钱”脚本,然后在弹出窗口发生后继续运行,并自动返回一个不拿钱的值。我尝试过这样做,但我不确定它何时会响应UI按钮的按下。通过第一个功能控制弹出窗口,然后将下面的两个功能绑定到“是”或“否”按钮。按照现在设置的方式,响应仍然会通过并推送错误的结果。