Замена динамической переменной в строке UNITY - PullRequest
0 голосов
/ 16 декабря 2018

Я делаю простую диалоговую систему и хотел бы "динамизировать" некоторые предложения.Например, у меня есть предложение

Привет, искатель приключений {{PlayerName}}!Добро пожаловать в мир!

Теперь в коде я пытаюсь заменить это реальным значением строки в моей игре.Я делаю что-то вроде этого.Но это не работает.У меня есть string PlayerName в моем компоненте, где находится функция

Regex regex = new Regex("(?<={{)(.*?)(?=}})");
MatchCollection matches = regex.Matches(sentence);

for(int i = 0; i < matches.Count; i++)
{
    Debug.Log(matches[i]);
    sentence.Replace("{{"+matches[i]+"}}", this.GetType().GetField(matches[i].ToString()).GetValue(this) as string);
}
return sentence;

Но это возвращает мне ошибку, даже если совпадение правильное.

Любая идея о способеисправить или лучше?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Использование Regex.Replace метода и MatchEvaluator делегата (не проверено):

    Dictionary<string, string> Replacements = new Dictionary<string, string>();
    Regex DialogVariableRegex = new Regex("(?<={{)(.*?)(?=}})");

    string Replace(string sentence) {

        DialogVariableRegex.Replace(sentence, EvaluateMatch);

        return sentence;
    }

    string EvaluateMatch(Match match) {

        var matchedKey = match.Value;

        if (Replacements.ContainsKey(matchedKey))
            return Replacements[matchedKey];
        else
            return ">>MISSING KEY<<";
    }
0 голосов
/ 16 декабря 2018

Вот как бы я решил эту проблему.

Создайте словарь с ключами в качестве значений, которые вы хотите заменить, и значений в качестве значений, на которые вы будете их заменять.

Dictionary<string, string> valuesToReplace;
valuesToReplace = new Dictionary<string, string>();
    valuesToReplace.Add("[playerName]", "Max");
    valuesToReplace.Add("[day]", "Thursday");

Затем проверьтетекст для значений в вашем словаре.Если вы убедитесь, что все ваши ключи начинаются с «[» и заканчиваются на «]», это будет быстро и просто.

List<string> replacements = new List<string>(); 
    //We will save all of the replacements we are about to perform here.
    //This is done so we won't be modifying the original string while working on it, which will create problems.
    //We will save them in the following format:  originalText}newText

    for(int i = 0; i < text.Length; i++) //Let's loop through the entire text
    {
        int startOfVar = 9999;
        if(text[i] == '[') //We have found the beginning of a variable
        {
            startOfVar = i;
        }
        if(text[i] == ']') //We have found the ending of a variable
        {
            string replacement = text.Substring(startOfVar, i - startOfVar); //We have found the section we wish to replace
            if (valuesToReplace.ContainsKey(replacement))
                replacements.Add(replacement + "}" + valuesToReplace[replacement]); //Add the replacement we are about to perform to our dictionary
        }
    }
    //Now let's perform the replacements:

    foreach(string replacement in replacements)
    {
        text = text.Replace(replacement.Split('}')[0], replacement.Split('}')[1]); //We split our line. Remember the old value was on the left of the } and the new value was on the right
    }

Это также будет работать намного быстрее, поскольку позволяет добавлять как можно большепеременные, как вы хотите, без замедления кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...