水晶守护者模组制作

0 点赞
Crystal Guardians TD
转载

使用BepInEx和Harmony为《水晶守护者》安装并创建模组。 1. 安装BepInEx 要开始我们的模组制作之旅,首先需要能够加载模组,否则所有工作都将白费。首先,我们需要下载一个兼容版本的BepInEx,目前任何标记为5.4的版本均可。我个人测试过5.4.22和5.4.23.1版本,发现它们都能正常工作。 你需要下载同时支持游戏(x64)和你的平台(Windows、Linux或MacOS)的版本。然后打开游戏所在的目录,在Steam中可以通过右键点击游戏名称(或点击齿轮图标),选择【管理】,然后【浏览本地文件】来找到该目录。将BepInEx压缩包的内容解压到这里。1 启用BepInEx控制台 BepInEx具有控制台输出功能,可供开发者进行printf调试。这能显著加快发现问题或有问题模组的速度,因此如果你计划制作模组包或模组,建议启用此功能。 导航至游戏目录,然后依次进入BepInEx和config文件夹。在此处打开BepInEx.cfg文件,在[Logging.Console]部分下,将Enabled = false更改为Enabled = true,然后保存文件。下次启动游戏时,将出现一个控制台窗口,显示你(及其他开发者)代码中的所有Debug.Log和Console.WriteLine语句。 注意:有时Steam覆盖层会出现故障并挂钩到控制台。虽然不够美观,但此条件语句可让你清晰分离BepInEx代码与Unity代码,甚至可以为两者分别打开独立的Visual Studio实例。 3.5 添加资源这会导致其无响应且变得异常庞大,因此在进行模组开发时最好将其关闭。 2. 安装模组 每个模组的安装方式可能有所不同,但通常是将压缩文件(如zip/rar等)中的内容解压到游戏目录。请参考模组压缩文件中的README文件,其中应说明安装方法。 哪里可以找到模组?目前该游戏没有集中的模组数据库,因此我们有以下两个途径: Steam社区讨论区帖子。 Github搜索。 3. 创建你的模组 制作代码模组和资源模组需要进行一些设置,因此本节将详细介绍这两种模组的每一个步骤。 3.1 安装Unity引擎 若要制作代码和/或资源模组,我们需要安装与游戏相同版本的引擎。安装Unity Hub,它可以让我们安装、管理和卸载Unity编辑器版本,同时也能管理项目。安装并运行后,进入Unity存档网站,选择Unity 2021.X,找到2021.2.14版本并点击Unity Hub按钮。 此时应会打开Unity Hub的安装页面,我们可以保持所有设置不变,点击安装。安装过程可能需要一段时间,你可以在等待时玩游戏或处理其他工作。注意,安装Microsoft Visual Studio Community时,需要手动处理其弹出的对话框,因为Unity Hub无法处理这些对话框。完成所有操作后,我们就已满足创建模组的前提条件。 注意:游戏自带的内容是用不同版本的Unity引擎编译的,但它加载的是Unity Engine 2021.2.14f1版本。虽然可能可以使用其他引擎版本,但不建议这样做。 3.2 创建Unity项目 打开Unity Hub,导航至“项目”选项卡,该选项卡会列出所有已知项目。点击“新建项目”,然后在顶部选择合适的Unity编辑器版本。接着在下方的列表中找到“通用3D”,如果该选项缺失则进行下载。最后为项目命名,并将其保存在你能记住的位置,点击“创建项目”。Unity随后会打开你的项目。 项目打开后,你需要向项目中添加一个简单的包。在菜单栏中找到并点击【窗口】,然后点击【包管理器】。在新窗口中点击大型【+】符号,接着选择【从Git URL添加包】,并粘贴相关内容后点击【添加】。此包可处理一些常见事务,例如为你的模组构建资源包,你可以随时通过返回包管理器并点击【更新】来对其进行更新。 3.3 创建BepInEx插件 在你的Unity项目中,在【资源】目录下直接创建一个名为【Mods】的新文件夹,然后右键点击新创建的文件夹并选择【在资源管理器中显示】。这是放置资源模组和代码模组的目录,以防止与游戏或引擎内容发生冲突,我们将进一步按模组名称对其进行细分。在此处打开命令行窗口(按住Shift键并右键点击,选择PowerShell或命令提示符均可),然后输入dotnet new -i BepInEx.Templates --nuget-source https://nuget.bepinex.dev/v3/index.json。此命令会下载必要的模板,目前由于8.0版本存在bug,这些模板仅适用于DotNet SDK 7.0。你需要安装该版本并将其设为默认版本,后续步骤才能正常进行。 接下来,基于BepInEx 5模板创建代码模组,这只需输入另一条命令。在你打开的命令行窗口中,输入dotnet new bepinex5plugin -n NAME.MOD -T net46 -U 2021.2.14,将其中的NAME和MOD分别替换为你的名字和模组名称。这会创建必要的文件,但目前还未完全设置正确。注意:为避免与其他模组名称冲突,请在你的模组名称前加上你自己的名字或别名。例如,我会使用xaymar.examplemod。请注意,你的代码和资源模组名称需为小写。 3.4 修复模板 在继续之前,我们需要处理几个问题: 从Unity的Assets目录中删除生成的DotNet文件。如果不解决此问题,我们将无法正确创建模组,不过这个问题相对容易修复——尽管微软试图让它变得更复杂。我们只需对项目进行两处修改,首先修改我们生成的csproj文件,添加:<OutputPath>.. .. .. BepInEx plugins $(SolutionName)</OutputPath> <BaseIntermediateOutputPath>.. .. ..在<PropertyGroup>...</PropertyGroup>部分之间添加<BaseIntermediateOutputPath>obj</BaseIntermediateOutputPath>和<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>。这也能修复输出名称带有net46前缀的问题,我们不希望出现该前缀。 接下来要解决MSBuild(Visual Studio背后的构建系统)会忽略中间目录的问题。我们可以通过在与csproj文件相同的目录中创建一个名为Directory.Build.props的新文件来解决此问题,文件内容如下:<Project><PropertyGroup><OutputPath>.. .. .. BepInEx plugins $(SolutionName)</OutputPath><BaseIntermediateOutputPath>.. .. ..</BaseIntermediateOutputPath></PropertyGroup></Project>obj</BaseIntermediateOutputPath> </PropertyGroup> </Project>这将使MSBuild正确地将中间文件和生成文件放置在项目目录之外。请注意,文件必须命名为Directory.Build.props,而不是Directory.Build.props.txt——请开启显示已知文件扩展名。 在Unity编辑器中避免使用BepInEx Unity偏爱C#,会立即尝试编译代码,但之后会抱怨找不到某些内容——在这种情况下是BepInEx。由于我们不希望Unity考虑BepInEx的存在,需要用预处理器条件编译来包围任何BepInEx代码:#if !UNITY_EDITOR && !UNITY_STANDALONE // ... 你的代码放在这里 ...

