Unity UI弹出

时间:2019-08-14 20:58:04

标签: c# unity3d

我是Unity的新手,而其中的许多校长我只是空白。

我建立了一个对话系统,并且运行良好,但是我想做一个确认框。

我设法将确认框拉起,但是我似乎无法弄清楚如何等待按“是/否”按钮之一,然后将代码以正确的布尔值返回给对话管理器。 / p>

现在,该代码会在对话框后推。这是预期的。

我尝试了一个枚举器,但是我一定做错了,因为没关系。

我只是清理了代码以尝试从头开始。

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);

    }

我真的只需要返回功能在按下“是”或“否”按钮之前不返回。

我完全不知所措。

3 个答案:

答案 0 :(得分:1)

如果要显示弹出窗口,则弹出窗口应负责接下来发生的事情。

因此您的AskForTakingMoney永远不要返回值。相反,您需要为“是”和“否”按钮分配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字段,如图中的字段。单击加号,然后将您的MonoBehaviour对象拖动到包含上述功能的代码中。 将其拖入后,您应该能够从“ YourScriptName”->“ SaysYes()”

下显示的下拉列表中选择SaysYes

对“无按钮”执行相同操作,您应该都准备就绪。

OnClick

答案 1 :(得分:0)

制作两个按钮,在AskForTakingMoney()结束时将它们设置为活动,使这些按钮指向SaysYes();。和SaysNo();

编辑:如果需要澄清,请发表评论。我可能不太了解您。您甚至还设置了按钮吗?

答案 2 :(得分:0)

您要么需要的功能就是不在乎返回所单击的内容,要么通过检查selectedAnswer变量来检查是否已按下按钮(在更新方法或协程中)每一帧。

或者您可以在单独的线程中运行一些代码,并使用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();
    }
}