这就是游戏的样子:
玩家必须按照上段的正确顺序点击下半部分中的单词。
例如,上段以" This"开头,用户必须找到并触摸"此"在下半部分。他有3次尝试让它正确。如果他点击了错误的单词,他就会失去生命。
在我的代码中,我设法通过检查它们之间的空格和点来分隔第一个字符串中的单词,并使用StringBuilder添加单个字母,然后将其转移到另一个字符串存储整个单词。
//Proper Working Code
public class Queue2Test : MonoBehaviour {
private string paraString = "This is not the end of the line. This is only the beginning. It cannot get much worse.";
private StringBuilder buffer;
private string finalString;
private int counter;
void Start () {
buffer = new StringBuilder ();
finalString = null;
counter = 0;
dothis ();
}
void dothis () {
for (counter = 0; counter < paraString.Length; counter++) {
buffer = buffer.Append(paraString[counter]);
if (paraString[counter] == ' ' || paraString[counter] == '.') {
//buffer.Remove(counter,1);
finalString = buffer.ToString();
buffer.Length = 0;
print (finalString);
}
}
}
}
哪个有效。上面代码的输出是逐个打印的所有单词。现在我想要做的是,改变这一点,只有当我点击鼠标时才会打印每个单词。为此,我做到了这一点:
// This code needs editing:
public class Queue3Test : MonoBehaviour {
private string paraString = "This is not the end of the line. This is only the beginning. It cannot get much worse.";
private StringBuilder buffer;
private string finalString;
private int counter;
private bool flag;
private int tempvalue;
void Start () {
buffer = new StringBuilder ();
finalString = null;
counter = 0;
flag = false;
tempvalue = 0;
}
void Update () {
if (flag) {
dothis ();
}
}
void OnMouseDown () {
flag = true;
//print (flag);
}
void dothis () {
for (counter = tempvalue; counter < paraString.Length; counter++) {
buffer = buffer.Append(paraString[counter]);
if (flag) {
if (paraString[counter] == ' ' || paraString[counter] == '.') {
//buffer.Remove(counter,1);
finalString = buffer.ToString();
buffer.Length = 0;
print (finalString);
tempvalue = counter;
flag = false;
continue;
}
//break;
}
}
}
}
此代码的输出为:
This //First Click
is not the end of the line. This is only the beginning. It cannot get much worse. //Second Click
此代码在第一次单击后打印第一行,在第二次单击时,它会一次打印剩余行! 我希望在鼠标单击上一个接一个地单独打印每个单词。
我点击段落右侧的小对撞机来调用鼠标点击功能。
我是使用C#进行编程的新手,我正在为我的大学项目制作这个游戏。任何有用的帮助都会有用,或者只是指向正确的方向。我肯定会提到游戏中的回答者名字!!!
感谢。 :)
答案 0 :(得分:1)
首先,关于你的第一个问题。 您所要做的就是致电
words = paraString
.Split(new[] { ' ', '.' }, StringSplitOptions.RemoveEmptyEntries)
.ToList();
这将返回一个单词数组,忽略所有空格和空格。从现在开始,你可以做这样的事情:
void OnMouseDown() {
var wordToShow = words.Skip(currentWord).FirstOrDefault();
if (!String.IsNullOrEmpty(wordToShow)) {
currentWord++;
Debug.Log(wordToShow);
} else {
Debug.Log("Nothing left...");
}
}
请确保将单词列表存储为行为脚本的私有字段,如下所示:
private IList<string> words;
您可以通过在Start()或Awake()函数中拆分输入字符串来初始化它。我会用start。
答案 1 :(得分:0)
首先,您应该避免使用这种命名变量和函数的方式(flag,dothis)。 第二,你没有选择合适的解决方案来解决任务。它可以更简单地解决。
using UnityEngine;
using System;
public class Queue3Test : MonoBehaviour {
private string paraString = "This is not the end of the line. This is only the beginning. It cannot get much worse.";
private string[] words;
private int counter = 0;
private void Start()
{
InitializeParaString();
}
private void OnMouseDown()
{
ShowNextWord();
}
private void InitializeParaString()
{
counter = 0;
words = paraString.Split(new[] { '.', ' ' }, StringSplitOptions.RemoveEmptyEntries);
}
private void ShowNextWord()
{
if (counter < words.Length)
{
print(words[counter]);
counter++;
}
}
}
祝你好运!