c# - 如何将字符串转换为可运行代码? (在统一中)

标签 c# unity3d scripting compilation

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

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

例子:

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

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

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

我知道 Java 有一个称为“反射”的 API,据我所知,它可以做类似这样的事情,但我一直无法完全理解它。

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

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

是否有任何其他替代方法可以实现类似的目标? (这个只是好奇)

最佳答案

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

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

例如..

你好{PLAYER_NAME},你好吗? - 这是原始字符串。

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

    /Add other replacers here

    return input;
}

关于c# - 如何将字符串转换为可运行代码? (在统一中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173631/

相关文章:

c# - ONVIF PullPointSubscriptionClient.PullMessages

c# - 钩子(Hook)在没有委托(delegate)的情况下运行(反射)

c# - Unity3D:如何停止角色停止移动时发生的闪烁?

linux - 如何将电子邮件添加到此脚本

c# - 不支持复合类名。考虑搜索一个类名并过滤结果

c# - 如何将 C# 结构体转换为 C 结构体?

c# - 将文本框转换为 float

unity3d - unity : Application keeps running in background although Application. runInBackground为false

bash - bash 脚本中的 ${0%/*} 是什么意思?

linux - 如何为 linux 用户帐户定义变量和常量?