这一次的教程进行一个小小的功能实现,完整的制作一个插件。以Mirror这个游戏为例,插件的目标是当玩家按下空格时,有一定概率为玩家增加金钱,或者扣除玩家金钱。概率、增加的金钱、扣除的金钱都由配置文件决定。
使用dnSpy查找金钱
在之前的开发环境准备章节中,我们下载了dnSpy,这是一个非常好用的反编译工具,我们查看游戏的逻辑可以使用这个工具。在Unity游戏中,默认情况下,游戏的逻辑都会被编译到XXXGame_Data/Managed/Assembly-CSharp.dll这个dll里面,当然偶尔也会有特殊情况,比如装机模拟器,他的逻辑编译到了Assembly-CSharp-firstpass.dll。
Mirror的比较常规,逻辑在Assembly-CSharp.dll里,我们将这个dll拖入dnSpy。
可以看到,dnSpy列出了这个程序集下面的所有命名空间。在Unity中创建脚本时,默认是不带命名空间的,有些比较规范的工作室,会自己按照自己的规范添加命名空间,很多小工作室一般都直接按默认来。图中的-代表的就是没有命名空间的部分,我们打开他,可以看到Mirror的类都在里。
我们这次的目标是金钱,大多数情况下,游戏厂商都会使用通俗易懂的命名,比如money、coin、cash、gold等。我们点击小放大镜图标进行挨个搜索。在不同的游戏中,找到目标的难度也不太一样,大多数情况下,都需要多看多分析,这一部分只有多制作插件练手才能变的熟练。
经过搜索与排查,我确定了GameTool.roleData中存储了玩家的金钱,接下来,我们就可以进行插件的编写了。
编写插件
新建类库、添加引用这些在前面已经有讲,在此我们不用多说,需要注意的是,我们的需求里有一点是按下空格之后触发功能,我们需要引用一个UnityEngine.InputModule.dll,这是Unity中控制输入部分的类库。
首先我们创建配置文件并进行绑定。
using BepInEx;
using UnityEngine;
using BepInEx.Configuration;
namespace PluginTutorial
{
[BepInPlugin("me.xiaoye97.plugin.Tutorial", "Tutorial Plugin", "1.0")]
public class PluginTutorial : BaseUnityPlugin
{
ConfigEntry KeyConfig;
ConfigEntry AddMoneyConfig, SubMoneyConfig, WinRateConfig;
void Start()
{
KeyConfig = Config.Bind("config", "HotKey", KeyCode.Space, "插件热键");
AddMoneyConfig = Config.Bind("config", "AddMoney", 100, "每次增加的钱");
SubMoneyConfig = Config.Bind("config", "SubMoney", 50, "每次减少的钱");
WinRateConfig = Config.Bind("config", "WinRate", 20, "中奖概率 0-100");
}
}
}
对于目标需要的功能,我们使用一个随机数即可实现。
void Roll()
{
int roll = Random.Range(0, 100); //从0到100随机
if(roll < WinRateConfig.Value) //随机数小于中奖概率则说明中奖
{
GameTool.roleData.Money += AddMoneyConfig.Value; //增加金钱
Logger.LogInfo($"成功,增加{AddMoneyConfig.Value}金钱");
}
else
{
GameTool.roleData.Money -= SubMoneyConfig.Value; //减少金钱
Logger.LogInfo($"失败,减少{SubMoneyConfig.Value}金钱");
}
MainUI.instance.showMoney(); //刷新金钱显示
}
关于空格键的检测,我们写在Update生命周期中,由于Update生命周期每帧执行一次,所以不会漏掉我们按下空格的那一帧。
void Update()
{
if (Input.GetKeyDown(KeyConfig.Value))
{
Roll();
}
}
这样,我们的插件就编写完成了,编译插件并将插件放进BepInEx/plugins目录下,我们运行游戏进行测试。
总结
这次我们制作了一个非常基础的小插件,依照这个原理,可以制作一些功能性的插件,但是,大部分情况下,我们并不想要让玩家来通过按键盘上的某一个键来触发我们的功能。更多的时候,我们都希望我们的功能自动触发,比如,当玩家的金钱增加时,自动显示一个浮动的文本告诉玩家增加了多少钱,再比如,在Mirror的三消小游戏中,自动提醒4连,5连等。所以,之后的教程,我们会真正进入插件开发的重点内容,Harmony补丁。