准备工作
作为编程类的教程,果然第一个需要来一个传统项目——HelloWolrd。

在开始之前,我先贴一个链接,这是BepInex官方的开发手册 https://bepinex.github.io/bepinex_docs/v5.0/articles/dev_guide/index.html 有什么问题也可以翻阅官方的手册,也许会有启发。

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

我们以【~在魔界当女仆~恶魔天使与勇者的秘密喫茶店】和【装机模拟器】这两款游戏为例,可以看到在前者中,版本为4.6,后者为3.5,大多数的情况下,我们会使用4以上的版本。

以【~在魔界当女仆~恶魔天使与勇者的秘密喫茶店】为例,我们新建一个.NetFramework 4.6的类库项目。

接下来我们添加一下常用的引用,我们一般会根据情况选择使用哪些dll,首先BepInex/Core文件夹下的BepInEx.dll和0Harmony20.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也一起复制到输出目录,可能会有一大堆文件,所以这样比较简洁。

开始编写插件
我们给默认的Class1修改一个我们想要的名字,我这里改为PluginTutorial,然后将BepInEx的命名空间using一下。

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

using System;
using BepInEx;

namespace PluginTutorial
{
    //插件描述特性 分别为 插件ID 插件名字 插件版本(必须为数字)
    [BepInPlugin("me.xiaoye97.plugin.Tutorial", "Tutorial Plugin", "1.0")]
    public class PluginTutorial : BaseUnityPlugin //继承BaseUnityPlugin
    {
        //Unity的Start生命周期
        void Start()
        {
            //输出日志
            Logger.LogInfo("HelloWorld!");
        }
    }
}
我们将PluginTutorial继承BaseUnityPlugin,并在类上方添加了一个叫做BepInPlugin的特性,这是必须要完成的,只有这样才能正确加载插件。

如果你不知道特性是什么,可以去补一下C#关于特性方面的知识。

在BepInPlugin特性中,我们填入了3个参数,分别是插件的ID,插件的名字,插件的版本号,对于ID,我个人习惯使用域名反写法,一般是me.xiaoye97.plugin.游戏名.插件名,插件的名字没有什么特别的要求,直观即可。在插件版本这里,必须是数字形式的版本号,不能夹杂字母等。

这样。我们第一个插件就完成了,在顶部工具栏选择生成->生成 PluginTutorial,等生成完毕后,打开输出的目录,将生成的PluginTutorial.dll复制到我们的 BepInEx/plugins目录下。
运行游戏,通过控制台我们可以看到我们的插件已经成功加载了,虽然它现在什么功能都没有。
其他事项
插件的特性除了BepInExPlugin之外,还有两个可能会用到的特性。

第一个是BepInProcess特性,大部分情况下,我们不需要写这个特性,但是偶尔会遇到特殊情况。比如,在I社游戏(例如AI少女、恋爱活动等)中,不仅有游戏本体,还有一个工作室程序,将游戏本体与内容创作进行了分割,这样,就会有两个exe,但是,他们是两个不同的exe,有很多地方是不能公用的。那么,只需要用这个特性,就可以限制插件在指定的exe上可以运行。
例如

[BepInPlugin("me.xiaoye97.plugin.Tutorial", "Tutorial Plugin", "1.0")]
[BepInProcess("Maid In Makai.exe")]
public class PluginTutorial : BaseUnityPlugin
{

}
这样,就是限定只在这个exe中运行,如果想限制在几个exe中可以运行,就继续添加这样特性即可。

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

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

