我正在创建这个总和创建器,用户必须使用自定义键盘输入答案。并在复选按钮上单击,如果答案正确,则会加载新问题。
我的问题是在回答第一个问题后,答案按钮重置为空白,但是当用户键入下一个答案时,仅删除了最后一个字母(例如15个中的5个)。而当我输入14时,它显示114(先前输入答案中的1)。
我需要帮助将应答按钮文本重置为空白。
我使用按钮是因为稍后我想同时添加更多问题,以便用户可以单击并键入多个答案。
有人可以帮我吗?还请告诉我这是否是实现我想要的正确方法。
我正在调用退格功能以删除先前的答案,并将文本设置为空白。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Keyboard : MonoBehaviour
{
string word = null;
int wordIndex = -1;
string alpha = null;
string alpha2 = null;
public Text userAnswer1 = null;
public Text valueA, valueB;
public Text scoreCount;
private int a, b, answer1, score;
char[] nameChar = new char[5];
private void Start()
{
SumCreator();
}
public void nameFunc (string alphabet)
{
wordIndex++;
char[] keepchar = alphabet.ToCharArray();
nameChar[wordIndex] = keepchar[0];
alpha = nameChar[wordIndex].ToString();
word = word + alpha;
userAnswer1.text = word;
}
public void BackspaceFunction()
{
if (wordIndex >= 0)
{
wordIndex--;
alpha2 = null;
for (int i = 0; i < wordIndex + 1; i++)
{
alpha2 = alpha2 + nameChar[i].ToString();
}
word = alpha2;
userAnswer1.text = word;
}
}
public void SumCreator ()
{
a = Random.Range(0,15);
b = Random.Range(0,15);
answer1 = a + b;
valueA.text = a.ToString();
valueB.text = b.ToString();
scoreCount.text = "score " + score.ToString();
}
public void CheckAnswer()
{
Text buttonText = userAnswer1.GetComponentInChildren<Text>();
if (answer1 == int.Parse(userAnswer1.text))
{
score++;
// userAnswer1.text = string.Empty;
buttonText.text = string.Empty;
}
SumCreator();
}
}
答案 0 :(得分:1)
我已经编辑了答案,并删除了现在不相关的部分。
一旦单击“检查”按钮,首先擦除结果文本框中的文本,然后执行整个其他逻辑。 要擦除文本,您可以使用下一段代码:
Text buttonText = buttonName.GetComponentInChildren<Text>();
buttonText.text = string.Empty;
您可能希望将此“ buttonText”属性作为全局属性,并在程序开始时获取一次,而不是每次单击按钮时都获取它。在一个小规模的程序中,它不会有太大的区别,但这是一种正确的思维方式。
再检查一下代码后,我可以总结一下您的问题:
您的程序的整个逻辑都是有缺陷的,有许多不必要的复杂事情使它在多个地方失败。可以理解,每个人都经历了这个阶段,没有什么可羞愧或担心的。无论哪种方式,这都是我的主观意见,这可能是错误的。
回到您的代码,一旦发生任何事情,您要做的就是更新结果文本,说“ txtResult”。
单击数字后,请执行“ txtResult + = numberClicked”。
单击退格键后,删除txtResult的最后一个字符。 Here是一个有很多答案的问题,这很简单。
单击“检查”后,如果它是正确的数字,请将txtResult设置为空。
此外,每次更新txtResult时,当然也应该更新UI。假设您每次都这样做,则对于上述3种情况,更新txtResult都需要一行,而更新UI则需要一行。因此,总共有6行。在“退格”功能中检查空字符串会增加另一行。我的数学可能是错误的,但是无论哪种方式,这都是一种非常简短的方法,没有什么太复杂的。
您只是缺乏相关知识,否则您将不会在Backspace函数中做那个噩梦。
关于“ nameFunc”函数,整个6行都可以用“ txtResult + = Alphabet”代替,不是吗?我不确定您从字母参数中得到什么,但是无论哪种方式,字符串都是一个字符数组,因此您也可以执行“ txtResult + = Alphabet [0]”代替那里的内容。
因此,总的来说,您一切都很好,逻辑是正确的,您已经找到了主要方面。但是您使整个事情变得复杂了。我相信您在阅读完所有这些文字后会很好,并祝您一切顺利。
答案 1 :(得分:0)
如果您在成功输入答案后想清除Text对象,则不应调用“ BackSpace”功能。
只需将您的代码替换为此:
if (answer1 == int.Parse(userAnswer1.text))
{
score++;
userAnswer1.text = string.Empty;
这将清除文本元素。
您还可以考虑使用Unity中的InputFields,它们用于输入输入并自动支持退格键和其他键盘功能。 如果这样做,请确保将InputField的ContentType设置为Integer Number或Decimal Number