2017-01-21 2 views
1

Итак, я хочу создать эту маленькую изолированную программную программу в Unity, которая позволит мне обучать студентов основам алгоритмики и кодирования.Разбор строки в коде Unity3D (C#)

Идея заключалась в том, чтобы ввести (очень простой) код в текстовое поле или что-то в этом роде и наблюдать за эффектами своего кода на объекты, присутствующие в сцене Unity. Я почти уверен, что это было сделано миллион раз, но я хотел бы попробовать свои силы в этом. Втирать, я не знаю, с чего начать ...

Я думаю, идея состоит в том, что строка будет скомпилирована в код &, исполняемый во время выполнения, нажатием кнопки.

Я прочитал о многих других вопросов на SO, и придумали очень разнообразных решений, таких как использование C# парсер, отражение, деревья выражений, CodeDom и т.д.

Из того, что я понял из всех этих (т. е. не так много), CodeDom казался более подходящим, но затем я прочитал, что он только работал внутри Visual Studio и генерировал ошибки в публичных сборках. Так что это означает, что это будет проблемой в Unity3D (так как он основан на Mono?)

Спасибо за вашу помощь,

ответ

1

В следующем случае, вы посмотрите на существующий метод из дано имя того же сценарий (вы можете легко преобразовать его в другой сценарий или любой сценарий в сборке (не рекомендуется, хотя)):

string actionStr = inputField.text; 
Type t = this.GetType(); 
MethodInfo mi = t.GetMethod(actionStr); 
if(mi == null) 
{ 
    ErrorMethod(actionStr + " method could not be found"); 
}else 
{ 
    mi.Invoke(this); 
} 

другим способом будет хранить все методы в словаре (быстрее) :

Dictionary<string, Action>dict = null; 
void Start() 
{ 
     this.dict = new Dictionary<string, Action>(); 
     this.dict.Add("dosomething", DoSomething); 
} 
void DoSomething(){} 

public void OnActionCall(string inputFieldStr) 
{ 
    string str = inputFieldStr.ToLower(); 
    if(this.dict.Contains(str) == false) 
    { 
     ErrorMethod(actionStr + " method could not be found"); 
     return; 
    } 
    this.dict[str](); 
} 
+0

Спасибо за ваш ответ! Это очень интересно, и я бы не подумал, что это возможно ... У меня все еще есть вопрос. Кажется, что это творит чудеса для имен методов, но как насчет предложений или циклов? Я не вижу каких-либо методов, заменяющих их в ближайшее время (и моя цель - научить алгоритмам, поэтому мне обязательно нужны эти ...) Если бы я не смог преобразовать, если (что-то) в метод ... Второй вопрос: может это включает параметры для методов, или это работает только с методами без входных параметров? – ReinaDelSur

+0

Кажется, вы пытаетесь создать какую-то командную строку. Дайте список аргументов, проанализируйте с помощью Split, сначала это метод, затем аргументы. Вы можете ограничить количество и тип, чтобы упростить или обеспечить большую гибкость. В последнем случае вам понадобится всякий вид проверки соответствия типа. Довольно длительная тема. – Everts

Смежные вопросы