能否使用 Lua/Javascript 脚本扩展 C# 对象的新变量?

假设我有一个 C# 类:

class Player {
  string Name;
  int HitPoints
}

我想为我的游戏添加 modding/scripting 支持,让用户能够扩展它的对象变量。(比如说“bool StartedKill5RatsQuest”)然后用户可以访问他自己的或默认的参数。

用户脚本:

player.HP = 10;
player.StartedKill5RatsQuest = true;

是否有任何已知的脚本语言可以实现这个功能?

点赞
用户7646599
用户7646599

你无法直接这样做。但是,通过引入一个内部的“变量”集合,可以实现类似的功能:

Dictionary<string, object> _scriptVariables = new Dictionary<string,object>();

有了这个,您可以为玩家提供一组方法来创建/获取/设置其“变量”,例如:

public void CreateVariable<T> (string name, T defaultValue);
public void Set<T> (string name, T value);
public T Get<T> (string name);
等等...

这些方法将访问您的字典并操纵其值,因此用户可以编写:

public void Initialize()
{
    player.CreateVariable<int>(“HP”);
    player.CreateVariable<bool>(“StartedKill5RatsQuest”);

    player.Set(“HP”,10);
    player.Set(“StartedKill5RatsQuest”,true);
}

public void Update()
{
     ...
     if(player.Get<bool>(“StartedKill5RatsQuest”))
     {
         ...
     }
}

这比直接成员处理稍微冗长,而且在实现类内部的支持方法时,您应该明智地选择类型,但它可以完成工作。

2018-03-12 09:48:34
用户1865988
用户1865988

我同意 rs232 所说的最佳方法。生成新的属性只是一种过于复杂和不必要的方式。但如果您真的非常想这样做,您可以研究使用 PropertyBuilder

2018-03-12 09:55:37
用户9338645
用户9338645

由于您发布了一个C#类作为示例,因此我只能参考@rs232的答案。

但是,如果您也接受例如JavaScript(已标记),则可以在那里使用prototypes

原型允许对象在其主要声明现有对象之外添加附加属性甚至方法。

Player.prototype.health = 100;
Player.prototype.heroicName = "Lord";

甚至可以添加功能:

Player.prototype.getHealth = function() { return this.health;}

我不熟悉JavaScript,如果我犯了一些语法错误,请您谅解。

2018-03-12 10:11:13