[BepInPlugin("me.xiaoye97.plugin.Tutorial", "Tutorial Plugin", "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 PluginTutorial : BaseUnityPlugin
{

}

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

有什么问题或者建议可以在评论区评论或者与我私信交流。 作者:宵夜97 https://www.bilibili.com/read/cv8997577?spm_id_from=333.999.0.0 出处:bilibili

Unity游戏Mod/插件制作教程03 - 插件实例1: HelloWorld相关推荐

  1. Unity游戏Mod/插件制作教程05 - 插件实例2: 简单功能实现

    这一次的教程进行一个小小的功能实现,完整的制作一个插件.以Mirror这个游戏为例,插件的目标是当玩家按下空格时,有一定概率为玩家增加金钱,或者扣除玩家金钱.概率.增加的金钱.扣除的金钱都由配置文件决 ...

  2. WordPress插件制作教程概述

    接下来的一段时间里,开始为大家讲解WordPress插件制作系列教程,这篇主要是对WordPress插件的一些介绍和说明,还有一些我们需要注意的地方,以及需要掌握的知识. WordPress插件允许你 ...

  3. Unity游戏开发官方入门教程:飞机大战(六)——创建子弹

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  4. Unity游戏开发官方入门教程:飞机大战(二)——创建飞船对象

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  5. Unity游戏开发官方入门教程:飞机大战(五)——实现飞船控制脚本

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  6. Unity游戏开发官方入门教程:飞机大战(十)——敌人的爆炸和移动

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  7. Unity游戏Mod/插件制作教程01 - BepInEx的安装和使用

    前言 本章节为没有使用过BepInEx的同学进行BepInEx的安装和使用方面的介绍,如果你之前已经使用过并了解如何使用,可以直接跳过本章节. BepInEx下载 BepInEx的Github链接 h ...

  8. 我的世界服务器php插件制作教程,我的世界服务器制作教程 服务器怎么做

    来源: 网络 我的世界服务器制作教程 服务器怎么做 我的世界服务器建立并不难,只要运行服务器端软件就可以,但是如何能让一台服务器长期运行下去就是一件很有挑战性的事情了.这里给大家带来玩家开服遇到的问题 ...

  9. [手把手教]discuzX2插件制作教程__最菜鸟级别的入门坎 一

     绝世十二少 于 2011-10-17 10:49 编辑 终于也轮到我写教程指导后人了,在此感谢会员(sw08)的热心指导,同时也感谢曾经提供各种插件资料给我的论坛朋友们,是你们帮我跨过了插件的入门坎 ...

最新文章

  1. TensorRT部署深度学习模型
  2. centos7数据库mysql+mariadb
  3. 【freeCodeCamp】免费晋级前台工程师呦!!!!
  4. python 批量下载网址_python 遍历oss 实现批量下载
  5. python 均值滤波_Python的一个骚操作
  6. linux安装oracle出现os,linux下安装oracle
  7. ruby array_Array.select! Ruby中的示例方法
  8. 数据分析菜鸟怒怼面试官却被打脸,只会SQL也敢来面试?
  9. matlab实现线性规划
  10. 大学python教材电子版下载_Python数据分析基础(全国高等院校应用型创新规划教材·计算机系列)...
  11. 企业微信与视频号裂变如何做私域运营?
  12. 判断斗地主卡牌类型的思路
  13. python为什么是蛇的天敌_青蛙和蛇一直是天敌,只知道蛇会吃青蛙,你知不知道青蛙也吃蛇...
  14. CodeForces - 1312E Array Shrinking
  15. BOM:04-BOM有哪些形式?(按用途划分)
  16. 百度旋转验证码(8-24,js逆向)
  17. Java对接腾讯IM以及一些方法的简单封装
  18. 罗尔定理与零点定理判断实际应用与判断
  19. iview 表格合并行
  20. txt电子书如何用Mac打开?

热门文章

  1. Zynq-Linux移植学习笔记之49-国产ZYNQ适配国产裕太PHY网络调试
  2. python线程池使用和问题记录
  3. QT解决中文编译不通过问题
  4. 还在被R语言中的因子factor毒打吗
  5. 输出Python解释器路径
  6. Python识别验证码----谷歌reCapture 3*3验证码
  7. 正则表达式(电话号码 IP)
  8. 【网络工程师备考分享】怎么复习,去哪里找真题练习。
  9. Python爬取地铁线路及站点数据,文末附上爬取的各地区shp数据下载链接
  10. Ztree 节点不可选