BWIKI 全站将于 9 月 3 日(全天)进行维护,期间无法编辑任何页面或发布新的评论。
模组:制作指南/测试和疑难解答
← 模组:目录
此页面提供关于测试模组和解决常见问题的帮助。对于使用模组的帮助,另请参阅模组:使用指南/疑难解答。
测试模组
基本测试
对于大多数模组而言,测试是非常容易的:
- 点击 Build > Rebuild Solution (Visual Studio) 或 Build > Rebuild All (MonoDevelop)。
- 确保没有报错,然后把模组复制到您的Mods文件夹。
- 在游戏中测试模组。
- 确保SMAPI控制台中没有报错或警告。
一般而言,如果一个模组在某个平台上能够正常工作,则其在其他平台上也能正常工作。
多人游戏测试
通过运行两个游戏实例,您可以在同一台计算机上进行模组的多人游戏测试:
- 准备玩家一:
- 正常启动SMAPI。
- 在标题界面,点击“合作”,然后点击“主持”。
- 创建一个新存档(若已有存档则无需创建新存档)。确保“初始联机小屋”至少为 1 (若要测试更多玩家,则酌情增加)。
- 准备玩家二:
- 再次启动SMAPI(这会自动创建一个独立的日志文件)。
- 在标题界面,点击“合作”,然后点击“加入局域网游戏”。
- 将“输入 IP……”字段留空,然后点击OK。
全平台测试
对于复杂的模组,可能需要在全平台上进行测试。由于游戏的Linux和Mac版本几乎相同,所以只需要测试两个平台:一个为Windows,另一个为Linux或Mac。可以使用虚拟机来完成测试。
- 若您的计算机为Windows 10 或 11:
-
- 安装Windows Subsystem for Linux (WSL)。
- 在WSL中安装所需软件:
- 安装Steam。
- 运行
export TERM=xterm && steam
,然后通过Steam的UI安装星露谷物语。这也会安装相应的依赖。 - (可选)若您希望在Linux上编译代码,可下载并安装您偏好的IDE。下面是安装Rider最新版本的方法:
wget "<download url here>" -O rider-install.tar.gz sudo tar -xzvf rider-install.tar.gz -C /opt ln -s "/opt/JetBrains Rider-<version>/bin/rider.sh" ./rider.sh
- 安装SMAPI。
- 运行
steam
并通过其UI启动游戏。
- 若您的计算机为Windows 8或更早版本:
-
- 安装VirtualBox。
- 在VirtualBox中创建一个ZorinOS Core虚拟机。
- 在虚拟机中下载Steam安装程序并运行。
- 运行Steam以完成安装。若无反应,参见这些额外的步骤以修复它。
- 通过Steam安装星露谷物语。
- 安装SMAPI。
- (可选)在虚拟机中安装mono-complete和MonoDevelop。仅当您需要在Linux/Max环境中独立编译时需要安装这些软件。当安装.deb文件时,使用此处以Ubuntu为例的指南。若中间发生错误,您大概需要自己想办法解决。
- (可选)仅解锁Mac OS: Virtual Machine Unlocker 2.1.1 适用于 VmWare Workstation 11/12/14、 VmWare Player 7/12/14、 或 Fusion 7/8/10 。需要以此来在虚拟机上部署Mac OS。
- 若您的计算机为Linux或Mac OS:
-
- 安装VirtualBox。
- 创建一个Windows虚拟机。
- 在虚拟机上安装星露谷物语。
- 安装SMAPI。
- (可选)若您希望在Windows上独立编译,则需在虚拟机上安装Visual Studio Community。
修复常见的构建警告
构建项目后,可以通过 Visual Studio > View > Error List 或 MonoDevelop > View > Pads > Errors 查看构建警告(build warning)。下文列出了一些常见的警告:
This implicitly converts...
警告示例:"This implicitly converts '{0}' from Net{1} to {2}, but Net{1} has unintuitive implicit conversion rules. Consider comparing against the actual value instead to avoid bugs. See https://smapi.io/buildmsg/avoid-implicit-net-field-cast for details."
这是因为您的代码引用了Net字段,这可能会产生微妙的错误。此字段应当有等价的非Net属性,例如Net属性monster.health(NetBool)的等价属性为monster.Health(int)。请使用提示的等价属性替换您的Net字段。
FieldName is a Net* field...
警告示例:"'{0}' is a Net{1} field; consider using the {2} property instead. See https://smapi.io/buildmsg/avoid-net-field for details."
这是因为您的代码引用了Net字段,这可能会产生微妙的错误。您应当转而引用它的Value而非Net字段本身:
- 对于引用类型(可能为null),可以使用.Value属性(对于NetDictionary则为.FieldDict属性):
if (building.indoors.Value == null)
或在比较前转为相应的值:
GameLocation indoors = building.indoors.Value; if(indoors == null) // ...
- 对于值类型(即不能包含null的类型),应当在比较前检查其父对象是否为空(如有需要),并使用.Value属性:
if (item != null && item.category.Value == 0)
The FieldName field is obsolete...
警告示例:"The 'Character.friendships' field is obsolete and should be replaced with 'friendshipData'. See https://smapi.io/buildmsg/avoid-obsolete-field for details."
您正在使用过时的字段,后者不应当再被使用。请转而使用推荐的字段名称以修复此问题。
An instance of analyzer ... cannot be created
升级到最新版本的Visual Studio;;此警告意味着NuGet包使用了较新的功能,旧版不能支持。
Feature 'global using directive' is not available in C# 9.0
打开解决方案的项目文件(.csproj文件),并将<ImplicitUsings>属性从"enable"切换到"disable"。
其他问题
Can't target .NET 6
若目标框架列表包含如下选项:
- 以 .NET Framework 开头:您的项目类型是错误的。请确保您的模组项目的类型为 .NET 6(这个命名有些迷惑性)。
- 以 .NET Core、.NET Standard 或 .NET 6+ 开头:请使用 .NET 6 以保证兼容性。若列表中没有相应选项,可以安装.NET 6 SDK以添加。
Visual Studio can't find the game/SMAPI/MonoGame DLLs
一般解决方案:
- 重启Visual Studio。
- 确保游戏和SMAPI已正确安装且正常工作。
- 检查是否存在 "Failed to find game install path" 等错误。若出现此类错误,则需指定游戏路径。
- 确保您所创建的是 .NET 6 项目,而不是 .Net Framework。(参见如何设置目标框架;若您看到了以 .NET Framework 开头的选项,请删除此项目,并创建一个 .NET 6 项目。)
- 确保您的目标框架是 .NET 6(参见教程)。
若上述步骤不能修复此问题:
- 依次点击 Build > Rebuild Solution(Visual Studio)或 Build > Rebuild All(MonoDevelop)。
- 检查 Output 面板或错误列表(Visual Studio)或 Errors 面板(MonoDevelop)。
- 若您没有发现相关的内容,请将 Output 文本粘贴到hastebin,在Discord上寻求帮助并附上您的hastebin链接。
寻求帮助
参见模组:帮助以了解如何寻求帮助。