Я пытаюсь создать систему черт и предметов, которая бы давала характеристики игрока с высокими и низкими бросками.
Я использую скриптовый объект для всех данных об элементах и характеристиках, включая описания. Сейчас для текста описания я просто добавляю слово-заполнитель для каждого числа.
например, игрок получает больше урона от «заполнителя» и наносит больше урона от «заполнителя». (две переменные). Затем у класса черт есть список из двух чисел, которые я буду использовать для замены этого слова «заполнителя».
например, игрок получает меньше критического урона «заполнителя», наносит больше урона «заполнителю» и имеет больше шанса критического удара «заполнителя». (три переменные)
Я использую String.Split()
и перебираю список, чтобы найти каждое слово-заполнитель, а затем заменяю их каждым значением переменной.
Я пробовал интерполяцию строк, но разные черты и элементы имеют разное количество переменных для замены, и мне сложно использовать это в моей ситуации. Есть ли правильный общий способ сделать это? или мое текущее решение в порядке?
вам не нужен общий способ сделать это, а просто использовать ООП-механику, а именно: у Player
есть количество живых (вероятно, число), у него / нее есть Name
(обычно string)
и раздает немного Damage
(опять число). Если у вас есть эти свойства, вы можете объединить их, например, с помощью строковой интерполяции.
Интерполяция строк @BugFinder работает для одного конкретного текста, скажем, у меня есть два элемента с 2 модификаторами и 10 модификаторами, могу ли я использовать для этого одну функцию?
вы можете использовать функции или что-то еще внутри {}
Подход «Заполнитель» является правильным. Его лучше назвать «Замещающие переменные». Определите общий синтаксис для идентификации замещающих переменных. Вы можете использовать что-то вроде {{replacement_variable_name}}
.
Затем вместо использования String.Split() вы можете использовать Regex, чтобы найти все заменяющие переменные и заменить их фактическими значениями.
Вот пример
public string GetResultantString(string input)
{
var tokens = Regex.Matches(input, @"{{[\w\s]+}}");
return ReplaceTokens(input, tokens);
}
private string ReplaceTokens(string input, MatchCollection tokens)
{
for(int i = 0; i < tokens.Count; i++)
{
var token = tokens[i].Value;
var tokenName = token.Replace("{{", "").Replace("}}", "");
var tokenValue = GetTokenValue(device, tokenName);
input = input.Replace(token, tokenValue);
}
return input;
}
private string GetTokenValue(string tokenName)
{
switch(tokenName)
{
case "DamageTaken": //return the damage taken
case "DamageDealt": //return the damage dealt
...and so on
}
}
Тогда ваша входная строка будет выглядеть как player takes {{DamageTaken}} more damage and deals {{DamageDealt}} more damage
.
на самом деле это не совсем правильный подход. Локализация намного лучше, потому что она позволяет выполнять более сложные преобразования, а также упрощает последующий перевод на другие языки. Все хорошие фреймворки имеют встроенную поддержку локализации.
попробуйте что-нибудь вроде
int high = 100; int low = 0; Debug.Log($"I want to test {high} and {low} numbers");