添加资源的方式与制作自己的Unity游戏时类似:拖放或复制粘贴。唯一的区别是,对于每个想要包含的资源,我们需要明确设置资源包名称。名称可以是任意的,但最好与你的模组名称保持一致。你可以在每个支持资源包的属性检查器的右下角找到相关控制选项。 注意:某些资源类型无法包含在资源包中,例如代码和内置着色器。Unity会拒绝打包这两类资源,这也是为什么我们需要将两个“模组”组合起来作为一个完整模组的原因。 3.6 使用代码模组加载资源 由于Unity和BepInEx都不会自动加载资源包,因此我们需要在代码模组中添加一些代码。此代码应能自动检测到模组DLL文件旁的所有资源包,这样我们就无需手动添加每一个资源包。只需将以下12行C#代码添加到Plugin.cs文件中“// Plugin startup logic”行之后,即可轻松实现这一功能: // 资源包加载器开始 string whoAmI = System.Reflection.Assembly.GetExecutingAssembly().Location; string whereAmI = System.IO.Path.GetDirectoryName(whoAmI); if (string.IsNullOrEmpty(whereAmI)) { throw new System.IO.FileNotFoundException("无法找到自身位置。"); } // - 加载当前目录下的所有资源包 foreach (var file in System.IO.Directory.EnumerateFiles(whereAmI, "*.assetbundle")) { Logger.LogInfo($"正在加载资源包 '{file}'..."); AssetBundle.从文件加载(file);// 这样没问题,Unity会对它们进行跟踪。 } // 资源包加载器结束。

此代码首先会尝试定位自身位置,如果定位失败则会抛出错误并中止后续代码加载。随后,它会遍历所有以.assetbundle结尾的文件,同步加载这些文件,使其在游戏中可用。该文件中的所有资源现在都可被我们的代码使用,其他模组只要将你的模组设为依赖项并加载,也能使用你的资源。 4. 构建你的模组 得益于我们之前完成的所有工作,此步骤极为简单,仅包含两项任务。在Unity编辑器中,打开守护者打包工具(菜单栏 -> Guardian -> Bundler)并点击导出。然后打开BepInEx插件的csproj文件,将其构建为调试版或发布版。若要发布,建议选择后者;若在测试,则选择前者。最终你的项目的Assets目录旁会生成一个BepInEx目录。 4.1 测试你的模组 如果正确完成了步骤1,现在只需将Unity项目目录中的BepInEx目录复制到游戏目录,并在出现提示时替换所有文件。然后启动游戏,你的模组就应该会加载。遗憾的是,你可能无法直接调试模组,因此最好在调试版本中使用大量打印语句进行调试! 4.2 发布你的模组 由于目前尚无模组管理器或模组商店,本节内容尚未完善。