【问题标题】:How do I convert a String to runnable code? (in Unity)如何将字符串转换为可运行代码? (在统一中)
【发布时间】:2019-08-06 00:05:26
【问题描述】:

我正在统一制作一个小游戏,现在我正在尝试构建任务系统。 该游戏将是一个模拟游戏,因此任务将不得不与之交互的大量不同的数据类/系统。 我可以只制作一堆实用程序类......甚至制作一个假的“数据库”来处理数据调用......但这很不雅。

肯定有一种方法可以让我只用字符串表示实际代码?

例子:

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

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

我正在使用 Unity 的 ScriptableObject 进行任务,这样我就可以通过编辑器填写文本数据,而不是在 IDE 端进行(尤其是据我所知,unity 不支持插值和复合字符串) .

我知道 Java 有一个名为“Reflection”的 API,据我了解,它会做类似的事情,但我一直无法完全理解它。

那么如何将字符串中的元素转换为可运行的代码呢?

如果可能的话,这是否会导致性能问题以及可能遇到需要转换的脚本的对象数量不定?

还有其他替代方法可以实现类似目标吗? (这只是一种好奇心)

【问题讨论】:

  • 你试过CSharpCodeProvider,它的开发速度比反射快。
  • @LeiYang 我什至不能完全确定反射是否是我在这种情况下需要的技术,我可能不应该提到它。 CSharpCodeProvider 是否允许我将在字符串中检测到的 C# 转换为实际的运行时进程?如果是这样,它是否具有统一功能?
  • 它在 C# 中工作。请先阅读文档并做一些实验。
  • 好吧,所以只是为了确保我了解 CSharpCodeProvider 的工作原理......这个过程将如何进行:GameEngine [检测代码] -> GameParsingEngine [将代码写入源文件] - > CSharpCodeProvider [编译并运行游戏内的代码] ?
  • 我认为您甚至不需要将字符串写入源文件。它在运行时在内存中编译并且可以运行 IL。

标签: c# unity3d scripting compilation


【解决方案1】:

作为替代方法,您可以使用搜索和替换的关键字,而不是将实际代码直接写入字符串。我建议使用这种方法,因为它更易于阅读且更易于维护。我在类似的系统中使用过这种方法。

如果您只需要解决少量的可能性(或者您不介意为所有关键字添加“处理程序”。您可以在文本中包含一种关键字,您可以可以在使用前通过方法。

例如..

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;
}

【讨论】:

  • 是的,我在初始阶段就在考虑关键字路由。我正在围绕未来的 SQL 实现进行设计,因此它可以作为多人游戏工作......但这导致我意识到我想要处理命令,而不仅仅是数据请求。这导致我花了一天时间编写自己的脚本语言,这让我意识到如果我尝试走这条路会出现类粒度。该游戏是一个相当深入的基于数据的商业模拟(而不是物理),因此会有大量不同的类,然后需要像你这样的实用方法。
  • string.format ("Hello {0}, how are you?", player.GetFullName());docs.microsoft.com/en-us/dotnet/api/…
  • 对不起,也许我应该澄清一下。 string questText 是我在统一编辑器中设置的字段,而不是按程序设置的。我也不想进一步混淆这个问题,但它实际上会读取Hello, $player.getFullName();, how are you today? 的任务$ 表示插入显示文本的代码的开头,; 自然结束它。我有一个非常简单的设计来实际解析命令,它能够为需要的无限自定义语句动态生成一个一次性类,而不是一百万个实用程序类。
  • 实际上,您需要多少种独特的方法?通过 string.Replace 执行此操作会比您想要做的要容易得多,更不用说更安全了(如果您将此内容设为“可修改”,我会担心这一点)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2018-11-13
相关资源
最近更新 更多