变量和常量
变量和常量本质上是“值的容器”。每个都有一个名称和一个值。Mindustry 有用户可以设置的变量和仅由处理器设置的常量,用户无法更改常量。
要了解变量或常量的可能数据或参数类型,请参见术语表。
变量
创建和更改变量
变量就是它的名称所暗示的;一个可以更改的值。
例如,在这段代码中:set myVariable 3,set 指令将创建一个名为 myVariable 的变量,并赋值为 3。
稍后,可以将其值更改为 9:set myVariable 9。
请注意,我们在创建和更改变量时使用了相同的指令。这是因为如果要更改的变量尚不存在,指令将首先创建它。如果您了解 Python,您可能会意识到它的工作方式是相同的。
另一个例子是使用 sensor:sensor playerX playerUnit @x(或在可视化编辑器中为 Sensor playerX = @x in playerUnit)。
假设玩家的位置是 141, 20,将首先创建一个名为 playerX 的变量,然后赋值为 141。
然而,在这个例子中还有另一个变量叫 playerUnit。该变量是一个参数。参数是指令的输入值。在这种情况下,我们可能是从 radar 指令中获得 playerUnit。如果未提供参数或参数无效,指令将不会执行。
数据类型和隐式转换
变量中的值当然具有不同的类型,具体取决于不同的来源和目的,例如 Unit 用于单元,number 用于任何数字等。您可以在术语表中找到它们的完整列表。
Mindustry Logic 还具有一种称为隐式转换的变量特性。这意味着,如果需要,它将把变量的值从一种类型转换为另一种类型。
如果指令给定了一个 number,但需要一个 Object,它将被转换为 null。如果指令需要一个 number,但给定了一个 Object,如果对象不为 null,它将被转换为 1,否则为 0。
示例:
53->nullnull-> 0Object(例如硅熔炉) -> 1
print 指令是唯一需要 String 作为输入的指令,因此其规则在手册的单独部分中说明。
变量命名
正确命名变量是编程中一项重要的技能。它有助于使代码更易于阅读和理解。因此,这可以使人们更容易学习或修复您的代码。
变量名称可以包含任何可输入的字符。然而,它们不能仅是数字,因为这将使用实际数字。
大多数 mlog 代码中的常见命名约定是 camelCase,例如 playerX、coreFound、vertexAngle。
在命名变量时,请确保它们既具有描述性又简短。它们必须描述它们所持有的值或其目的。同时,它们不应是完整的句子或占据整个页面,或过于简短以至于令人困惑。您可以使用缩写、首字母缩略词或更短的术语使其更简洁。
每个人都有自己特定的风格和偏好,但请尝试从 mlog 和其他语言中的良好代码示例中学习,同时尽量保持接近常见风格。
处理器变量和常量
常量也保存值,但不能更改。每个处理器都有这些内置的常量和变量:
处理器
@this constant Building
一个表示处理器本身的 Building 对象。您可以使用它与 sensor 一起查找有关处理器的各种属性。
@thisx constant number
处理器的 x 坐标。
@thisy constant number
处理器的 y 坐标。
@ipt constant number
每个 tick 执行的指令数量(60 ticks/秒)。
- 微处理器 -> 2
- 逻辑处理器 -> 8
- 超级处理器 -> 25
@counter variable number
一个表示处理器将从中读取代码的下一行的变量,相当于 x86 中的 %IP。它可以像其他变量一样更改,作为执行跳转的另一种方式。
一个(高级)示例是将 @counter 设置为跳转到一个函数,然后再跳回调用者:
op add retAddr @counter 1 # 保存函数返回后我们将继续的位置,通过将 1 加到计数器
set @counter myFunc # 跳转到表示 myFunc 的行
...
set @counter retAddr # 在调用函数后返回到之前设置的行
链接
@links constant number
一个等于链接到处理器的建筑数量的常量。当块被链接或取消链接时,处理器会更改它。
您可以将其与 getlink 一起使用,以循环遍历所有链接的建筑,如下所示:
set linkIter 0 # 创建迭代器变量
getlink block linkIter # 获取第 "linkIter" 个链接建筑的 Building 对象。
# 在这里对建筑执行您想要的操作
jump 1 lessThan linkIter @links # 循环
constant Building
constant Building这实际上是多个常量,每个链接到处理器的建筑都有一个。它们在建筑被取消链接或链接到处理器时被移除或添加。
buildingName 代表建筑的内部名称,您可以在 Wiki 的其他部分找到。
n 从 1 开始,并随着每个链接的同类建筑而增加。它有点像某种类型的第 n 个建筑。
这可能有点难以理解,因此这里有一些示例:
- 第一个链接到处理器的 Scatter:
scatter1 - 第三个链接的 Ripple:
ripple3 - 第二个链接的 Laser Drill:
drill2 - 第十一个链接的 Spore Press:
press11
您还可以在选择处理器时查看每个链接建筑的“常量名称”。

其他
@unit constant Unit
一个表示当前绑定单元的常量。只有在处理器解除绑定单元或绑定另一个单元时才会更改。可以使用单元指令(如 ucontrol、ulocate 和 uradar)访问它。由于它是一个单元对象,您也可以将其与 sensor 一起使用。
这构成了 mlog 中单元控制的核心部分;一次只能绑定一个单元。然而,您可以在变量中引用它,例如 set unitReference @unit。不过,该变量不能用于控制引用的单元。它只能用于与其他单元进行比较或获取有关它的信息。因此,您可以将其视为“单元身份”。
@time constant number
表示当前的 UNIX 时间戳 以毫秒为单位。
@tick constant float
表示自地图开始以来的 tick 数(60 ticks/秒)。
@mapw constant number
地图的宽度,以瓦片为单位。
@maph constant number
地图的高度,以瓦片为单位。