搬运自OpenMod官网,经过翻译,可能有些不足,欢迎指正!原文链接
制作你的第一个插件
在本教程中,我们将介绍:
建立开发环境。
创建一个插件项目。
写一个基本的插件。
安装 .NET 5 SDK
点这里安装最新的 .NET 5 SDK(你应该下载到一个dotnet-sdk-xxxxx.exe文件)。
安装 IDE
在配置好.NET 5 SDK后,你需要一个集成开发环境(IDE),IDE提供了编写插件的环境和工具。
Visual Studio Code(推荐)
你可以使用Visual Studio Code来开发OpenMod插件。它支持Linux、macOS和Windows。Visual Studio Code是中小型项目的优秀解决方案。
Visual Studio
如果你想要完整的IDE体验,请下载并安装Visual Studio Community。Visual Studio仅支持Windows平台。安装程序启动时,选择“Visual Studio 2019 Community Edition”(或更新版本,如果可用)。然后选择“.NET Core cross-platform development“和”.NET Desktop Development“选项,如下图所示。
Rider
如果你使用的是Linux并且不想使用Visual Studio Code,那么可以安装Rider。虽然它是一种商业产品,但在申请Jetbrains学生许可证时可以免费获得。与Visual Studio一样,它提供了完整的IDE体验,并具有类似的功能。
生成插件项目
启动cmd或Powershell并定位到要在其中创建插件项目的文件夹。
例如
mkdir C:\Users\<Username>\source\repos\MyPlugin\
cd C:\Users\<Username>\source\repos\MyPlugin\
之后,安装用于.NET Core SDK的OpenMod插件模板:
dotnet new -i “OpenMod.Templates::*”
最后,你可以使用以下命令生成插件项目:
dotnet new openmod-universal-plugin –PluginId <PluginId> [–FullPluginName <FullPluginName>]
或者,如果你想为Unturned开发一个插件:
dotnet new openmod-unturned-plugin –PluginId <PluginId> [–FullPluginName <FullPluginName>]
PluginId 必须是插件的唯一标识符。按照惯例,它与NuGet包ID相同。
FullPluginName 是可选的,它将设置如何向用户显示插件。
要获得该命令的完整帮助,可以使用–help开关,如下所示:
dotnet new openmod-universal-plugin —help
或者,用于Unturned的:
dotnet new openmod-unturned-plugin —help
示例:如果要创建Unturned的插件项目,可以使用以下命令:
dotnet new openmod-unturned-plugin –FullPluginName “My Unturned Plugin” –PluginId “MyName.MyUnturnedPlugin”
添加基本命令
现在你已经创建了你的插件,用你之前安装的IDE打开.csproj文件。
在本例中,我们创建一个echo命令。创建一个新类(如何创建取决于你的IDE)。按照惯例,命令类的前缀是“Command”,所以称之为CommandEcho。因为这将是一个在所有平台上工作的通用命令,所以我们将使它从 Command 继承。如果这个命令只用于Unturned,我们将从 UnturnedCommand 继承。
你的类应该是这样的:
public class CommandEcho : Command { }
让我们通过实现 ExecuteAsync() 方法和一个构造函数来修复这个错误。不要担心什么是Async。这个方法将执行您希望命令执行的操作。
现在,你需要知道如何访问游戏中的数据和方法。只需使用Context(这来自于使用Command抽象类),就可以访问没有参数的命令上下文。这将允许您访问Player,目前为止还很简单,让我们看看这个命令的成品。
[Command("echo")] [CommandDescription("Echo a message")] [CommandSyntax("<message>")] public class CommandEcho : Command { public CommandEcho(IServiceProvider serviceProvider) : base(serviceProvider) { } protected override async Task OnExecuteAsync() { // 这能得到用户想要回显的文本。 string text = string.Join(" ", Context.Parameters); await Context.Actor.PrintMessageAsync(text); } }
命令执行器正在调用OnExecuteAsync,并为你提供命令“context”。在类的顶部,你将看到我们正在使用属性设置命令元数据。
有关更多信息,请访问命令文档。
最佳范例
不要使用静态插件实例,而是始终通过引用传递实例。OpenMod动态创建和销毁插件实例,这将导致在重新加载后使用错误的实例。
下面是一个错误的例子:
public static MyPlugin Instance { get; set; } public class MyCommand : Command { public MyCommand(IServiceProvider serviceProvider) : base(serviceProvider) { } public async Task OnExecuteAsync() { MyPlugin.Instance.DoSomething(); } }
改用这个:
public class MyCommand : Command{ private readonly MyPlugin m_MyPlugin; public MyCommand( MyPlugin myPlugin, IServiceProvider serviceProvider) : base(serviceProvider) { m_MyPlugin = myPlugin; } public async Task OnExecuteAsync() { m_MyPlugin.DoSomething(); } }