都市天际线吧 关注:248,717贴子:1,849,190
  • 6回复贴,共1

模组开发日志#3

只看楼主收藏回复

大家好,我是Sergey。大家估计更熟悉MacSergey这个名字。我制作了《Cities: Skylines》一些热门的模组,诸如路口划线工具(Intersection Marking Tool)、节点控制器更新版(Node Controller Renewal)、道路工具箱(Network Multitool)等等。我于2年前受到Colossal Order雇用,目前正在开发《Cities: Skylines》的模组制作功能。今天我撰写这篇开发者日志,旨在与大家分享我们制作代码模组的方法。
优化代码模组制作
代码模组制作是《Cities: Skylines》的重要部分,我们希望 《Cities: Skylines II》也能有相同,甚至更多模组制作的可能性。我们相信,可以修改游戏是件很酷的事,并且能带来许多机遇。如果您观察一下不同玩家如何使用模组游玩《Cities: Skylines》 ,您会看到完全不同的游玩风格,仿佛他们玩的根本是不同的游戏。一些玩家喜欢事无巨细地还原真实世界;一些玩家喜欢管理交通和产业生产链;一些玩家则放飞自我,让100场龙卷风袭卷城市。
对于“完美的功能组合”,每个人都有不同见解。我们从社区汲取了许多热门建议,将它们纳入游戏的基础功能,但实话说,实现所有玩家的所有愿望是不可能的。这时就该模组出场了。每个人都可以按自己的喜好加入内容,修改游戏,即便您是全世界唯一需要这种功能的玩家。
对我来说就是这样的情况。我是在2019年知道了《Cities: Skylines》 ,当时我在网上看到一篇帖子,说一名玩家在该游戏中复刻了他的家乡城市,这让我也跃跃欲试起来。我开始玩这款游戏,我喜欢游戏自带的功能,但到了某一时刻,我开始设想“要是能做到这样或那样的事就好了。”就这样,我意识到我可以修改游戏,但遗憾的是,我找不到任何能实现我想法的模组,于是我决心自己编写。我没想到我的模组会流行起来,也没想到有其他人需要这些功能,结果我的模组大受欢迎。
我觉得很棒的一点是,尽管《Cities: Skylines》发布以来已过去将近9年,但还有新的模组陆续出现。对于社区来说,这其中一些模组已经成为游戏的必要部分。这只是因为,直到有人为自己制作了这些模组,并分享出来,其他人才意识到他们需要这些功能!
为《CITIES: SKYLINES II》制作模组
《Cities: Skylines》为模组制作提供的支持非常有限。通常您会遇到一个瓶颈——游戏不让您轻易修改一些内容,您就需要花费数日才能实现这种修改。其他模组作者也会遇到同样的限制,并以自己的方式实现修改,而这些实现方式可能彼此冲突。
在《Cities: Skylines II》 ,我们希望提供一切可能的支持,让模组制作更轻松,这样,您就不必自己实现几乎所有模组都需要的、独立于其功能之外的通用功能。我们还进行了一些生活质量方面的优化,这样您就不用花费数日研究您应该安装哪个外部工具版本,或是如何在IDE中创建模组项目,添加所需的游戏从属模组来编写您的模组。
要实现我们的目标,第一步是制作模组制作工具链并投入使用。只需按一个键就可以安装所有需要的从属模组和外部工具,诸如模组制作所需的Unity引擎、Burst编译器和ECS。如果任何从属模组有更新,或者运行要求发生改变,模组制作工具链会在您打开游戏时立即通知您,并提供更新,让您保持最新的开发设置。(图1)
接下来,我们制作模组项目模板,它使用新的.Net模板机制,在Visual Studio或Rider上创建新项目时会显示在项目列表中。所有需要的从属模组、路径和构建后操作都设置好了,您只需按下“构建”按钮,模组将被编译、后处理,并放入正确的文件夹,您启动游戏就可以看到它。(图2)
模组完成后,可以使用默认IDE的发布选项,直接从Visual Studio或Rider发布到 Paradox Mods。项目模板中有个空的发布配置文件需要填写,填写完毕后,点击项目,选择“发布”选项。您的模组将发布到Paradox Mods,其他玩家可以订阅并使用。(图3)
优化模组
游戏使用Unity引擎的一些新技术,诸如实体组建系统或Burst编译,来利用多线程和低级别优化,这能将部分计算的速度提升30至40倍。但是需要额外知识才能运用这些技术,从而从中受益,否则使用这些技术可能反而降低性能。《Cities: Skylines》中人们习惯使用的模组制作方法在《Cities: Skylines II》并不会收获最佳结果。
您依然可以使用Harmony之类《Cities: Skylines》中普遍的模组制作工具,但续作中其局限更多了。Harmony只能修改托管代码,但经过Burst编译之后,为了优化,游戏的部分代码成了非托管代码。


