我已经开始用Java制作一些小型游戏,并且我正在考虑为更大的项目学习C#。我非常想制作一款可修改的游戏,但有人告诉我,如果我希望该游戏可修改,我就必须坚持使用Java,尽管我不明白为什么。
那么,什么编程语言特性使该语言更适合可修改游戏?
我已经开始用Java制作一些小型游戏,并且我正在考虑为更大的项目学习C#。我非常想制作一款可修改的游戏,但有人告诉我,如果我希望该游戏可修改,我就必须坚持使用Java,尽管我不明白为什么。
那么,什么编程语言特性使该语言更适合可修改游戏?
Answers:
这取决于您要如何设计mod系统。我将探索其中的两个。
您很有可能会要求您的改装者使用与您使用的语言相同的语言,并通过反射(或类似,取决于您选择的语言)加载mod。显然,这将限制您使用可以进行后期绑定的语言-并且有很多语言可以做到这一点(即使C语言也可以通过一些巧妙的LoadLibrary
技巧进行后期绑定)。您甚至可以进行一些元改装,其中一个mod可以托管其他mod(例如,脚本化的mod)。
这种方法的第一个问题是隐藏内部状态。以C#为例,modder可以简单地使用反射来访问私有成员,C也可以这样做(尽管需要更多的努力)。
第二个问题是托管。人们真的不喜欢在没有沙盒的情况下在其系统上运行的外来代码。在最坏的情况下,您可以编写一个设置种子箱的mod。如果将其安装在ISP上,可能会严重损害其声誉。
Modders将使用Lua之类的语言来创建mod。您要么需要一种可以调用本机代码(与Lua交互)的语言;否则您将不得不使用自己选择的语言来编写自己的脚本语言。
这里的第一个问题是大多数脚本语言都被解释了,这对于实时系统可能是不可接受的(尽管请参见LuaJIT)。例如游戏。
具有讽刺意味的是,这里仍然存在第二个问题。以Lua为例,令我非常失望的是,它在核心/默认库中包含“脱壳”功能-使其在沙盒环境中完全没有用(无需大量的工作,运气和维护),很难描绘出我对此感到多么生气,但是我真的希望他们在加入这些反特征的同时喝一些浓烈的鸡尾酒。如果您滚动自己的语言,显然可以轻松避免这种情况(请参阅:UnrealScript)。
最后,与脚本引擎进行交互的成本可能会高得惊人-再次以Lua为例,与C#结合:C#在调用本机函数(通过P / Invoke)时具有相当大的开销,而Lua则是一个“简陋”的API。如果您设计“脚本SDK”的方式需要在主要语言和脚本语言之间进行大量聊天(请注意C确实没有此问题),则可能会导致问题。同样,您可以通过编写自己的脚本语言(对于C#将其编译为MSIL)并在[虚拟]环境下以最快的方式执行它,来回避这个问题。
因为脚本实际上在与您的主代码完全不同的系统上运行,所以您可以完全控制对内部状态的访问(除非它们使用前面提到的shell函数做一些花哨的事情)。
我确实有点偏离主题,但是,您基本上可以从那堵墙得到的是,您应该能够使用任何语言(我敢说您可以)制作可修改的游戏-但使用某些语言可能会导致更多工作。我是否对安全性有些怀疑?是的,关于用户代码,您也应该如此。
我想说的是,语言在这里并不是决定性因素,实际上,这取决于您制作定义它的游戏的灵活性和数据驱动性。
每个游戏都基于一组数据(例如,关卡,网格物体,配置,物品等所有数据)运行。普通游戏和可修改游戏之间的区别在于,后者提供了允许用户修改现有数据(或添加自己的数据)的工具。无论选择哪种语言,都应尝试使游戏尽可能以数据驱动,并避免对任何游戏内容进行硬编码。实际上,您可能会选择的任何语言都可以从磁盘读取数据,这是您所需要的大部分。
如果您只是创建供个人使用的工具(例如,您自己的关卡编辑器),然后对其进行完善并与用户共享,则也只有一半。该超级肉食男孩的关卡编辑器是相当多的是,该工具的改进verision游戏的开发过程中使用。
并且,根据游戏的类型,您可能希望允许用户编写一些游戏行为的脚本。在这种情况下,您应该早早就考虑将脚本语言纳入您的游戏中(或者是您自己的脚本语言,或者是像Lua或Python这样的流行语言)。这也属于数据驱动设计的范畴。如果您决定使用现有的脚本语言,则可能需要检查您选择的编程语言是否具有该脚本语言的绑定(通常以第三方库的形式)。
您选择的语言并不能真正决定游戏的可修改性,使用语言的方式更为重要。
如果您的大多数游戏都是数据驱动的(也就是说,游戏数据是在从您的代码读取的文件中定义的),则该游戏可以很容易地修改。这几乎可以用任何一种语言来完成。使用脚本语言还可以更轻松地修改游戏。
但是,这并不意味着不使用这些东西就不可能修改游戏。例如,《我的世界》根本不是一款非常可修改的游戏,但是对于Java和Minecraft来说,都有相当不错的反编译器,因此有很多工具可以使Minecraft成为可修改的(各种modloader,Bukkit)。有了这些工具,就有可能对Minecraft进行修改(但在某些国家/地区,从技术上讲,它们可能是非法的)。
我可以给您的最佳建议是使用您希望改装者使用的工具;如果从文件定义NPC,则可以对其进行修改;如果在代码中对其进行特殊处理,则可能无法修改。
Java非常适合编写可修改的游戏。
话虽如此,使游戏成为可修改游戏的最佳方法通常是采用一种动态语言,该语言可以嵌入更广泛的应用程序中并用于编写脚本。您通常需要一种动态语言,因为重点是能够在运行时与代码进行交互,而无需经历整个编译/构建/测试周期。
需要考虑的一些动态语言选择:
尽管有点草率,但在Java中有一种更简单的方法可以做到这一点。您要做的就是将点Java文件放在一个文件夹中,然后将此批处理文件放入该文件夹,并将其命名为Run:
javac /src/.java Java / src /
注意:您可以添加所需的多个类。注意:在最后一行中,请确保不要将任何扩展名也称为.java,.exe,.bat,ect。
基本上,每次运行游戏时,这只会重新编译代码,因此,如果更改了游戏源,它将对其进行编译,然后运行新编译的游戏...遗憾的是,您无法将其他人的mod添加到游戏中。