Как мне преобразовать строку в исполняемый код?(в единстве) - PullRequest
3 голосов
/ 15 марта 2019

Я делаю небольшую игру в единстве и сейчас пытаюсь построить систему квестов.Эта игра будет симуляцией, поэтому существует огромное количество различных классов / систем данных, с которыми придется взаимодействовать квестам.Я могу просто создать кучу служебных классов ... или даже создать поддельную "базу данных" для обработки вызовов данных ... но это не элегантно.

Конечно, должен быть способ, которымЯ могу просто обозначить реальный код из строки?

Пример:

String questText = Hello player.getFullName();, how are you?

questResults<String>[1] = player.inventory.add(GameObjectBuilder.Create(new WhateverObject()));

Я использую Unity ScriptableObject для выполнения квестов, чтобы я мог скорее заполнять текстовые данные через редакторчем делать это на стороне IDE (тем более, что Unity не поддерживает интерполированные и составные строки, насколько я знаю).

Я знаю, что в Java есть API под названием «Отражение», который, насколько я понимаю, делает что-то подобноеНо я так и не смог полностью обернуться вокруг него.

Так как мне преобразовать элементы из строки в исполняемый код?

Если это возможно, вызовет ли это проблемы с исполнением с неопределенным количеством объектов, которые могут сталкиваться со сценариями, которые необходимо преобразовать?

Существуют ли другие альтернативные методы, которые достигают аналогичной цели??(это просто любопытство)

1 Ответ

3 голосов
/ 15 марта 2019

В качестве альтернативного метода вы можете использовать ключевое слово, которое вы ищете и заменяете, вместо того, чтобы записывать фактический код непосредственно в вашу строку. Я бы предложил использовать этот подход, так как он удобнее для чтения и обслуживания. Я использовал этот подход в аналогичной системе.

Это работает хорошо, если есть только небольшое количество возможностей, которые вам нужно будет решить (или вы не против добавить «обработчики» для всех ключевых слов., Вы можете включить в текст своего рода ключевое слово, которое вы может пройти через метод перед его использованием.

Например ..

Hello {PLAYER_NAME}, how are you? - это необработанная строка.

public string ParseQuestText(string input)
{
    if(input.contains("{PLAYER_NAME}")
        input.Replace("{PLAYER_NAME}",player.getFullName());

    /Add other replacers here

    return input;
}
...