【问题标题】:Parsing string as code in Unity3D (C#)在 Unity3D (C#) 中将字符串解析为代码
【发布时间】:2017-01-22 01:42:25
【问题描述】:

所以我想在 Unity 中构建这个小代码沙箱,这样我就可以教学生算法和编码的基础知识。

他们的想法是让他们在文本框或类似的东西中输入(非常基本的)代码,并观察他们的代码对 Unity 场景中存在的对象的影响。我很确定这已经完成了一百万次,但我很想尝试一下。问题是,我不知道从哪里开始......

我想这个想法是字符串将被编译成代码并在运行时执行,只需按下一个按钮。

我阅读了许多关于 SO 的其他问题,并提出了非常多样化的解决方案,例如使用 C# 解析器、反射、表达式树、CodeDom 等。

根据我对所有这些的理解(即不多),CodeDom 似乎更合适,但后来我读到它只在 Visual Studio 内部运行并在公共构建中产生错误。那么这是否意味着这将成为 Unity3D 中的一个问题(因为它基于 Mono?)

感谢您的帮助,

【问题讨论】:

    标签: c# string parsing unity3d


    【解决方案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]();
    }
    

    【讨论】:

    • 感谢您的回答!这非常有趣,我没想到这是可能的……不过,我还有一个问题。这似乎为方法名称创造了奇迹,但是 if 子句或 for 循环呢?我看不到任何方法可以很快取代那些(我的目标是教授算法,所以我肯定需要那些......)除非我可以将 if(某物)转换为方法......第二个问题:可以这包括方法的参数,还是仅适用于没有输入参数的方法?
    • 似乎你正在尝试创建某种命令行。给出一个参数列表,用 Split 解析,首先是方法,其次是参数。您可以限制数量和类型以使其变得容易或允许更大的灵活性。在后一种情况下,您需要对类型匹配进行各种检查。很长的话题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2011-11-26
    相关资源
    最近更新 更多