太空工程师脚本编写指南——基础篇

///太空工程师脚本编写指南——基础篇

太空工程师脚本编写指南——基础篇

提示:本文中的大部分名词均会有超链接指向其解释页面,如果有不懂或需要进一步了解的可以前往查阅。

关于太空工程师这款游戏我就不在这里详细介绍了,有想要了解的可以前去steam查看:

就我这几天玩下来的感觉来看,这确实是一个很棒的宇宙沙盒游戏,玩家在这个世界中拥有100%的自由度,并且一切你所见到的东西都是可破坏的(当然,由于这么高的自由度,游戏甚至没有为玩家设立一个游戏目标,所以可能有些玩家在玩这个游戏的时候会有一种“不知道要干嘛”的感觉)。在这个世界中,你可以完全按照自己的构想来建造舰船(当然游戏在这方面还是有一些限制,不过在这种时候可以去找找看有没有mod能解决问题),你可以驾驶着飞船横扫银河系。总之,一切你能在一个沙盒游戏里想象得到的游戏元素几乎都可以在这个游戏中找到。而这个游戏,甚至允许你直接在游戏中加载自定义脚本。通过这些脚本,你可以操作几乎一切方块。当然,不同于大部分游戏那样把游戏内脚本简化成了伪代码或是做成了只需要画流程图( 或其他类似的东西 )就行的可视化编程,这个游戏中的脚本编写采用的是如假包换的编程语言——C#(C Sharp)。

话不多说,我们现在就开始学习在太空工程师中,脚本的编写方法。

开始

无论多么伟大的程序员,都是从Hello World开始的。

任何一种编程语言,在使用时都需要一个特定的环境,太空工程师的脚本也是如此。所幸,在太空工程师中我们不需要去挑选名目繁多的IDE或是安装各种编译器,配置各种环境变量。我们需要的,只是一个Programmable Block(可编程方块)只需要建造一个放在地上,我们就可以开始工作了。如果你连这都不会……请你先好好熟悉一下游戏吧……

blank
这就是我们的Programmable Block了。

然后打开面板,其中有一个Edit按钮就是脚本编辑器了,所有的脚本都需要放在这里面才能运行哦。

在我们开始编写第一个程序之前,我们还需要下载一个代码编辑器,这个编辑器不同于游戏中的编辑器,这个编辑器只是为了让你能更方便地编写代码,在写完后,把代码复制进游戏中即可运行。我在这里推荐的编辑器是Visual Studio Code,当然,你也可以选择NotePad++,sublime等等,这纯粹是个人喜好问题了。

之后,让我们看一眼可编程模块的代码编辑界面。

blank

……

What?这么复杂???

相信很多人都会有这种感受吧。但是,其实这里面的这些代码都只是唬人的,因为它们都只是注释而已,所有//后面的内容对于脚本没有任何作用,只是起到了解释说明的功能。

我们把所有注释都删掉,代码就只剩下这些了:

public Program()
{
}

public void Save()
{
}

public void Main(string argument, UpdateType updateSource)
{
}

是不是瞬间就开心了?

而我们现在要用到的东西甚至更少,我们甚至只需要保留Main就行了,这是脚本的入口函数,系统会从这里开始执行我们脚本的每一行代码。

现在,我们的代码只剩下这些了:

public void Main(string argument, UpdateType updateSource)
{
}

接下来,我们就可以开始编写我们的代码了。首先要明确的是,所有代码都必须放在Main下面的一对大括号中才能执行,如果你不知道你这行代码代表什么,请不要将它放在除此以外的任何地方。

现在,我们开始每个程序员都会经历的第一步:Hello World

在游戏中,我们采用Echo("something")来在方块的面板上显示字符,这样如果我们要显示Hello World的话,我们只需要这样写就行了:

public void Main(string argument, UpdateType updateSource)
{
    Echo("Hello World!");
}

请注意,在你的每一句代码后面都需要加上分号,来使系统知道你的这一句代码已经结束了。

然后我们点击Check Code。

blank

出现了这个提示,就说明你的代码没有语法错误,系统已经成功完成了解读,现在我们可以执行这个代码了。

回到面板,点击Run,我们就可以看到Hello World!出现在了面板中:

