这一次的教程进行一个小小的功能实现,完整的制作一个插件。以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补丁。

Unity游戏Mod/插件制作教程05 - 插件实例2: 简单功能实现相关推荐

  1. Unity游戏Mod/插件制作教程03 - 插件实例1: HelloWorld

    准备工作 作为编程类的教程,果然第一个需要来一个传统项目--HelloWolrd. 在开始之前,我先贴一个链接,这是BepInex官方的开发手册 https://bepinex.github.io/b ...

  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. Android sendevent/getevent 用法
  2. 基于Arduino开发的智能蓝牙小车
  3. [JZOJ5836] Sequence
  4. 【Codeforces - 632C】The Smallest String Concatenation (对string巧妙排序)
  5. 搭载第四代自研神龙架构 阿里云发布RDMA增强型实例等多款新品
  6. springboot+openFeign+nacos开发实战
  7. Softmax回归模型的构建和实现(Fashion-MNIST图像分类)
  8. linux内核设计与实现 epub_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现四...
  9. Sublime Text 支持GBK , 解决中文乱码问题
  10. equal java用法_equal,和等号的用法..
  11. html让图片变灰色,firefox浏览器中css如何把图片变成灰色?
  12. 如何解决DNS解析错误
  13. 代码覆盖率、功能覆盖率分析
  14. Scrum立会报告+燃尽图(十月二十八日总第十九次)
  15. cdh3.6.2集成zeppelin0.10.1及简单使用
  16. 把话说清楚的万能公式
  17. 算法4:数列极差问题(贪心算法)
  18. Ubuntu18.04平台下C/C++编程环境搭建及OpenCV4.5.4安装
  19. 开源是什么意思,你能举例说明吗
  20. 精读《Rust 是 JS 基建的未来》

热门文章

  1. 计算机信息的容量单位是什么,信息的基本容量单位是
  2. SAP FIORI专题之四:使用fiori element构建over page
  3. php把unicode转化成中文实用方法
  4. 小白聊智慧制造之十三:工业APP是释放工业大数据价值的方式
  5. 分众传媒的数字化厮杀继续
  6. 【电信业务】【原则与规范】TMF的NGOSS
  7. 关于通达OA精灵的一点心得
  8. 显卡升级为啥总显示登录账号_科技让生活更美好:游戏画质更好,显卡资源消耗更少...
  9. Mac使用技巧之Finder的个人收藏
  10. 浪潮信息m5服务器,浪潮英信服务器NF8480M5