BepInex Plugin开发教程 03 一个最基础的插件

一、准备工作

在开始本篇教程之前,我先贴一个链接,这是BepInex官方的开发手册 https://bepinex.github.io/bepinex_docs/v5.0/articles/dev_guide/index.html

有什么问题也可以翻阅官方的手册,也许会有启发。

我们打开VS,新建一个.Net Framework类库项目,Framework版本根据游戏使用的版本决定,打开游戏的Data/Managed文件夹,看看System开头的几个文件,都是使用的什么版本。

比如这里的AI少女,使用的是4.6,还有不少游戏使用3.5之类的,不过一般情况下,我们都选择4以上的版本。

AI少女在家不方便玩,我们以装机模拟器为例子,新建一个Framework4.5的项目。

接下来我们添加一下常用的引用,我们一般会根据情况选择使用哪些dll,首先BepInex/Core文件夹下的BepInex.dll和0Harmony.dll是很常用的dll,我们选择上。在Data/Managed文件夹内有很多游戏使用到的dll,我举几个常用的。

  • Assembly-CSharp.dll 绝大多数的Unity游戏,逻辑都是放在这里的,所以想调用或者修改游戏内的东西,这个要添加引用
  • Assembly-CSharp-firstpass.dll 少数游戏会把逻辑放在这里,比如装机模拟器
  • UnityEngine.dll Unity2017之后,各种功能都被分散成很多dll,各种dll负责转发引用,所以这个dll我们每次都加上
  • UnityEngine.CoreModule.dll 引擎的核心dll
  • UnityEngine.IMGUIModule.dll OnGUI所使用的dll,也就是通常情况下,我们插件的界面所使用的界面库

其他的dll。我们以后使用到再说,今天只是写一个最最基本的插件

小技巧: 全选所有引用,把 复制本地 属性改为否,如果我们不这样选择的话,回头编译的时候,就会把引用到的相关dll也一起复制到输出目录,可能会有一大堆文件,所以这样比较简洁。

二、开始编写

我们给类修改一个自己想要的名字,然后将BepInex的命名空间using一下。

在BepInex中,给我们准备了一个类,BaseUnityPlugin,这是继承于MonoBehaviour的,也就是说,我们的插件,最终会以组件的形式挂载,实际上也是这样,每个插件最终都会挂载到游戏中BepInex的物体身上。所以我们可以使用MonoBehaviour的各种生命周期,比如Awake,Start,Update等等,这些我们以后再说,先来看一下最基础的插件的样子。

 

我们将MyFirstPlugin类继承BaseUnityPlugin,然后给类添加一个BepInexPlugin特性,这个特性有3个参数,分别是插件的Id,插件显示的名称,还有插件的版本。

插件的id推荐使用自己的域名反写加插件名称,没有域名其实也没关系,只要保证插件的id不和其他插件重复就行。

这样。我们第一个插件就完成了,在顶部工具栏选择生成->生成 MyFirstPlugin,等生成完毕后,打开输出的目录,将生成的MyFirstPlugin.dll复制到我们d BepInex/plugins目录下。

运行游戏,通过控制台我们可以看到我们的插件已经成功加载了,虽然它现在什么功能都没有。

三、其他事项

插件的特性除了BepInexPlugin之外,还有两个可能会用到的特性。

第一个是BepInProcess特性,有的时候,我们的插件是专门为一个游戏开发的,在其他的游戏并不适用,那么,只需要用这个特性,就可以限制插件在哪些游戏上可以运行。
例如


[BepInPlugin("me.xiaoye97.plugins.MyFirstPlugin", "MyFirstPlugin", "1.0")]
[BepInProcess("PCBS.exe")]
public class MyFirstPlugin : BaseUnityPlugin
{

}

这样,就是限定只在装机模拟器运行,如果想限制在几个游戏中可以运行,就继续添加这样特性即可。

第二个是BepInDependency特性,如果我们的插件,需要以其他的什么插件为前置插件,那么就需要使用这个特性添加依赖,以保证只有在有前置插件的情况下加载我们的插件。

BepInDependency特性有3种写法,分别是


[BepInPlugin("me.xiaoye97.plugins.MyFirstPlugin", "MyFirstPlugin", "1.0")]
// 软依赖,如果没有前置插件,依旧继续加载
[BepInDependency("com.bepinex.plugin.somedependency", BepInDependency.DependencyFlags.SoftDependency)]
// 硬依赖,如果没有前置插件,则停止加载
[BepInDependency("com.bepinex.plugin.importantdependency", BepInDependency.DependencyFlags.HardDependency)]
// 省略参数,则默认为硬依赖
[BepInDependency("com.bepinex.plugin.anotherimportantone")]
public class MyFirstPlugin : BaseUnityPlugin
{

}

除了这些特性之外,还有一点我们需要注意的是,一个dll中可以包括多个插件,只要我们写多个继承BaseUnityPlugin的类,并未他们赋予BepInPlugin特性即可。

发表评论

电子邮件地址不会被公开。必填项已用 * 标注