C# 统一界面弹出
我对团结是个新手,我只是对其中的许多原则一无所知 我建立了一个对话系统,它工作得很好,但我想做一个确认框 我已经成功地打开了确认框,但我似乎不知道如何等待按下一个“是/否”按钮,然后才能将代码返回到带有正确bool的对话管理器 现在代码在对话框后面继续。这是意料之中的 我试过一个统计员,但我一定是做错了,因为这无关紧要 我刚刚清理了代码,试图从头开始C# 统一界面弹出,c#,unity3d,C#,Unity3d,我对团结是个新手,我只是对其中的许多原则一无所知 我建立了一个对话系统,它工作得很好,但我想做一个确认框 我已经成功地打开了确认框,但我似乎不知道如何等待按下一个“是/否”按钮,然后才能将代码返回到带有正确bool的对话管理器 现在代码在对话框后面继续。这是意料之中的 我试过一个统计员,但我一定是做错了,因为这无关紧要 我刚刚清理了代码,试图从头开始 public bool AskForTakingMoney(){ takingMoneyBox.SetActive(true);
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按钮的按下。通过第一个功能控制弹出窗口,然后将下面的两个功能绑定到“是”或“否”按钮。按照现在设置的方式,响应仍然会通过并推送错误的结果。