如何使用indexof和substring和string.format在文本的特定位置添加随机数/文本?

时间:2018-07-11 05:12:54

标签: c# unity3d

这是我的原始代码,工作正常,但文本内容已经在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,我是游戏中的导航助手。”

但是现在当我按下空格键时,它每次都会插入一个新的随机数,但并不能像上面的原始代码那样替换整个文本。 因此结果是文本中有很多数字。

不确定为什么它不能像原始代码那样工作。

2 个答案:

答案 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;

尽管您的第一个解决方案看起来更干净,并且如果您想将文本保留在检查器中,那么纳塔利娅的答案会起作用