• 中文
  • 注册
  • 技术交流 技术交流 关注:3 内容:13

    如何制作一个OpenMod插件

  • 查看作者
  • 打赏作者
  • 当前位置: 未转变者中文社区 > 技术交流 > 正文
    • 技术交流
    • 搬运自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插件

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

      请登录之后再进行评论

      登录
      极客之爱
      个人签名:收容失效Q群: 1037114248
      关注3 粉丝3 喜欢1内容14
      上海
    • 做任务
    • 实时动态
    • 签到中心
      小黑屋
    • 到底部