IP属地:陕西来自iPhone客户端1楼2024-03-22 10:13回复
    优化模组
    游戏使用Unity 引擎的一些新技术,诸如实体组建系统或Burst编译,来利用多线程和低级别优化,这能将部分计算的速度提升30至40倍。但是需要额外知识才能运用这些技术,从而从中受益,否则使用这些技术可能反而降低性能。《Cities: Skylines》中人们习惯使用的模组制作方法在《Cities: Skylines II》并不会收获最佳结果。
    您依然可以使用Harmony之类《Cities: Skylines》中普遍的模组制作工具,但续作中其局限更多了。Harmony只能修改托管代码,但经过Burst编译之后,为了优化,游戏的部分代码成了非托管代码。Harmony无法修改此类代码,但这不是问题,因为所有游戏实体和组成部分的信息都可以在模组系统中找到,不需要修改现存游戏代码就可以变更或增加。
    为帮助优化您的模组,我们还提供一个模组后处理器,进行游戏中使用的burst编译和低级别优化,好让模组享有和游戏所用引擎一样的可能性,而不需要您自己另外钻研实现方式。我们为这个工具设置的目标是引导您使用正确方式,减少最常见的错误,防止您花费大量时间定位错误。在团队完成所有优化后,您还可以通过它获得与游戏相同的性能和优化效果。
    优化并非必须,因为它并非对所有代码都有好处,优化与否还是取决于您代码的作用。很多情况下建议优化,因为Unity API使用源代码生成,会在后处理阶段将一些代码替换为实际的实现。如果您的代码使用这样的API调用,并且您不使用我们在所生成模组项目模板和模组后处理器中为您创建的设置,您的代码将不会生效,并且会出现“未实现”异常。
    模组兼容性
    如果您为《Cities: Skylines》制作过模组,您会知道游戏更新对模组兼容性的影响,在《Cities: Skylines II》中,我们希望努力优化这个问题。模组修改的游戏代码可能改变,所以完全避免模组出错是不可能的,但我们正在努力减少模组因游戏更新而出错的可能性。
    如果您熟悉模组制作,您多半知道模组出错的原因,但如果不然,我将试着简短解释一下原因:模组修改游戏代码时,会使用一些“签名”(类名、方法参数、字段等)来定位代码的特定部分。进行更新或故障修复时,基础游戏代码发生变化,模组寻找的“签名”不再存在,又或者,所修改的部分代码与更新前的运作方式有些不同了。我们无法得知数千个模组分别修改哪部分代码,即使我们知道,还是需要修改这些代码才能修复游戏故障、增加新功能。要不损坏模组,唯一方法是完全不更新游戏,但是我们当然需要更新游戏。在开发《Cities: Skylines》最新的几个资料片时,我经历的其中一个有趣时刻是,发布资料片后我意识到我的一个模组损坏了,原因是我自己为了修复故障或增加新功能,修改了基础游戏代码。
    在《Cities: Skylines II》中,这个问题应该有所缓解,因为模组功能与游戏功能生效方式一样。为了制作一个彻底的新功能,您不需要找到游戏代码中的不同位置,彻底修改,来加入您的模组功能,也不需要担心未来游戏更新时,其中一部分基础游戏代码会发生改变。您唯一需要做的事是创建您自己的系统并将其登录在更新循环中。从那一瞬间起,游戏会像对待一切基础游戏系统一样对待您的系统。另一个例子是游戏设置。我们制作了一个简单但灵活的自动系统,它可以从您的模组中获取您用特殊属性标记的属性,并将其填入游戏设置中。同样,您可以通过调用一个方法来登录您的设置,而不用纠结如何为您的模组创建一个设置页。(图4)
    我们还优化了游戏处理模组和其从属模组的方式。如果一个模组整合进第二个模组中,从第三个模组中获取数据,还变更第四个模组中的内容,事情可能变得很复杂。这在《Cities: Skylines》中是个问题,该作在管理模组和游戏的复杂关系上遇到很多困难。您多半在《Cities: Skylines》中遇到过这种情况:由于两个模组使用同一从属模组的不同版本,其中一个模组会损坏另一个模组。 《Cities: Skylines II》努力捕获多数此类复杂关系,并解决模组之间的从属模组冲突。另外,不存在“某一模组必须先于另一模组模组加载才能生效”这样的模组加载顺序。在《Cities: Skylines II》中,您不必担心这种问题出现。


    IP属地:陕西来自iPhone客户端2楼2024-03-22 10:14
    回复
      模组作者视角
      在来到Colossal Order工作之前,我曾是一名程序员,但我此前从未在游戏工作室工作过。我来自模组制作社区,因而我知道从游戏开发者的角度看,有些事情可能没有那么重要。游戏开发者在开发过程中会使用特殊的引擎工具,而且可以接触所有源代码,但模组作者没有这些东西。有时候,使用开发者工具只需鼠标点几下的事,没有这些工具就需要花费数小时,甚至数天,其中差别就是这么大。自从我开始在Colossal Order工作,我很多次想到“啊,这在引擎编辑器里做起来真容易,可是我和其他模组作者之前做起来却那么困难。难怪游戏里没有优化这个问题。”依靠我的模组制作经验,我注意到这些差别,可以强调它们,以便我们进行优化,让模组制作变得远比之前简单和高效。
      我们不只依靠我的模组制作经验,我们还有一个模组制作测试 ,有许多为《Cities: Skylines》制作了热门模组的作者。他们有权抢先体验《Cities: Skylines II》和模组制作工具链,因而可以开始探索游戏和其模组制作的可能性。这段时间,他们甚至制作了一些简单模组,其中一部分你们可能已经试用过了,而我们还在开发模组制作支持。我们听取他们的反馈,像是他们希望模组制作API里有什么内容,或是希望哪部分游戏代码更容易访问。我们希望帮助他们实现创作,让游戏向着各种有趣的方向发展。
      开发能帮助其他模组作者的功能,对我来说是种很有启发性的体验,光是看到抢先体验的模组作者使用我加入游戏的工具为《Cities: Skylines II 》制作超棒的新模组,我已经颇感自豪。我希望我们将代码模组制作支持加入游戏后,可以尽早看到更多社区成员的作品,我们将根据反馈,持续优化支持。


      IP属地:陕西来自iPhone客户端3楼2024-03-22 10:14
      回复


        IP属地:陕西来自iPhone客户端4楼2024-03-22 10:15
        回复
          2代IMT!?


          IP属地:广东来自Android客户端5楼2024-03-22 18:38
          回复
            啊这,模组引擎


            IP属地:黑龙江来自Android客户端6楼2024-03-23 11:53
            回复
              估计等个一两年就不只是半成品,能玩了,全转二代应该是迟早的事


              IP属地:浙江来自iPhone客户端7楼2024-03-26 13:50
              回复