
Uncrewed





首次启动游戏时,在我的1440p显示器上所有菜单选项都超出了屏幕显示范围。以下是快速解决该问题的指南。 主要步骤: 1. 首先,导航至Steam文件中的《Uncrewed》游戏目录。对于不清楚路径的玩家,该目录通常位于Program Files (x86)SteamsteamappscommonUncrewed。 2. 进入《Uncrewed》游戏目录后,导航至SystemAppBin文件夹。找到名为“default.xml”的文件,使用记事本(或其他兼容的文本编辑器)打开它。 3. 在default.xml文件中找到windowed="1"这一行,将1改为0并保存文件。 4. 下次启动游戏时,它将以全屏模式运行,并会根据你的屏幕尺寸正确缩放显示。

最后,我们来讨论如何真正击败敌人! 简介 我听说很多初次游玩的玩家在对抗AI时感到吃力,不过我可以保证,AI是可以被击败的,你不必因为前几局游戏中遇到困难而感到沮丧(我当初也是如此)。 本指南会重申之前指南中的一些内容,同时为游戏老手添加不少PVP技巧。 需要注意的是,由于游戏对局数量有限,目前尚未形成真正的主流玩法,所以对于具体细节建议持保留态度。 要非常谨慎,因为主流玩法几乎每局都在变化…… 军队的构成 《无人作战》允许你自定义单位。由于存在众多可能性,我无法告诉你单位的最佳配置方案,也无法确定军队中应该包含哪些单位。我唯一能做的,就是告诉你我的部队是由什么组成的。你可以参考一下我的建议。 匍匐者 你首先要做的就是获取这个很棒的作品:【匍匐者】(由Randomnumbers制作,我非常感谢他制作了这个单位)。它是目前为止你能获得的最便宜且最实用的采矿单位(它甚至具备两栖能力!)。唯一的缺点是生命值较低,所以在游戏后期你可以选择更重型的单位。这个单位能为你提供经济上的提升,让你比敌人发展得更快。 建造更大型的单位通常意味着投资那些很快就会过时的东西(生命值低的单位以及装备机枪或左轮机炮的单位在游戏的早中期表现就已经很差了)。早期游戏 早期游戏阶段是你建造采集器、设置初期防御以及执行早期突袭的阶段。 比赛开始时 游戏开始时,如果你能把握好时机,利用工厂的第一次加速,加上游戏初始给予的第一个采集器,你可以快速造出3个廉价采集器。之后继续建造,直到拥有大约6到7个(如果你感觉有危险,数量可以少一些)。在重 pellets(原词)上放置一个采集器就足够了(如果你需要科技速攻,可以放置2个,一旦实验室建成,你就可以让它们采集普通 pellets(原词))。 这样的配置虽然脆弱,容易成为突袭目标,但能带来早期资金的快速增长,让你以最快的速度获得最多的资源。防御阶段 在此之后,你应该提升科技,最多建造3个实验室(其中一个是军械库),并打造你的早期防御单位。我会用一个中型1号单位进行防御,它配备有大型旋转加农炮或左轮加农炮,或者2门等离子炮(长管的那种)。其他具有类似每秒伤害的武器也是可行的,但火箭或激光武器可能难以立即研发出来。如果你想使用普通的旋转加农炮和左轮加农炮,为了保证每秒伤害,这个载具上可能需要安装3到4门。 大约在这个时候,AI会发动进攻,这个单位应该能很好地击退它们最初的3次左右突袭。现在在前线附近建造一个维修平台/维修站是个不错的决定。此外,不要让你的单位处于攻击姿态。通常来说,用防御单位追击敌人不是个好主意,因为你需要它来进行防御。除非你只面对一个敌人,这种情况下可以立即发起突袭。 突袭:由于我刚才提到的武器需要推进实验室,你现在可以制造一个飞行单位来进行攻击。这个飞行单位的规格应该与防御单位大致相同。立即发起攻击可以让你在对抗其他玩家时获得主动权,并在资源方面削弱他们。 始终优先攻击采集器,并彻底摧毁它们。当单位生命值降至25%时就撤退,修复后再次出击。如果你的对手对其采集器进行重兵防守,你应该按以下顺序攻击他们的建筑: 正在建造建筑的建造塔 火箭实验室 激光实验室 推进实验室 早期游戏结束 这大致是早期游戏的结束阶段,你现在应该制定计划,确定要使用哪些武器,建造激光实验室或火箭实验室以获取其中一项顶级科技,另一项可以稍后再考虑(注意,你不必使用游戏中的所有武器,如果你有只需要较少实验室就能奏效的策略,那就去实施吧!)。 建造更多的采集器,我通常的目标是大约7-10个采集单位。这一数量在整个比赛过程中通常保持不变。通用技巧 大多数即时战略玩家应该已经知道这些,但还是要提醒新手: 有时如果你想进行快攻,可以建造3-4个廉价的采集单位。一旦资源足够,就要立刻花掉! 使用快捷键来建造实验室或单位,并在最能加快生产速度的阶段升级工厂(B)。 通过按CTRL+数字键来设置控制组是个好习惯。可以将采集单位编为一组以便快速撤离,将主基地编为一组以提升建造速度,再为不同的攻击单位编队。 中期游戏 中期游戏通常围绕组建一支能在后期击败敌人的军队展开。如果你正在与一名玩家对战,甚至可能在这个阶段就能结束比赛。扩展你的防御 如果这是一场自由混战或团队游戏,你可以开始建立基地防御。在靠近采集器的位置设置一个锚点,并添加一个防御单位。锚点会让该单位附着在该点并从那里获得补给。为了节省成本,无论武器如何,你只需在这个单位上添加一个电池(反正它会被充电)。安装大型轨道炮可以让防御单位互相支援(由于射程原因),但会使它们更容易受到EMP的影响。给防御单位配备EMP可以让它们更好地应对空中突袭者。 我通常更喜欢另一种选择,即使用可以采矿的战斗载具,或者直接将坦克和其他载具部署在我的贵重物品附近。 锚定单位和围墙,你会选择是还是否?现在有很多即时战略玩家喜欢龟缩防御,借助【固定炮台】(使用锚定功能)隔墙射击,再搭配一些【电磁脉冲】武器用于防空,就能构建起强大的防御体系。AI通常会出动强力空中单位(如果它们的单位库中有此类单位的话),所以这种防御方式效果不会太好,但对付地面部队应该很有效。 不过,我不建议在玩家对战中采用龟缩战术。龟缩会让对手掌握主动权。如果对手喜欢骚扰,这就等于让他/她可以随意选择攻击的时间和地点。他们还能不受阻碍地自由扩张,在像【海岸】这样只有一个扩张点的地图上,这对你来说是致命的。如果对手按照我描述的方式攻击你的采集单位,你至少会损失几个。损失3个采集单位意味着损失333资源,再加上重建它们期间本可以收集的资源。这可能相当于一个中型单位的价值,在游戏的早中期,这可能会起到决定性作用。 如果你不出基地,而敌人持续用有效的突袭施加压力,你会很快被击溃。 更糟糕的是,由于你把所有资源都投入到静态防御中,对手的机动部队规模会更大。因此,发动进攻可能会非常困难,因为你无法全力出击。即使没有遭到突袭,你的部队在兵力点数上也会处于劣势。最后,当你的弹药耗尽,不得不移动采集器时,你的防御该何去何从? 哦,对了,没有防御的墙不过是浪费弹药和时间,敌人只需摧毁一小段就能通过。除非它能拖延足够长的时间让你组织起防御,否则没什么用,但我对此表示怀疑。 我刚被袭击了,该怎么办?在AI对战中,你可以采取龟缩战术,这没问题。在PVP对战中,我强烈建议一旦你拥有值得出击的兵力就立即发动攻击(不过不要让你的基地完全暴露,尤其是当地图上还有其他玩家时)。 再次强调,优先攻击他们的采集器(先打最脆弱的),这将帮助你重新掌握主动权,并让对方玩家的资源陷入困境。如果你正面对空中突袭者,在防御中部署一些EMP,这会使它们迫降,并且可能会将其长时间眩晕,让你有足够时间消灭它们。 进攻策略 在游戏中期,玩家之间的攻击或突袭很常见(或者是一场混战,没人敢离开自己的基地)。理想情况下,你应该持续保持压力,单靠这一点就可能为你赢得游戏。 飞行单位非常适合这类攻击,因为你不应该让单位白白损耗在敌人身上。有时你需要减少损失并撤退。 防御会变得越来越普遍,因此攻击应该规划得更周密一些。 1. 攻击采集器。 这通常是任何攻击的首要目标,骚扰资源生产线会让你在游戏中占据优势。这部分也应该是基地防御最严密的地方。它能让你在突袭中占据优势,但我更倾向于投入资源建造一个中型单位来进行防御。 更廉价的采集器:有许多单轮采集器价格非常低廉,成本不到100 pellets,能显著加快你的早期游戏进度。唯一的缺点是它们不具备两栖能力。其中一款由Vulkan制作,虽然还有其他单轮采矿机,但这款的性能优于其他同类产品。不过,其稳定性和动力设置仍有进一步优化的空间,以获得更佳性能。 小贴士:有一种名为【线性建造模式】的功能。这是过去的载具建造方式,但有时玩家会用它来大幅提高建造速度。用昂贵的飞行器换取廉价的采矿机并不值得。 2. 攻击建筑 实验室通常防御薄弱,一旦被摧毁可能会造成不小的麻烦。总是优先攻击最昂贵的建筑(火箭实验室),然后再依次攻击价值较低的。军械库重建速度太快且造价低廉,攻击它们影响不大。 不建议攻击主工厂,因为其生命值过高,难以进行有效突袭。只有在基本击败对手但他们躲藏起来时,才可以考虑攻击主工厂。 3. 双线进攻 只有擅长策略游戏且自信你的单位在无人指挥的情况下不会溃败时,才使用此策略。双线进攻很难成功。《无人操控》中反应迟缓的单位也不会有太大帮助,但如果能成功实施,那或许值得一试。 4.佯攻 大多数地图都有多种进入基地的方式。而且很多地图的基地后方都有可供空中攻击的空间。在一个区域发动小规模攻击,然后用主力部队攻击其他地方,这会非常有利。 理想情况下,你应该让所有单位集中火力攻击那些逐个回撤的敌人,或者在敌人单位离开时摧毁他们的采集器。 但要注意不要过度分散你的单位,你可不希望被各个击破! 5. 坚持到更强大的单位出现 如果你认为自己有机会做到,那么投资于后期的制胜单位可能会更好。《无人作战》在一定程度上更青睐更强大的单位。因此,攒资源建造更强大的单位或许是个不错的主意。 在自由对战或与AI对战时,这种策略更为有效。基地扩张 很抱歉,由于游戏环境变化太快,我无法推荐单一的建造顺序。在撰写本文时,选择大型武器(轨道炮、加农炮、火箭发射器)似乎是个不错的主意。 中期可能还不需要扩张,但要留意你的采集器,并制定扩张计划。 突袭部队扩张 如果你决定组建空中突袭单位,请注意大型武器或轨道炮的强大后坐力影响较小,因此这些武器是理想选择。火箭或脉冲激光(脉冲激光不会打偏)也是不错的武器。 此时,EMP武器也开始在游戏中出现。 你的突袭部队现在应该已经组建完成,或者已经在前往敌人基地的路上了。这些单位绝不能与主力部队正面交锋,而应专注于骚扰对手的采矿作业。如果敌方矿工防守严密,就转而攻击他们的建筑,并优先打击价值最高的目标(如火箭实验室或激光实验室)。 AI玩家会因此受到牵制,而人类玩家则可能彻底失去主动权并转入防御。 在PvP中,主动权相当重要,因为如果你是唯一进行突袭的一方,而对手选择龟缩防御,你就能完全掌控战斗节奏。你可以在地图上自由扩张,并全身心地持续骚扰对手,直到拥有足够兵力发动总攻。 如果突袭效果极佳,你或许可以直接生产几辆中型1型或中型2型坦克,当场结束战斗。如果没有,你应该尝试按需建造更多实验室,并开始判断你的收入是否足以支持再建一座工厂。 通常,增加护甲比提升 DPS(每秒伤害)更划算/简单,这能让更大型的单位在战斗中获胜。从这里开始,你应该根据策略生产某种主力单位。我通常会选择轻型或中型单位。AI 的战役对手中,同类单位的生命值要低得多。 如果你在和 AI 对战,在确定能守住下一个地点之前不要扩张(最简单的方法就是等到资源耗尽再扩张,AI 总能找到你的扩张点);但如果是和人类玩家对战,你或许可以考虑在远离基地的地方进行隐秘扩张。无人深空的地图非常大,而且扩张成本相当低,所以这应该是个不错的策略。中期游戏结束的标志是你拥有了所需的所有实验室,并且有两座工厂在生产规模更大的军队。 后期游戏 此时,你已经拥有了一切,但敌人也是如此。如果你频繁且成功地进行突袭,你应该会处于优势;但如果你选择龟缩防守,敌人将会变得相当强大。 此时,AI拥有大量飞行单位,并且会充分利用火箭以及其他所有武器。是时候发起进攻了,你需要做好准备。 游戏进行到这个阶段,EMP(电磁脉冲)将开始发挥重要作用。AI只有在困难难度下才会使用EMP,但玩家可能会大量使用。因此,你的突袭效果应该会逐渐降低。 你的载具应该具备对空攻击能力,并且你要么重点发展能量武器,要么携带了EMP。对基地发起攻击需要一定时间,所以要确保携带足够的弹药/能量来完成任务。带上几名重装单位作为先锋是个不错的主意。 如果是自由混战模式,永远要避免陷入两支敌军之间。一般来说,在地图中央作战是赢不了任何比赛的。你应该尽快前往敌方基地(仅在为避免伤亡时才进行交战)。 如果有玩家采取严防死守的策略,你应该占领其基地外的几个补给点来补充部队。派遣援军穿越整个地图需要不少时间。 你的目标是敌方的经济,将军队部署在他们的资源采集点上,让他们逐渐耗尽资源。如果他们不上当,就留下少量单位驻守,然后继续摧毁他们的基地。AI从不进行隐蔽扩张,但玩家可能会这么做。 如果AI尚未被击败且不再生产单位,它们的某些单位可能被困在某处。检查任何有角落或陡坡的水域。如果你摧毁了对手的主基地,他们的单位就会显现出来。 致谢 感谢Cyan对本指南的贡献! 同时也要感谢Cyan在每一局游戏中都彻底重塑游戏策略,使得本指南在发布的那一刻就可能过时! 还要特别感谢《无人机组队》社区,没有他们的创造力,这款游戏不会有今天的成就。 当然,也要感谢开发者制作了这么棒的游戏!我(Lanceraad)个人并不喜欢它,但有些其他玩家却很喜欢。 标准采集机 这是你获得的第一个单位,战役和每场遭遇战开始时你都会拥有它(注意,它不计入你的人口上限)。我喜欢它看起来有些简陋的样子,但其实用性却值得怀疑。作为一个有效的攻击单位,它的生命值太低了(更不用说一挺加特林机枪,或者更糟的是一个等离子喷射器造成的惊人伤害了),而且作为早期游戏的采矿单位,它又太贵了。它头重脚轻,在复杂地形上很容易翻车,并且动力不足——只有一个电池,却有4个轮子在消耗能量(匍匐者只有两个螺旋桨,续航时间却是它的两倍)。 它的优点是磁性和机动性,但这并不能让它走得很远。我强烈建议改造或替换这个单位。单位尺寸表 本指南将使用以下单位数据,且会经常遵循此设定。 尺寸 生命值 计算机 弹药 备注 轻型 <100 1 <300 主要为采集单位和侦察单位。 中型1 150 1 300-400 优秀的早/中期单位,建造速度快,适合早期防御和突袭。它可以作为你的主要攻击载具,但我更倾向于稍重型的单位。 中型2 200 2 500-750 我通常将其用作主战坦克,4种武器提供了不错的火力组合。 重型 300 3 900-1200 这些单位在后期作为主力单位表现更佳,可由少量轻型单位支援(或者直接组建一支重型单位大军)。它们也能充当伤害吸收者。超重型单位 500 4 1200-1500 尽管给单位添加越来越多的东西让它们变得更大很有趣,但这些单位已经能很好地胜任先锋的角色。 旗舰单位 >500 5 >1700 这些单位很有趣,在后期战役任务中表现出色,不过要知道,在积攒资源或建造它们时,会有很长一段时间处于非常脆弱的状态。 基础军队 那么你的军队应该由什么组成呢?同样,你可以根据自己的需求来配置,但有一些基本要素: 单位 尺寸 备注 采集机 轻型 推荐使用RandomNumbers的【Groveller】(稍后会详细介绍) 侦察兵/突袭者 轻型 如果你喜欢像AI一样玩游戏,可以建造这些单位进行突袭,并为它们配备导弹发射器 早期防御/侦察单位 中型1/轻型 这个单位不宜过重,因为建造时间较长,但也要足够坚固以吓退任何AI侦察兵。你可以给它配备一个采集模块,这样它在保护采集机的同时还能协助采集工作。这可以和你的侦察单位使用相同的模块,但我更倾向于150生命值。 主战单位:中型1/2 即使你的军队重点在其他方面(例如轻型或主力单位),至少配备一些这类单位也是明智的。它们适用于中期防御或对敌人进行有效的试探性攻击。 反EMP单位:中型1/2/重型 如果敌人开始大量使用EMP,这类单位就变得至关重要。大多数高于重型级别的单位至少应具备一定的反EMP功能。中型2或重型单位的建造速度足够快,能快速做出应对。 反导弹单位:中型1/2/重型 如果敌人开始大量使用导弹,配备一些至少带有2门激光炮的这类单位。为主力单位及更高级别单位配备一些激光炮用于主动防御是个不错的主意。推荐单位 单位 尺寸 备注 EMP单位 轻型至重型 即便你的部队不依赖EMP,它也能很好地用于基地防御,抵御空中突袭。 静态防御单位 中型或重型 应包含锚点。我对这类单位没有特别偏好,但它们对防御很有帮助。 快速突袭单位 轻型/中型-1 速度快且最好具备飞行能力,用于摧毁敌方采集器。即使采取龟缩战术,也至少应考虑配备此类单位。 重型载具 重型 这种尺寸的单位在后期可能会派上用场,即便你专注于轻型单位。你也可以使用更大的单位,这样它也能成为出色的先锋单位。两栖单位 中型1/2/重型 部分地图和任务中会需要用到它们。这类单位比较难发挥出良好效果。 强化矿工 轻型或中型1 一种潜在策略是使用更大的矿工,在游戏后期与其他大型单位混合编队。这能让它们在遭遇突袭时更具韧性。只有当你有足够多余且不用于军队的能量球时,才考虑建造它们。 补给单位/治疗单位 轻型/中型1/2 我通常不会携带这类单位,但它们能极大提升远处军队的续航能力。只需为其配备足够的电池,确保在为其他载具充能时不会耗尽电力。或者,你也可以占领敌方基地附近的补给站。
本指南旨在介绍自定义游戏制作和脚本编写。 简介 本指南假定你至少具备地图编辑器的基本使用知识,以及一般脚本和编程概念的基础。本指南仅作为自定义游戏制作和脚本编写的入门介绍,并非该语言的深入技术概述。但对于地图制作而言,其内容应足够详细。 开始制作 在地图编辑器中创建新地图时,地图类型默认设为【遭遇战】。遭遇战地图使用标准游戏规则集,且不支持任何脚本。若要制作具有自定义规则集的自定义地图,应将地图类型更改为【自定义】。要实现这一点,请点击【地图设置】(位于顶部栏),然后从地图类型下拉菜单中选择【自定义】选项。 玩家槽位 除了能够运行自定义脚本外,自定义地图还可以修改玩家槽位。总共有四个槽位,每个槽位可以设置为以下选项之一: - 开放:开放槽位可在开始游戏时从大厅中选择,可供人类玩家、AI机器人使用,或设为空位。 - 关闭:关闭槽位任何人都无法使用。仍可在地图编辑器中放置分配给该槽位的单位,但它们将缺乏集中式AI(被挑衅时仍会攻击其他队伍的单位)。 - AI:AI槽位无法从大厅中选择,但会拥有正常的AI行为。该内容为代码示例,与Uncrewed游戏无关,无法进行符合要求的汉化处理,故删除。布尔表达式 条件语句是一种布尔表达式——一种计算结果为真或假的语句。 该语言提供了多种可用于构建此类语句的运算符,它们分别是: 等于:==运算符 不等于:!=运算符 小于:<运算符 小于等于:<=运算符 大于:>运算符 大于等于:>=运算符 还有逻辑运算符可用于将较小的条件语句组合成更复杂的语句: 非:!运算符 与:&&运算符 或:||运算符 循环 循环用于执行一条语句或一组语句,直到满足某个条件为止。共有三种类型的循环可用。范围循环 范围循环旨在与列表等可迭代对象配合使用。它是对一组值执行操作的最简单方式。 for (x : 可迭代对象) { 操作语句 } 例如: element_sum = 0; for (x : list(1, 2, 3)) { element_sum = element_sum + x; } 此例中,变量element_sum将包含列表元素的总和,即6。 for循环 for循环是一种更通用的循环形式。它依赖于条件语句的结果为真。 for (初始化语句; 条件语句; 迭代语句) { 操作语句 } 首先执行初始化语句,完成循环准备所需的所有步骤。此语句仅执行一次。然后执行条件语句,如果条件语句的计算结果为 true,则执行操作语句,最后执行迭代语句。之后循环会重新从条件语句开始。当条件语句的计算结果为 false 时,循环停止。 例如: y = 0; for (i = 0; i < 5; i = i + 1) { y = y + 5; } 这里,首先初始化语句声明变量 i 并将其初始化为 0,然后条件语句检查变量 i 是否小于 5,如果是,则执行操作语句,即简单地将 5 加到变量 y 上。接着迭代语句将 i 加 1,循环重新从条件语句开始。这个循环总共会执行 5 次,最终变量 y 的值为 25。While循环 While循环与一般的For循环类似,但它没有初始化语句,也没有迭代语句。 while (条件语句) { 执行语句 } 条件语句会被执行,如果其计算结果为true,则执行语句会被执行。循环会重新从条件语句开始。当条件语句的计算结果为false时,循环停止。 y = 0; x = 0; while (x < 5) { y = y + 5; x = x + 1; } 这个循环总共会执行5次,最终变量y的值为25。 函数 函数是代码块。通过调用函数可以执行其包含的代码。调用函数时,函数可以接收多个参数,也可以不接收参数。函数还可以返回一个值。函数调用的形式如下: function-name(argument-0, argument-1, ..., argument-n) 大多数函数接受固定数量的参数。例如,函数min接受两个参数,并返回其中较小的那个: min(23, 9) 函数的结果可以绑定到变量: x = min(23, 9) 结果是变量x包含值9。 也有一些函数接受可变数量的参数。例如用于初始化列表的list函数: empty_list = list(); short_list = list(1, 2); longer_list = list("Cat", "Dog", "House", "Car", "Keys"); Lambda函数 Lambda(也称为匿名函数)是一种未绑定到特定名称的函数。Lambda函数的声明和定义如下: [capture-list] (parameter-list) { body } 首先,声明中的捕获列表部分指定了它可以使用其声明所在作用域中的哪些变量。 例如,以下lambda可以访问变量x和y,但不能访问z: x = 5; y = 7; z = 3; do_something = [x, y] () { x = 1; y = -6; }; do_something(); 请注意,lambda内部对变量x和y所做的更改不会影响外部变量,因为它们在lambda初始化时会被复制。 为了能够修改原始变量,需要在捕获列表中用ref限定符标记它们。x = 5; y = 7; z = 3; do_something = [ref x, ref y] () { x = 1; y = -6; }; do_something(); 如果 lambda 的捕获列表中包含 ref 或 val 限定符,它可以自动捕获引用的变量。 x = 5; modify_some_var = [ref] () { x = 1; // lambda 内部和外部的变量 x 现在都包含 1。 }; modify_some_var(); do_not_modify_some_var = [val] () { x = 10; // lambda 内部的变量 x 现在包含 10, // 但 lambda 外部的变量 x 仍保持不变,为 1。 }; do_not_modify_some_var(); 然后参数列表指定 lambda 函数的参数名称和数量。它也可以留空。 最后,函数体是一组表示函数代码块的语句。lambda表达式的最后一个语句的结果也会成为它的返回值。 和其他函数一样,为了发挥作用,lambda函数需要被调用。调用方式有以下几种: 1. lambda函数可以在接受函数对象的函数参数位置进行声明和定义,然后由该函数执行:min_element(list(2, 1, 3), [] (x, y) {x < y}) 函数min_element会执行lambda函数[] (x, y) {x < y},以找出列表中的最小元素并返回。 2. lambda函数可以绑定到一个变量,以便稍后调用。 square_and_add_one = [] (x) { x * x + 1 }; square_and_add_one(5) 3. lambda函数也可以在声明、定义后立即被调用。结果 = [] (文本) { 文本 + " :)"; } ("你好世界"); 注释 注释是不会被解释为代码的文本片段,并且会被脚本编译器完全忽略。它们可用于解释代码或暂时禁用部分代码。 有两种类型的注释:单行注释和多行注释。 单行注释以//(两个斜杠)开头,它指示编译器忽略该行末尾之前的所有内容。 // 这是一条注释,会被脚本编译器忽略 x = 2;// 这也是一条有效的注释。 多行注释以/* 需要忽略的文本 */的形式编写,这意味着/* */之间的所有内容都会被忽略。例如,如果你想制作一张PVE地图,让两名玩家组成一队对抗同样组队的两名AI敌人,那么槽位设置可能如下: 玩家一 (开放) 队伍(A) 玩家二 (开放) 队伍(A) 玩家三 (AI) 队伍(B) 玩家四 (AI) 队伍(B) 脚本对象 最后,要自定义地图规则,需要使用脚本对象。添加新脚本对象的方法是:进入【对象】->【工具】,然后搜索【空脚本】。 脚本对象自身有几个属性: 名称 - 脚本的名称;注意此名称无法在代码中的任何位置引用,更多是作为描述使用。运算符参考 以下是所有可用运算符的列表: 运算符 描述 示例 [] 下标 list(1, 2, 3)[0] () 函数调用 square(4) unary ! 逻辑非 !x unary - 一元减号 -x unary + 一元加号 +x * 乘法 x * y / 除法 x / y % 取模 x % y - 减法 x - y + 加法 x + y < 小于 x < y <= 小于等于 x <= y > 大于 x > y >= 大于等于 x >= y == 等于 x == y != 不等于 x != y && 逻辑与 x && y || 逻辑或 x || y = 赋值 x = y , 逗号 x, y 优先级 优先级 运算符 结合性 1 [] () 从左到右 2 unary ! unary - unary + 从左到右 3 * / % 从左到右 4 - + 从左到右 5 <= > >= == !=标准类型构造函数 标准类型构造函数是用于创建、初始化并返回标准类型对象的函数。 列表 list(参数0, 参数1, ..., 参数n) 根据任意数量的参数对象创建、初始化并返回一个列表对象。 参数 参数0, 参数1, ..., 参数n - 按调用时的顺序包含在列表中的对象 返回值 列表对象 示例 list(1, 2, 3, 4, 5) 返回: (1, 2, 3, 4, 5) 对 pair(第一个对象, 第二个对象) 创建、初始化并返回一个包含两个对象的对对象。参数 第一个对象 - 配对中的第一个对象 第二个对象 - 配对中的第二个对象 返回值 配对对象 示例 pair(true, 15) 返回:(true, 15) mapmap(参数0, 参数1, ..., 参数n) 根据任意数量的参数对象(每个参数应为键值对对象)创建、初始化并返回一个映射对象(关联容器)。 参数 参数0, 参数1, ..., 参数n - 要包含在映射中的配对(键值对) 返回值 映射对象 示例 map(pair("apple", "round"), pair("brick", "blocky")) rangerange(a, b) 创建、初始化并返回一个整数范围对象,其区间为[a, b),可进行迭代。参数 a - 第一个端点,包含在范围内 b - 第二个端点,不包含在范围内 返回 范围对象 示例 result = 0; for (x : range(0, 3)) { result = result + x }; result 返回:6 还有其他构造函数,但很少需要显式调用它们(布尔型、整数型、数字型)。本指南的字符串部分中讨论的另一个构造函数是string,它有助于将其他类型转换为字符串。 标准函数 count count(可迭代对象) 获取可迭代对象(如列表)的大小(元素数量)。参数 可迭代对象 - 一个可迭代对象(如列表) 返回 可迭代对象的大小(元素数量) 示例 count(list("cat", "dog", "bird")) 返回:3 min_element min_element(可迭代对象, 谓词) 获取可迭代对象中的最小元素。元素的顺序由提供的谓词决定。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,用于比较两个值,若第一个值小于第二个值则返回true。可以是以下形式的lambda函数: [] (a, b) { ...返回值 可迭代对象中的最小元素 示例 min_element(list(5, 47, 1, 20), [] (a, b) {a < b}) 返回:1 max_element max_element(可迭代对象, 比较函数) 获取可迭代对象中的最大元素。元素的顺序由提供的比较函数决定。 参数 可迭代对象 - 一个可迭代对象(如列表) 比较函数 - 一个比较两个值的函数对象,如果第一个值小于第二个值则返回true。可以是以下形式的lambda函数: [] (a, b) { ... }返回值 可迭代对象中的最大元素 示例 max_element(list(5, 47, 1, 20), [] (a, b) {a < b}) 返回:47 none_of none_of(可迭代对象, 谓词) 检查可迭代对象的所有元素是否都不满足所提供谓词的条件。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,它接受一个元素作为参数,如果满足条件则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... }返回值 如果所有元素都不满足提供的谓词条件,则返回true,否则返回false 示例 none_of(list(15, 2, 80, 54), [] (x) {x > 100}) 返回:true none_of(list(15, 304, 80, 54), [] (x) {x > 100}) 返回:false any_of any_of(可迭代对象, 谓词) 检查可迭代对象中是否至少有一个元素满足提供的谓词条件。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,接受一个元素作为参数,如果条件满足则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... }返回值 如果至少有一个元素满足提供的谓词条件,则返回true,否则返回false 示例 any_of(list(15, 2, 760, 54), [] (x) {x > 100})返回:true any_of(list(15, 2, 80, 54), [] (x) {x > 100})返回:false all_of all_of(可迭代对象, 谓词) 检查可迭代对象的所有元素是否都满足提供的谓词条件。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,接受一个元素作为参数,如果满足条件则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... }返回值 如果可迭代对象的所有元素都满足提供的谓词条件,则返回true,否则返回false。示例 any_of(list(150, 200, 760, 540), [] (x) {x > 100})返回:true any_of(list(150, 200, 14, 540), [] (x) {x > 100})返回:false for_each for_each(可迭代对象, 操作) 对可迭代对象中的每个元素调用提供的函数对象。 参数 可迭代对象 - 一个可迭代对象(例如列表) 操作 - 一个以元素为参数的函数对象。可以是以下形式的lambda函数: [] (x) { ... } 返回值 无 示例 for_each(list("Hello World!", "Test Message"), [] (msg) {send_text_message(msg)}) 显示两条消息:Hello World!半径 - 脚本对象检测圆的半径 - 这是一个重要属性,因为可以通过从任何脚本对象调用tracked_units函数来查询当前在检测范围内的单位。 自动启动 - 默认情况下,所有脚本在游戏开始时立即启动。可以通过取消勾选此选项来更改。然后,要启动此特定脚本,需要从其他某个脚本调用start_script函数。 代码 - 脚本对象的代码是可编辑的,这里是可以修改游戏行为的地方。 对象链接 - 这是另一个重要属性。通过点击相应按钮,可以将其他对象(单位、建筑、脚本等)链接到此脚本。测试消息 findfind(可迭代对象, 谓词) 查找并返回可迭代对象中第一个满足所提供谓词条件的元素。 参数 可迭代对象 - 一个可迭代对象(如列表) 谓词 - 一个函数对象,它接受一个元素作为参数,如果满足条件则返回true,否则返回false。可以是以下形式的lambda函数: [] (x) { ... } 返回值 包含以下内容的Pair对象: 索引0:若找到元素则为true,否则为false 索引1:找到的元素(若找到) 示例 find(list(1, 2, 3), [] (x) {x > 1}) 返回:(true, 2) transformtransform(可迭代对象, 转换器) 对可迭代对象中的每个元素调用所提供的转换器对象函数。然后,它会获取该函数对象的结果并将其添加到结果列表中。最后,返回结果列表。 参数 iterable_object - 一个可迭代对象(例如列表) transformer - 一个函数对象,它接受一个元素作为参数并返回一个新对象,该新对象随后被添加到结果列表中。如果该函数对象没有返回对象,则不会向列表中添加任何内容。可以是以下形式的lambda函数:[] (x) { ... } 返回值 返回对象组成的列表对象 示例 transform(list(1, 2, 3), [] (x) {x * 2})返回:(2, 4, 6) transform(list(1, 2, 3), [] (x) {if (x != 2) {x}})返回:(1, 3) randomrandom(a, b) 返回在[a, b]区间上均匀分布的随机数。参数 a - 区间的第一个端点 b - 区间的第二个端点 返回 区间 [a, b] 上的一个随机数 示例 random(0, 5) 返回:0 返回:0 返回:4 返回:5 min min(a, b) 返回 a 和 b 之间的较小值。 参数 a - 第一个值 b - 第二个值 返回 a 和 b 之间的较小值 示例 min(8, 3) 返回:3 max max(a, b) 返回 a 和 b 之间的较大值。 参数 a - 第一个值 b - 第二个值 返回 a 和 b 之间的较大值 示例 max(8, 3) 返回:8 游戏对象构造函数 resource resource(resource_name) 创建、初始化并返回一个游戏资源对象。参数 resource_type_name - 资源的类型名称(“pellets”、“heavypellets”、“slots”) 返回 资源对象 示例 resource("pellets") player player(player_name) 创建、初始化并返回一个玩家对象。 参数 player_name - 玩家名称(“Player One”、“Player Two”、“Player Three”、“Player Four”) 返回 玩家对象 示例 player("Player One") weapon_type weapon_type(weapon_type_name) 创建、初始化并返回一个武器类型对象。参数 weapon_type_name - 武器类型名称,可为以下之一: "" "等离子放电器" "旋转机枪" "左轮手枪" "加农炮" "榴弹发射器" "火箭发射器" "激光" "轨道炮" "微型发射器" "维修工具" "脉冲激光" "弹药打印机" "火炮" "破片发射器" "大型轨道炮" "EMP枪" "等离子喷射器" "等离子发射器" "大型旋转机枪" "大型左轮加农炮" "大型加农炮" "红外制导导弹发射器" 返回 武器类型对象 示例 weapon_type("旋转机枪") blueprintblueprint(unit_name) 创建、初始化并返回一个单位蓝图对象。 参数 unit_name - 单位名称;目前仅支持地图资源库中的单位。返回 蓝图对象示例 blueprint("Tank") 建筑类型 building_type(building_type_name) 创建一个建筑类型对象。 参数 building_type_name - 建筑类型名称,可为以下之一: "Armory"(军械库) "Explosives Lab"( explosives lab) "Propulsion Lab"(propulsion lab) "Rocket Lab"(rocket lab) "Energy Lab"(energy lab) "Laser Lab"(laser lab) "Reactor"(反应堆) "Repair Pad"(repair pad) "Repair Bay"(repair bay) "Resource Chute"(resource chute) "Field Factory"(field factory) "Barrier"(屏障) "Marine Factory"(marine factory) "Mount"(mount) 返回 建筑类型对象示例 building_type("Armory") 武器规格 weapon_spec(weapon_spec_name) 创建一个武器规格对象。参数 weapon_spec_name - 规格名称,可为以下之一: "damage" - 伤害值; "cooldown" - 冷却时间; "maxrange" - 最大有效射程; "saferange" - 安全射击范围; "exitspeed" - 弹丸出膛速度(仅限手榴弹/炮弹/等离子/火箭发射器); "ammoperpellet" - 每发弹丸的弹药单位消耗; 返回 武器规格对象 示例 weapon_spec("damage") order_type order_type(order_type_name) 创建单位指令对象。参数 order_type_name - 指令名称,可为以下之一: "moveto" - 移动至某点; "attack" - 攻击目标; "attack-moveto" - 移动至某点,并攻击遭遇的单位; "takeoff-land" - 起飞或降落; "ram" - 冲撞某点; "reorient" - 调整物体朝向; "liftup" - (用磁铁)提起物体; "drop" - 放下物体; "inflate-deflate" - 充放气垫; "extend-retract-beams" - 伸缩支撑梁; "attach" - 附着至最近的挂载点; "detach" - 从挂载点脱离; 返回 order_type 对象 示例 order_type("moveto") 通用游戏函数 create_timer create_timer(interval, function_object) 创建一个定时事件,在设定时间后执行。参数 interval - 调用函数对象的时间间隔 function_object - 要调用的函数对象 返回值 无 示例 create_timer(5.0, [] () {send_text_message("游戏内已过去5秒!")}) set_callback set_callback(callback_name, function_object) 设置全局游戏回调。参数 回调名称 - 全局回调名称,可为以下之一: "destruction" - 每当有单位被摧毁时调用此回调;此时函数对象的签名为: 回调函数(被摧毁单位) "kill" - 每当有单位摧毁另一个单位时调用此回调;此时函数对象的签名为: 回调函数(被摧毁单位, 击杀单位) 函数对象 - 要调用的函数对象 返回值 无 示例 set_callback( "destruction", [] (单位) { send_text_message(get_unit_name(单位) + " 刚刚被摧毁了!"); } ) elapsed elapsed() 返回自脚本启动以来经过的时间。然后,在代码中可以调用linked_units函数来查询这些对象。 脚本语言基础 每个脚本对象可以有四个子句,每个子句都有不同的用途: global_init - 此子句总是在游戏开始时执行,即使脚本未设置为自动启动。 init - 此子句在脚本首次启动时执行一次且仅执行一次。例如,对于非自动启动的脚本,在脚本被显式启动之前,它不会执行。 condition - 此子句在每个逻辑 tick 执行,直到其计算结果为 true。为了使其计算结果为 true,该子句的最后一条语句必须计算为 true。 action - 此子句在 condition 子句计算结果为 true 时执行一次且仅执行一次。elapsed 参数:无 返回值:脚本首次启动后经过的时间 示例:five_seconds_passed = elapsed() > 5 start_script start_script(script_object) 启动一个脚本。 参数:script_object - 要启动的脚本对象 返回值:无 示例:start_script(other_script) restart restart() 指示脚本在执行完动作子句后重新启动自身(必须从动作子句中调用)。 参数:无 返回值:无 示例:restart() this_location this_location() 获取调用者的位置对象。 参数:无 返回值:位置对象 tracked_units 变体1:tracked_units() 变体2:tracked_units(location_object) 检索以下对象跟踪的单位列表(圆圈内的单位): 变体1:当前位置。 变体2:另一个指定的位置。参数 变体1:无 变体2:location_object - 位置对象 返回值:单位对象列表 linked_units 变体1:linked_units() 变体2:linked_units(location_object) 功能:获取与以下对象关联的单位列表: 变体1:当前位置 变体2:另一个指定位置 参数 变体1:无 变体2:location_object - 位置对象 返回值:单位对象列表 send_text_message send_text_message(message) 功能:直接向主消息滚动栏发送文本消息 参数:message - 文本消息 返回值:无 send_transmission send_transmission(transmission) 功能:发送标准游戏传输信息(消息),该信息将显示在屏幕上参数 传输 - 传输文本 返回 无 玩家函数 get_unit_count get_unit_count(player) 返回玩家当前的单位数量。 参数 player - 玩家对象 返回 单位数量 fund_player fund_player(player, resource_list) 向玩家给予设定数量的资源。 参数 player - 目标玩家 resource_list - 资源对象与数量对的列表 返回 无 示例 fund_player(player("玩家一"), list(pair(resource("pellets"), 200), pair(resource("heavypellets"), 50))) can_charge_player can_charge_player(player, resource_list) 检查玩家是否拥有足够的资源。参数 player - 目标玩家 resource_list - 资源对象与数量的配对列表 返回 若玩家拥有足够资源进行操作则返回true,否则返回false 示例 can_charge_player(player("玩家一"), list(pair(resource("弹丸"), 200), pair(resource("重型弹丸"), 50))) charge_player charge_player(player, resource_list) 从玩家处扣除资源。 参数 player - 目标玩家 resource_list - 资源对象与数量的配对列表 例如 返回 无 示例 charge_player(player("玩家一"), list(pair(resource("弹丸"), 200), pair(resource("重型弹丸"), 50))) get_players get_players() 获取参与游戏的玩家列表 参数 无 返回 玩家列表 get_teams get_teams() 获取参与游戏的队伍列表。参数 无 返回 队伍列表 declare_defeat declare_defeat(player) 将指定玩家宣告为失败。 注意:允许后续调用此函数,但不会产生任何变化。 参数 player - 失败的玩家 返回 无 declare_victory declare_victory(player) 将指定玩家宣告为胜利。 注意:允许后续调用此函数,但不会产生任何变化。 参数 player - 胜利的玩家 返回 无 are_allies are_allies(first_player, second_player) 检查指定玩家是否为盟友。参数 first_player - 第一名玩家对象 second_player - 第二名玩家对象 返回值 如果玩家是盟友则返回true,否则返回false are_neutral are_neutral(first_player, second_player) 检查指定玩家是否处于中立状态。 参数 first_player - 第一名玩家对象 second_player - 第二名玩家对象 返回值 如果玩家彼此中立则返回true,否则返回false are_enemies are_enemies(first_player, second_player) 检查指定玩家是否为敌人。 参数 first_player - 第一名玩家对象 second_player - 第二名玩家对象 返回值 如果玩家是敌人则返回true,否则返回false 通用对象函数 通用对象函数目前适用于: 单位; 建造平台; 武器; 脚本对象。is_unitis_unit(object) 检查一个对象是否为单位。 参数 object - 要检查的对象 返回值 如果对象是单位则返回true,否则返回false 示例 // 从通用对象列表中生成单位列表。 units = list(); for (object : objects) { if (is_units(object)) { units = units + object; } } is_buildpadis_buildpad(object) 检查一个对象是否为建造平台。 参数 object - 要检查的对象 返回值 如果对象是单位则返回true,否则返回false 示例 // 从通用对象列表中生成建造平台列表。 buildpads = list(); for (object : objects) { if (is_buildpad(object)) { buildpads = buildpads + object; } } set_user_objectset_user_object(unit, user_object) 设置单位的用户对象。参数 unit - 单位对象 user_object - 用户对象(可以是任何对象) 返回值 无 get_user_object get_user_object(unit) 获取单位的用户对象。 参数 unit - 单位对象 返回值 单位存储的用户对象 单位函数 get_unit_name get_unit_name(unit) 获取单位的名称。 参数 unit - 单位对象 返回值 单位的名称 get_unit_player get_unit_player(unit) 获取单位所属的玩家。 参数 unit - 单位对象 返回值 玩家对象 get_health get_health(unit) 获取单位的当前生命值。 参数 unit - 单位对象 返回值 单位的生命值 get_max_health get_max_health(unit) 获取单位的最大生命值。 参数 unit - 单位对象 返回值 单位的最大生命值获取生命值上限 参数:单位 - 单位对象 返回值:单位的最大生命值 获取能量值 获取单位当前的能量值。 参数:单位 - 单位对象 返回值:单位的能量值 获取能量上限 获取单位的最大能量值。 参数:单位 - 单位对象 返回值:单位的最大能量值 是否着地 检查单位是否着地。 参数:单位 - 单位对象 返回值:若单位着地则为true,否则(飞行状态)为false 是否潜水 检查单位是否潜入水中。 参数:单位 - 单位对象 返回值:若单位处于潜水状态则为true,否则为false 是否锚定 检查单位是否锚定在锚点上。 参数:单位 - 单位对象参数 unit - 单位对象 返回值 如果单位已锚定则返回true,否则返回false can_drive can_drive(unit) 检查单位是否能在地面或水上移动。包括轮式单位、履带式单位、步行单位、水上载具和气垫船。 参数 unit - 单位对象 返回值 如果单位能在地面或水上移动则返回true,否则返回false can_fly can_fly(unit) 检查单位是否能飞行。 参数 unit - 单位对象 返回值 如果单位能飞行则返回true,否则返回false has_magnet has_magnet(unit) 检查单位是否有磁铁。 参数 unit - 单位对象 返回值 如果单位有磁铁则返回true,否则返回false can_attack can_attack(unit) 检查单位是否能(一般情况下)攻击。如果脚本不需要,任何子句都可以省略。 子句可以按以下方式声明和定义: 子句名称 { 主体内容 } 其中,子句名称是四个子句名称之一,主体内容是一组代码语句。 因此,包含所有四个子句的脚本对象可能如下所示: global_init { 语句 } init { 语句 } condition { 语句 } action { 语句 } condition子句与其他所有子句的不同之处在于,其最后一条语句的计算结果应为true或false。 语句 语句是代码逻辑的基本单位,它执行某些操作。例如: z = x * y 这条语句将变量x和y相乘,并将结果赋值给变量z。参数 unit - 单位对象 返回值 若单位可以攻击则返回true,否则返回false can_heal can_heal(unit) 检查单位是否可以治疗其他单位。 参数 unit - 单位对象 返回值 若单位可以治疗其他单位则返回true,否则返回false can_restock can_restock(unit) 检查单位是否可以为其他单位补充弹药。 参数 unit - 单位对象 返回值 若单位可以为其他单位补充弹药则返回true,否则返回false can_emp can_emp(unit) 检查单位是否至少拥有一件EMP武器。 参数 unit - 单位对象 返回值 若单位至少拥有一件EMP武器则返回true,否则返回false has_weapons has_weapons(unit) 检查单位是否拥有武器。参数 unit - 单位对象 返回值 若单位拥有武器则返回true,否则返回false get_weapons get_weapons(unit) 获取单位的武器列表。 参数 unit - 单位对象 返回值 武器列表 get_tools get_tools(unit) 获取单位的工具列表(纳米喷雾和弹药打印机)。 参数 unit - 单位对象 返回值 武器列表 get_cost get_cost(unit) 获取单位的成本列表。 参数 unit - 单位对象 返回值 成本列表(不包括槽位) set_damageable set_damageable(unit, damageable) 获取单位的武器列表。 参数 unit - 单位对象 damageable - 若单位可被伤害则为true,否则为false 返回值 无 inflict_damage inflict_damage(unit, damage) 对单位造成设定量的伤害。参数 unit - 单位对象 damage - 伤害数值 返回值 无 healheal(unit, hit_points) 按设定的生命值数量治疗单位。 参数 unit - 单位对象 hit_points - 要恢复的生命值数量 返回值 无 set_energyset_energy(unit, energy) 设置单位的能量值。 参数 unit - 单位对象 energy - 能量等级(以最大容量的百分比计,0-100) 返回值 无 move_tomove_to(unit, location) 指令单位移动至指定位置。 参数 unit - 单位对象 location - 位置对象 返回值 无 attack_move_toattack_move_to(unit, location) 指令单位移动至指定位置(同时攻击遭遇的敌方单位)。参数 unit - 单位对象 location - 位置对象 返回值 无 攻击 attack(unit, target) 指令单位攻击目标。 参数 unit - 单位对象 target - 目标单位 返回值 无 转移至 transfer_to(unit, player) 将单位的所有权转移给另一位玩家。 参数 unit - 单位对象 player - 单位的新所有者 返回值 无 下达指令 give_order(unit, order_type, [可选] target) 向单位下达指令。 参数 unit - 单位对象 order_type - 指令类型对象 target - 目标对象(部分指令(如起飞-降落)无需目标) 返回值 无 示例 give_order(unit, order_type("attack"), enemy_unit); give_order(flying_unit, order_type("takeoff-land")); // 抬起单位,并将其投放到指定位置。// 注意:指令会被放入队列,因此在这种情况下需要按相反顺序下达指令。 give_order(单位, order_type("drop"), 目标位置); give_order(单位, order_type("liftup"), 目标单位); cancel_orderscancel_orders(单位) 取消单位的所有指令(活动中和待处理的)。 参数 单位 - 单位对象 返回值 无 AI 函数 guard_thisguard_this(单位, 存在点名称) 命令单位守卫此位置(调用脚本对象的位置)。 守卫单位不会从该位置撤退(通常停留在该位置的圆圈范围内)。 注意:仅对 AI 机器人单位有效。 参数 单位 - 单位对象 存在点名称 - AI 机器人维护的存在点位置名称。guard_location guard_location(单位, 位置, 存在名称) 命令单位守卫某个位置。 执行守卫命令的单位不会从该位置撤退(通常会待在该位置的圆圈范围内)。 注意:仅对AI机器人单位有效。 参数 单位 - 单位对象 位置 - 位置对象(另一个脚本对象) 存在名称 - AI机器人维护的存在位置名称。如果该守卫命令未关联存在位置,则可以为空字符串"" 返回值 无 武器函数 get_weapon_type get_weapon_type(武器) 获取武器的武器类型。 参数 武器 - 武器对象 返回值 武器类型对象 示例 // 获取单位第一个武器的类型。if (has_weapons(unit)) { unit_weapons = get_weapons(unit); get_weapon_type(unit_weapons[0]); } // 检查单位是否至少拥有一把旋转机枪。 if (any_of(get_weapons(unit), [] (weapon) {get_weapon_type(weapon) == weapon_type("旋转机枪")})) { send_transmission("该单位拥有旋转机枪!") } get_ammoget_ammo(weapon) 获取武器当前的弹药量。 参数 weapon - 武器对象 返回 弹药量 示例 // 获取单位第一把武器的弹药量。 if (has_weapons(unit)) { unit_weapons = get_weapons(unit); get_ammo(unit_weapons[0]); } get_max_ammoget_max_ammo(weapon) 获取武器的最大弹药量。 参数 weapon - 武器对象 返回 最大弹药量 set_ammoset_ammo(weapon, ammo) 设置武器的弹药量。参数 weapon - 武器对象 ammo - 弹药数量 返回值 无 示例 // 为单位的所有武器补充弹药 for(weapon : get_weapons(unit)) { set_ammo(weapon, get_max_ammo(weapon)); } set_max_ammo set_max_ammo(weapon, max_ammo) 设置武器的最大弹药量。 参数 weapon - 武器对象 max_ammo - 最大弹药数量 返回值 无 示例 // 提升单位所有武器的最大弹药容量 for(weapon : get_weapons(unit)) { set_max_ammo(weapon, get_max_ammo(weapon) + 50); } set_weapon_spec set_weapon_spec(weapon, weapon_spec, value) 设置武器的某项武器参数。 参数 weapon - 武器对象 weapon_spec - 武器参数对象 value - 参数值 返回值 无 示例 // 将武器的伤害输出设为10。设置武器属性(武器, 武器属性("伤害"), 10); 生成函数 生成单位 生成单位(蓝图, 武器类型, 玩家, 位置) 生成一个新单位。 参数 蓝图 - 描述单位的蓝图对象 武器类型 - 用于单位主武器的武器类型对象 玩家 - 新生成单位所属的玩家 位置 - 生成位置 返回 单位对象 示例 生成单位( 蓝图("企鹅"), 武器类型("旋转机枪"), 玩家("玩家一"), 当前位置() ); 能否生成单位 能否生成单位(蓝图, 玩家) 检查是否可以生成单位。参数 blueprint - 描述单位的蓝图对象 player - 新生成单位所属的玩家 返回值 若单位可以生成则返回true,否则返回false 示例 if (can_spawn_unit(blueprint("Penguin"), player("Player One"))) { ... } spawn_building spawn_building(building_type, buildpad) 在指定建造平台上生成建筑。 参数 building_type - 描述建筑的建筑类型对象 buildpad - 生成建筑的位置 返回值 无 示例 buildpad = linked_objects()[0]; spawn_building("Armory", buildpad); destroy_building destroy_building(buildpad) 摧毁指定建造平台上的建筑。可以使用“;”(分号)字符分隔多个语句: z = x * y; w = z / 2; 这里,和之前一样,变量x和y相乘后赋值给变量z,然后在下一个语句中,变量z除以2并赋值给变量w。 变量 变量用于存储值。变量需要声明,并通过首次为其赋值进行初始化。 x = 3; 变量可以是局部变量、成员变量或全局变量。 局部变量仅在其声明的作用域内可见。 x = 7; 成员变量对整个脚本对象可见。 member y = "Hello World!"; 全局变量对所有人可见,包括其他脚本对象。参数 buildpad - 生成建筑的位置 返回值 无 has_building has_building(buildpad) 检查建造平台是否已部署建筑。 参数 buildpad - 生成建筑的位置 返回值 若建造平台已部署建筑则返回true,否则返回false 目标函数 set_objective_text set_objective_text(player, objective_name, object_text) 初始化目标并设置其文本。 参数 player - 玩家对象 objective_name - 目标名称 object_text - 目标文本 返回值 无 示例 set_objective_text(player("Player One"), "survive_objective", "存活15分钟") set_objective_status set_objective_status(player, objective_name, status) 设置目标的状态。参数 玩家 - 玩家对象 目标名称 - 目标的名称 目标状态 - 目标的状态(“已完成”) 返回值 无 示例 设置目标状态(玩家(“玩家一”), “生存目标”, “已完成”)全局游戏分数 = 1000; 若要从另一个脚本对象访问全局变量,必须先使用导入命令进行导入。 导入 游戏分数; 变量名称区分大小写。例如,SomeVariable、someVariable、somevariable 这三个名称分别指代三个不同的变量。 列表 列表用于存储值的集合。 列表通过 list 函数进行声明和初始化。列表(1, 2, 3) 列表本身是对象,可以像之前讨论的那样分配给变量: some_list = 列表(1, 2, 3) 两个或多个列表可以使用+运算符连接在一起: longer_list = 列表(1, 2, 3)+ 列表(4, 5) 可以使用[]运算符访问、读取和写入单个列表元素: some_list = 列表(1, 2, 3); some_list[0] = 9; 列表索引从0开始,这意味着列表的第一个元素的索引为0。 字符串 字符串是可以包含文本的对象(目前仅支持ASCII)。使用"(双引号)字符声明和初始化。 text = "Hello World!" 两个或多个字符串可以使用+运算符连接在一起: text = "Hello " + "World!" 字符串可以与非字符串对象连接,前提是这些对象可以转换为字符串。score = 1000; text = "游戏分数:" + score; 注意,在这种情况下,字符串必须位于其他对象的左侧。 其他对象(如数字)也可以通过调用string函数显式转换为字符串: string(20) + "是一个正数" 条件语句 条件语句用于在满足某些条件时执行代码。可以使用if和else关键字编写: if (条件) { 真语句 } else { 假语句 } 如果条件语句为真,则执行真语句,否则执行假语句。条件语句可以是任何可计算为真或假的语句。 例如: x = 14 if (x < 100) { send_text_message("此语句为真!"); } else { send_text_message("此语句为假")




本指南将引导玩家完成增强初始单位的流程,包括为其配备双武器、调整装甲和框架部件的尺寸以及弯曲部件。 描述 玩家在游戏初期能进行的最重要升级就是添加第二个武器挂载点。机器人的CPU能够操控两把武器。而Harvester Mk II只是缺少一个安装第二把武器的位置。最简单的方法是移除顶部现有的挂载点,然后在其连接的模块左侧和右侧各添加一个。这种侧向安装的武器虽然足够好用,但会限制武器左右转动的幅度。这种设计更进一步,提供了两个垂直放置的武器支架,它们之间留有空间,能够进行360度全方位旋转。这对于转向缓慢的载具来说通常更为重要。在这个示例中,通过移除【轻型框架克隆件】并添加两个定制的【梁架】来安装武器支架。 示例单位 这是【收割机Mk II】的改装版本。我在学习过程中借鉴了一些概念来设计它,展示了零件设计的多个元素。我针对两种装配模式上传了两个版本,此为3D打印(快速拼接模式)版本。对于可能感兴趣的玩家,另有线性生产版本可供参考。变更摘要: * 新增两个垂直武器挂载点。 * 将轻型框架替换为尺寸大致相同的装甲板。 * 移除资源提取器,以避免增加战斗载具的成本。 * 将天空磁铁移至前方,这使得单位能更轻松地稍微调整同伴的朝向。 * 新增两个额外的轻型平板,以提供更多生命值和护甲。 新的自定义部件提供了X、Y、Z轴缩放以及弯曲的示例。 该单位完全能够应对战役初期的内容。 操作步骤指导: 建议首先克隆初始的“收割机Mk II”,然后对克隆体进行修改。这样在设计过程中可以对比两者,并且在需要时也可以重新开始。1. 【轻型框架】组件已被移除,并替换为定制的【装甲板】。若要了解其制作方法,请先复制默认的【装甲板】,然后添加三个【缩放】修改器。第一个修改器设为X轴,乘数为1.6;第二个设为Y轴,乘数为1.15;第三个设为Z轴,乘数为0.5。其中,X代表长度,Y代表宽度,Z代表厚度。实际上,X值1.75和Y值1.25与【轻型框架】的尺寸最为接近,但为了节省【弹丸】,我减少了这些数值。每个【缩放】值的最大值为2(两倍),最小值为0.5(一半)。我选择了最小厚度,以便在电池下方提供尽可能多的间隙,因为在这款游戏中存在【托底】现象。2) 在确定了装甲框架的尺寸后,车辆其余的框架和车轮组件与收割机Mk II保持一致。移除了资源提取器,并将天空磁铁移至前方。同时移除了原武器支架、C6适配立方体以及轻型框架克隆体。 下一个自定义组件是弯曲的梁架。其制作方法如下:首先克隆默认的梁架,然后添加弯曲修改器和缩放修改器。将弯曲修改器设置为Y轴方向,角度为190度。选择这个角度是因为此时两端能均匀对齐。将现已弯曲的梁架连接到车轮顶部其中一块弯曲装甲板的上方。调整缩放修改器,直至其与另一侧车轮的顶部对齐。在这个案例中,缩放比例最终设为1。67. 在每个顶部安装一个武器支架,总共两个。 确保车轮已正确配置非常重要。将后轮的动力设置为始终开启,转向设置为无。将前轮的动力设置为始终开启,转向设置为直接。这些是此特定设计最稳定的设置。车辆的车轮设置不当通常会导致稳定性下降,在某些情况下还会频繁侧翻。 最后是添加自定义的轻型平板。要了解其制作方法,请先克隆默认的轻型平板(确保是名称中带有“Lightweight”的那个),然后添加缩放修改器和弯曲修改器。将缩放修改器设置为Y轴,乘数为2。将弯曲修改器设置为X轴,角度为118度。现在使用平坦边缘上的一个锚点将其连接到我们开始制作的自定义装甲板侧面。它应朝上并弯曲覆盖在CPU顶部。 现在你应该对缩放和弯曲修改器的工作方式以及通过调整不同轴上的值可以获得的各种结果有了一些了解。你可以通过在战役菜单下进入沙盒模式来安全地进行实验。在沙盒模式中没有敌人,并且你拥有无限资源。建议克隆设计并在克隆版本上进行实验,这样原始版本仍可用于比较。 请记住,重量平衡(重心)对载具的操控性能起着重要作用。 祝你好运,玩得开心!









