• 中文
  • 注册
  • 技术交流 技术交流 关注:8 内容:20

    [OpenMod]如何制作一个OpenMod插件

  • 查看作者
  • 打赏作者
  • 当前位置: 未转变者中文社区 > 技术交流 > 正文
    大版主
    Lv.14

    搬运自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“选项,如下图所示。

    [OpenMod]如何制作一个OpenMod插件

    [OpenMod]如何制作一个OpenMod插件

    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();
         }
    }

    请登录之后再进行评论

    登录
  • 发布内容
  • 任务中心
  • 实时动态
  • 偏好设置
  • 帖子间隔 侧栏位置: