这是我的原始代码,工作正常,但文本内容已经在Text UI的编辑器中,因此也位于变量textField中。 因此,我不想在代码内也再次键入文本。例如,单词toBeSearched是“几乎”,因此使用字符串格式,每当我在单词“几乎”和“小时”之间按空格时,它将生成一个新的随机数。
但是由于文本已经在textField变量中,所以我想解析该位置,我想使用indexof和substring自动添加随机数。
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class CustomText : MonoBehaviour
{
public string toBeSearched;
public Text textField;
private void Start()
{
GenerateRandomHour();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
GenerateRandomHour();
}
}
private void GenerateRandomHour()
{
string numberName = Random.Range(1, 10).ToString();
textField.text = string.Format("Hello my friend, It's about time to wakeup. You were sleeping for almost {0} hours. My name is NAVI and i'm your navigation helper in the game.", numberName);
}
}
这是我尝试使用的带有indexof和substring的代码,但是它无法正常工作。
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class CustomText : MonoBehaviour
{
public string toBeSearched;
public Text textField;
private void Start()
{
GenerateRandomHour();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
GenerateRandomHour();
}
}
private void GenerateRandomHour()
{
string result = null;
string result1 = null;
int ix = textField.text.IndexOf(toBeSearched);
if (ix != -1)
{
result = textField.text.Substring(0, ix + toBeSearched.Length);
result1 = textField.text.Substring(ix + toBeSearched.Length, textField.text.Length - (ix + toBeSearched.Length));
}
result1 = result1.TrimStart();
string numberName = Random.Range(1, 10).ToString();
textField.text = string.Format(result + " {0} " + result1, numberName);
}
}
再次,toBeSearched这个词是“几乎”,我使用了一个断点,结果包含的文本直到几乎:“你好,我的朋友,这是时候醒来了。你几乎要睡觉了”,变量result1包含其余的文字:“小时。我叫NAVI,我是游戏中的导航助手。”
但是现在当我按下空格键时,它每次都会插入一个新的随机数,但并不能像上面的原始代码那样替换整个文本。 因此结果是文本中有很多数字。
不确定为什么它不能像原始代码那样工作。
答案 0 :(得分:2)
它不起作用的原因是因为您正在更改textField.text
的值,所以当您重复该过程时,将使用此新值(包括数字)来生成子字符串。您不应该放弃第一个解决方案,它更清洁。将文本字段的原始值存储在“开始”上:
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class CustomText : MonoBehaviour
{
public string toBeSearched;
public Text textField;
private string defaultValue;
private void Start()
{
defaultValue = textField.text;
GenerateRandomHour();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
GenerateRandomHour();
}
}
private void GenerateRandomHour()
{
string numberName = Random.Range(1, 10).ToString();
textField.text = string.Format(defaultValue, numberName);
}
}
将{0}直接添加到检查器中的文本字段值:
你好,我的朋友,该醒了。您已经睡了将近{0}小时。我叫NAVI,我是游戏中的导航助手。
答案 1 :(得分:2)
问题是当您在指定位置添加数字时,因此每次按空格键时,它都会使用现有文本作为模板,因此旧数字会保留下来,并添加一个新数字。
相反,您想在“几乎”和“小时”这两个词之间进行搜索,以便可以替换它们之间的所有内容。您可以通过添加另一个indexOf搜索来做到这一点,但是使用正则表达式会更容易。
string result = Regex.Replace(textField.text, "(? <=almost).+?(?=hours)" , numberName);
textField.text = result;
尽管您的第一个解决方案看起来更干净,并且如果您想将文本保留在检查器中,那么纳塔利娅的答案会起作用