Skip to content

创建插件,实现“Hello, world”的输出

创建插件

通过前面几章的熟悉,现在可以开始创建我们的BepInEx插件了。

新建项目 打开Visual Studio,新建项目,选择“C# NET Framework 类库”

接着继续创建项目,.NET框架暂时没有什么特别的要求,别太低就行了

引入游戏类库 将我们之前拿出来的几个dll库引用进来

接下来,将刚刚引用进来的库全选,然后将“复制到本地”改为“false”

顺便将默认的“Class1.cs”改名成我们自己的名称。

定义插件

我们需要从 BaseUnityPlugin 继承类,并将BepInPlugin添加到该类

csharp
using System;
using BepInEx;
using UnityEngine;

namespace MyFirstBepInExMod
{
    [BepInPlugin("aoe.top.plugins.MyFirstBepInExMod", "这是我的第一个BepIn插件", "1.0.0.0")]
    public class MyFirstBepInExMod : BaseUnityPlugin
    {

    }
}

至此,我们就已经完成一个插件的基本结构了,现在来解释一下

csharp
public BepInPlugin(string GUID, string Name, string Version);

string GUID:插件的唯一ID标识符,绝对且是唯一的,不能存在重复,大家在命名的时候尽量避免重复的现象,请用自己专属的唯一标识符来命名;
string Name:插件名称,可以使用中文,
string Version:插件版本,必须使用系统可解析的格式,如“1.0.0”、“0.2.1”、“2.6.0”之类的

启动函数

BepInEx中有4个函数比较常用的函数,大家可以简单记一下:

Awake():在插件启动时会直接调用Awake()方法;
Start():在所有插件全部执行完成后会调用Start()方法,执行顺序在Awake()后面;
Update():插件启动后会一直循环执行Update()方法,可用于监听事件或判断键盘按键,执行顺序在Start()后面;
OnDestroy():在插件关闭时会调用OnDestroy()方法,可处理前面提到的“ScriptEngine”插件重启时需要做的操作。

测试和编译插件

了解了上面这些后,现在,我们开始写代码

csharp
// 在插件启动时会直接调用Awake()方法
void Awake()
{
    // 使用Debug.Log()方法来将文本输出到控制台
    Debug.Log("Hello, world!");

}

// 在所有插件全部启动完成后会调用Start()方法,执行顺序在Awake()后面;
void Start()
{
    Debug.Log("这里是Start()方法中的内容!");
}

// 插件启动后会一直循环执行Update()方法,可用于监听事件或判断键盘按键,执行顺序在Start()后面
void Update()
{
    var key = new BepInEx.Configuration.KeyboardShortcut(KeyCode.F9);

    if (key.IsDown())
    {
        Debug.Log("这里是Updatet()方法中的内容,你看到这条消息是因为你按下了F9");
    }
}
// 在插件关闭时会调用OnDestroy()方法
void OnDestroy()
{
    Debug.Log("当你看到这条消息时,就表示我已经被关闭一次了!");
}

确认没有报错后,在VS中按F6,编译我们的插件,然后打开“MyFirstBepInExMod\bin\Debug”就可以看到我们刚刚编译好的插件了,
将插件复制到“\BepInEx\scripts”中,运行游戏,

注意:我这里是默认你安装了“ScriptEngine”,如果没有,则是放入“BepInEx\plugins”文件夹,如需安装,可以参考上一章的“开发环境的搭建与调试以及有用的工具们”

在游戏中按F6,载入“\BepInEx\scripts”文件夹中的脚本,就可以看到我们的内容了

完整代码

csharp
using System;
using BepInEx;
using UnityEngine;

namespace MyFirstBepInExMod
{
    [BepInPlugin("aoe.top.plugins.MyFirstBepInExMod", "这是我的第一个BepIn插件", "1.0.0.0")]
    public class MyFirstBepInExMod : BaseUnityPlugin
    {
        // 在插件启动时会直接调用Awake()方法
        void Awake()
        {
            // 使用Debug.Log()方法来将文本输出到控制台
            Debug.Log("Hello, world!");

        }

        // 在所有插件全部启动完成后会调用Start()方法,执行顺序在Awake()后面;
        void Start()
        {
            Debug.Log("这里是Start()方法中的内容!");
        }

        // 插件启动后会一直循环执行Update()方法,可用于监听事件或判断键盘按键,执行顺序在Start()后面
        void Update()
        {
            var key = new BepInEx.Configuration.KeyboardShortcut(KeyCode.F9);

            if (key.IsDown())
            {
                Debug.Log("这里是Updatet()方法中的内容,你看到这条消息是因为你按下了F9");
            }
        }
        // 在插件关闭时会调用OnDestroy()方法
        void OnDestroy()
        {
            Debug.Log("当你看到这条消息时,就表示我已经被关闭一次了!");
        }
    }
}