blank

我们的第一个程序就完成了。

当然,对于我们的这款游戏来说,仅仅会这个甚至都算不上是入门,在下一节中,我将会讲解如何使用代码控制一个方块。

语法入门——变量

所有的编程语言都需要变量,我们的程序也不例外。我们需要通过变量来保存一些数,或者是一些字符,又或者是通过变量来代表我们需要操控的方块。

变量在代码中通过一串字符来表示,我们首先需要定义一个变量,然后在我们的代码中,这一串字符就代表了我们的变量,我们可以读取它,也可以修改它。我们来看下面这个代码:

public void Main(string argument, UpdateType updateSource)
{
    int a,b;
    a=1;
    b=1;
    a=a+b;
    Echo(Convert.ToString(a));
}
blank
运行结果

在这个代码中,我们首先定义了两个整形变量a和b(关于变量类型的详细说明请点击链接查看),然后,我们让a与b都等于1,之后让a等于a+b的结果,也就是2,之后我们输出这个结果,就可以看到面板上显示了2。在代码的第7行,有一串比较复杂的东西Convert.ToString(a),它的作用是把a从数字变成字符串,这样才能在屏幕上输出。我们可以使用这个把几乎任何变量变成字符串。

控制一个方块

假如我们有一扇命名为“My Door”门,我们如何让可编程方块知道我们需要控制这扇门呢?

其实很简单,我们只需要用变量就可以了,游戏系统为我们提供了一些用来代表特定类型方块的变量,我们只需要定义这些变量,然后找到我们要的方块,把它保存进变量里就行了。

首先我们来定义一个门的变量:

    IMyDoor door;

然后我们通过系统提供给我门的方法,按照名字查找一扇叫做“My Door”的门并且将其保存在door变量中:

    door = GridTerminalSystem.GetBlockWithName("My Door") as IMyDoor;

这一步需要注意,我们需要在后面加 as IMyDoor来使系统知道我们要找的方块是一个门,因为按名字查找时并不会限定类型,你可能会有一个命名为“My Door”的制造器(当然这不太可能)。

为了简化我们的代码,我们可以把这两步合并到一起:

    IMyDoor door = GridTerminalSystem.GetBlockWithName("My Door") as IMyDoor;

然后我们就可以控制我们的这扇门了。代码也很简单,只需要这样:

    door.ApplyAction("Open");

然后我们组合这两句代码形成一个脚本:

public void Main(string argument, UpdateType updateSource)
{
    IMyDoor door = GridTerminalSystem.GetBlockWithName("My Door") as IMyDoor;
    door.ApplyAction("Open");
}

然后检查代码成功后,点击Run一次,门就会打开或者关上。

使你的脚本自动重复运行

在这个游戏系统中,我们可以很方便地使我们的脚本每隔一些时间就自动运行一次,这里我们需要用到刚刚被我们删除的Program,我们只需要在其中加上一些东西,就可以使我们的脚本自动运行了,像这样:

public void Main(string argument, UpdateType updateSource)
{
    IMyDoor door = GridTerminalSystem.GetBlockWithName("My Door") as IMyDoor;
    door.ApplyAction("Open");
}

public Program()//添加的部分
{
    Runtime.UpdateFrequency = UpdateFrequency.Update10;
}

添加了自动运行的脚本就不需要手动点击Run了,系统会每隔一定时间自动执行一次这个脚本,上述脚本就可以使门快速地开关(像疯了一样)。当然,我们也可以使用其他的时间间隔,只需要把第9行中的Update10更改为Update1(更快)或者Update100(更慢)即可。

以上就是基础篇的全部内容,请等待博客作者更新入门篇。

其他帮助文档

发布者 | 2019-07-07T14:38:00+08:00 7月 7th, 2019|休闲时光, 游戏|2条评论

关于作者

blank
坚强大概——并不是指的的结果,而是迈向某个目标的过程吧。

2条评论

  1. blank
    Tttttt 2020年6月24日 在 上午2:02 -回复

    请问还有后续吗

    • blank
      Sinon 2020年6月29日 在 下午11:32 -回复

      emmm等我有空再看看吧……

发表评论

召唤伊斯特瓦尔