我正在为游戏引擎设计一个插件API。插件需要能够将UI元素添加到引擎中的内容中。要创建一个新容器并在不使用插件API时用简单标签填充它,我只需这样做:
Container container = new Container();
Label label = new Label();
label.Text = "Hello World!";
container.Add(label);
但是,插件无法直接访问Container和Label类(在引擎的GUI组件中定义),而是通过插件API。 (因为如果它们是,对GUI模块的更改可能会破坏所有插件,具体取决于不同版本的GUI模块)
所以相反它会在插件中看起来像这样:
IContainer container = m_Engine.GUI.ElementFactory.CreateContainer();
ILabel label = m_Engine.GUI.ElementFactory.CreateLabel();
label.Text = "Hello World!";
container.Add(label);
不太漂亮。我怎么能调整我的设计,所以我仍然有一个独立于引擎本身的独特插件API,同时仍然允许简短漂亮的代码,而无需在任何地方散布工厂方法调用?
答案 0 :(得分:0)
您可以创建将作为模板提供的功能。在这些函数中,您可以使用工厂方法调用,并且可以调用这些方法,这样就不会在任何地方复制工厂方法调用。
答案 1 :(得分:0)
首先,你可以使用泛型。
var label = GUI.ElementFactory.Create<ILabel>()
会给你一个标签,你也可以通过像Autofac这样的IoC容器轻松填充。
根据您愿意为插件系统投入多少精力,您可能需要考虑不要让人们在c#中编写插件。他们可以用动态语言(如Powershell,IronPython或IronRuby)编写它们,您可以将这些工厂方法作为环境的主要方面。
或者您可以创建自己的DSL,用于定义您解释的Uis并转换为对象图。
labeledInput playerName "Enter Your Name" (50, 50)
labeledInput likes "What do you like?" (100, 50)