3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 侠客前传 | 刺客信条 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 15752|回复: 39
打印 上一主题 下一主题

[讨论] Unity引擎类游戏MOD制作通用教程,一个非游戏软件行业的软件系统架构师的经验谈,跟水友们分享经验,2019年春节前的献礼!!!

  [复制链接]

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

跳转到指定楼层
主题
发表于 2019-2-2 23:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liyun_1981 于 2019-2-3 16:08 编辑

前言:


    如题,本人是一个非游戏软件行业的软件开发人员,基于个人对计算机游戏的强烈兴趣,在空闲时间时常会研究下当前各种主流的游戏引擎,以便于使得制作游戏MOD成为可能!在春节前夕,打算整一个Unity引擎类游戏MOD的通用教程,分享给各位水友!


正题:


    本教程计划分为五个部分分别讲述,从第二楼起,每楼阐述一个部分。


第一部分:MOD制作前必备的工具软件;


第二部分:DLL文件的反编译与重编译;


第三部分:IL文件的修改;


第四部分:IL汇编语言相关;


第五部分:对MOD制作的一些展望。


最后,水友们觉得写得不错的都给俺评个分点个赞,谢谢!!!





评分

3

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏18
回复

使用道具 举报

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

来自 19#
 楼主| 发表于 2019-4-12 17:42 | 只看该作者
午茶心情 发表于 2019-4-12 17:38
大佬请问一下,使用40级上限那个补丁之后,新建角色和角色升级的时候,种族的名字和天赋的名字都不显示了, ...

在“游戏设置”界面把字体调到最小就行,这个是游戏的UI的框框不能自动跟随字体动态调整的问题。
回复 支持 1 反对 0

使用道具 举报

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

来自 22#
 楼主| 发表于 2019-4-15 22:35 | 只看该作者
午茶心情 发表于 2019-4-15 21:40
大佬游戏更新到1.3.2,40级上限那个mod是不是不能用了

是的,游戏每次更新都必须同步更新这个补丁。
回复 支持 反对

使用道具 举报

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

舒服的沙发
 楼主| 发表于 2019-2-2 23:02 | 只看该作者
第一部分:MOD制作前必备的工具软件


1、Visual Studio 2017(C++、C#语言类开发IDE);
2、dotPeek(个人认为该软件是最好的.NET框架反编译工具,网址:https://www.jetbrains.com/decompiler/?fromMenu);
3、UtralEdit或者EditPlus(二者选其一即可,个人认为这两个文本编辑软件是最好的)。


对上述工具的作用简要说明下:


    dotPeek主要用来将游戏目录下的XXXX_Data\Managed目录下的游戏业务逻辑类库文件Assembly-CSharp.dll反编译成VS2017的.NET项目Visual Studio 2017主要用来查看将Assembly-CSharp.dll反编译后得到的源代码,有助于理解游戏的业务逻辑;UtralEdit或者EditPlus主要用来修改将Assembly-CSharp.dll反编译后得到的Assembly-CSharp.il文件。


回复 支持 2 反对 0

使用道具 举报

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

硬硬的板凳
 楼主| 发表于 2019-2-2 23:02 | 只看该作者
本帖最后由 liyun_1981 于 2019-5-31 11:38 编辑

第二部分:DLL文件的反编译与重编译


1、打开dotPeek后,先打开文件Assembly-CSharp.dll再导出VS项目,如下图:

导出成功后即可到导出目录双击*.sln文件打开VS2017查看源代码了;

2、在任意硬盘分区新建3个目录,例如:E:\Decompile,E:\Decompile\DLL,E:\Decompile\DLL-ildasm,将文件Assembly-CSharp.dll复制到E:\Decompile\DLL目录


3、打开“VS 2017的开发人员命令提示符 ”,输入命令:
cd /d "E:\Decompile\DLL"
ildasm Assembly-CSharp.dll /output:..\DLL-ildasm\Assembly-CSharp.il
此时在E:\Decompile\DLL-ildasm目录会生成Assembly-CSharp.res和Assembly-CSharp.il两个文件,我们只关心文件Assembly-CSharp.il,该文件就是反编译文件Assembly-CSharp.dll后得到的il中间语言文件,后续的MOD制作都是基于该文件的;


4、使用UtralEdit或者EditPlus修改完文件Assembly-CSharp.il后,再输入命令:

cd /d "E:\Decompile\DLL-ildasm"

ilasm /dll /resource:Assembly-CSharp.res Assembly-CSharp.il /output:Assembly-CSharp.dll
此时在E:\Decompile\DLL-ildasm目录会生成文件Assembly-CSharp.dll,该文件就是重编译文件Assembly-CSharp.il后得到的新的类库文件;

5、将步骤4得到的新类库文件Assembly-CSharp.dll复制到游戏目录下的XXXX_Data\Managed目录即完成了MOD制作,此时可以运行游戏查看效果了。







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

冰凉的地板
 楼主| 发表于 2019-2-2 23:02 | 只看该作者
本帖最后由 liyun_1981 于 2019-2-22 16:39 编辑

第三部分:IL文件的修改


    这部分内容是MOD制作的核心,对观看的水友有一定的要求,需要能读懂C#语言和IL汇编语言;考虑到不懂这两种语言的水友,我尽可能简明的举例说明下怎么修改。


下面我以角色负重值修改(100倍负重)为例具体说明下操作过程:


1、双击*.sln文件打开VS2017,在左侧的解决方案资源管理器窗口定位到C#源文件
EncumbranceHelper.cs并双击图标,此时在右侧源代码编辑窗口搜索GetHeavy定位到获得角色负重值上限的方法,记住最后一行return语句表示的代码含义,如下图:



2、使用UtralEdit或者EditPlus打开文件Assembly-CSharp.il,搜索关键字// end of method EncumbranceHelper::GetHeavy定位到GetHeavy方法结尾处,往上回溯查看GetHeavy方法的IL代码,将标签IL_007a到标签IL_007f包含的内容替换为以下5行IL代码:<
如下图:



3、保存文件Assembly-CSharp.il,并按照第二部分的操作重编译为文件Assembly-CSharp.dll,至此角色负重值修改(100倍负重)已全部完成;


4、使用dotPeek打开重编译后的文件Assembly-CSharp.dll,并双击打开EncumbranceHelper类的源代码文件EncumbranceHelper.cs,搜索GetHeavy定位到方法,可以看到该方法最后的return语句已经变成了
return (int) Math.Round(Math.Truncate(100.0 * a / num + 0.5) * num) * 100;,说明方才已经正确的将角色负重上限修改为100倍了,如下图:



下面为方便水友们自己修改,提供我自制的《开拓者:拥王者》40级上限修改补丁的所有修改的相关IL代码片段如下:<

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

5#
 楼主| 发表于 2019-2-2 23:02 | 只看该作者
本帖最后由 liyun_1981 于 2019-2-8 18:08 编辑

第四部分:IL语言相关


IL汇编语言是什么?简单来说,IL是微软.NET平台上衍生出的一门中间语言,.NET平台上的各种高级语言(如C#VBF#)的编译器会将各自的代码转化为IL;详细介绍推荐给有C#编程基础的水友看下这两篇文章:https://blog.csdn.net/dodream/article/details/4726421http://www.cnblogs.com/xiaoxiang ... /08/08/2130768.html


    本人为了修改IL文件时能方便的查询IL指令,自制了一个IL语言帮助命令,可查询和配置管理IL指令和IL语句的帮助信息;该命令使用说明:
1、解压缩game.7z(有需要的水友请到我这个帖子下载:http://bbs.3dmgame.com/thread-5745545-1-1.html)到任意目录,例如:D:\tools
2、运行命令提示符,输入cd /d d:\tools\game\bin,再输入 il -h 会显示详细的命令行参数帮助信息:
参数说明:

il [-i|-s] [name]

-i      只显示IL指令的帮助信息。

-s      只显示IL语句的帮助信息。

name    IL指令或语句的名称。

单条命令:

il

il -i

il -s

il -i name

il -s name

示例:

il
显示所有IL指令和IL语句的帮助信息。

il -i
显示所有IL指令的帮助信息。

il -s
显示所有IL语句的帮助信息。

il -i ldc.i4
显示IL指令名称为ldc.i4的帮助信息。

il -s instance
显示IL语句名称为instance的帮助信息。

3、第1次运行il命令后,程序会在game\bin目录生成配置文件il.xml,该文件格式如下:
<IL>

    <Instructions>
        <Helper>
            <name>add</name>
            <desc>将两个值相加并将结果推送到计算堆栈上。</desc>
            <example>
            // V_0 += 1
            IL_0001:  ldloc.0
            IL_0002:  ldc.i4.1
            IL_0003:  add
            IL_0004:  stloc.0
            </example>
        </Helper>

    </Instructions>

    <Statements>
        <Helper>
            <name>class</name>
            <desc></desc>
            <example></example>
        </Helper>

    </Statements>
</IL>


其中,Instructions表示IL指令的帮助信息,Statements表示IL语句的帮助信息;每个Helper节点表示一个帮助信息对象,Helper节点包含3个子节点;name表示IL指令或IL语句名称,desc表示IL指令或IL语句的具体描述,example表示IL指令或IL语句的示例代码;直接输入il可以显示所有IL指令和IL语句的帮助信息;该配置文件水友们可以修改或新增内容以丰富IL指令和IL语句的帮助信息。



回复 支持 反对

使用道具 举报

42

主题

1988

帖子

2万

积分

3DM Mod 原创组

Rank: 12Rank: 12Rank: 12

贡献度
977
金元
183126
积分
22281
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

6#
 楼主| 发表于 2019-2-2 23:02 | 只看该作者
本帖最后由 liyun_1981 于 2019-2-22 16:43 编辑

第五部分:对MOD制作的一些展望


    根据本人对Unity引擎和IL语言的研究心得,目前觉得将来实现以下两个工具提高MOD制作效率是有可能的:


1、使用C#整一个Unity引擎类游戏通用的控制台插件dll,可以在任何Unity引擎类游戏中打开控制台,这样就可以正确的调用所有针对具体的游戏实现了的控制台命令;


2、使用Java扩展下file命令,使其能根据指定的IL替换代码片段自动替换文件Assembly-CSharp.il。




最后,提前祝水友们猪年发大财!


2019年2月22日已实现了第二个展望:使用Java扩展下file命令,使其能根据指定的IL替换代码片段自动替换文件Assembly-CSharp.il,感兴趣的水友请见我今天发的帖子:自制IL汇编语言源文件内容自动替换工具,继年前的帖子“Unity引擎类游戏MOD制作通用教程。。。”后新年第一弹!!!
回复 支持 反对

使用道具 举报

13

主题

434

帖子

592

积分

高级玩家

Rank: 4

贡献度
11
金元
5476
积分
592
精华
0
注册时间
2008-5-30
7#
发表于 2019-2-8 22:37 | 只看该作者
强力支持~希望好MOD越来越多。
回复 支持 反对

使用道具 举报

0

主题

455

帖子

385

积分

高级玩家

Rank: 4

贡献度
0
金元
3854
积分
385
精华
0
注册时间
2012-1-17
8#
发表于 2019-2-10 21:51 | 只看该作者
楼主对游戏是真爱
回复 支持 反对

使用道具 举报

1

主题

979

帖子

916

积分

超级玩家

Rank: 5Rank: 5

贡献度
2
金元
9075
积分
916
精华
0
注册时间
2009-10-4
9#
发表于 2019-2-13 12:19 | 只看该作者
楼主牛逼
回复 支持 反对

使用道具 举报

0

主题

958

帖子

794

积分

超级玩家

Rank: 5Rank: 5

贡献度
9
金元
7576
积分
794
精华
0
注册时间
2008-11-4
10#
发表于 2019-2-15 17:05 | 只看该作者
感谢分享!~
回复 支持 反对

使用道具 举报

3

主题

232

帖子

263

积分

高级玩家

Rank: 4

贡献度
1
金元
2591
积分
263
精华
0
注册时间
2010-9-4
11#
发表于 2019-3-9 02:12 | 只看该作者
66666666666666666666666666666
回复 支持 反对

使用道具 举报

3

主题

232

帖子

263

积分

高级玩家

Rank: 4

贡献度
1
金元
2591
积分
263
精华
0
注册时间
2010-9-4
12#
发表于 2019-3-9 02:21 | 只看该作者
66666666666666666666666666666
回复 支持 反对

使用道具 举报

3

主题

232

帖子

263

积分

高级玩家

Rank: 4

贡献度
1
金元
2591
积分
263
精华
0
注册时间
2010-9-4
13#
发表于 2019-3-10 01:41 | 只看该作者
liyun_1981 发表于 2019-2-2 23:02
第二部分:DLL文件的反编译与重编译

第二部分第4条第二个ildasm少了个d
回复 支持 反对

使用道具 举报

3

主题

232

帖子

263

积分

高级玩家

Rank: 4

贡献度
1
金元
2591
积分
263
精华
0
注册时间
2010-9-4
14#
发表于 2019-3-13 01:51 | 只看该作者
liyun_1981 发表于 2019-2-2 23:02
第三部分:IL文件的修改

大神,我很好奇你是怎么得知需要修改的目标代码的查询关键字的?望指点
回复 支持 反对

使用道具 举报

0

主题

245

帖子

491

积分

高级玩家

Rank: 4

贡献度
0
金元
4905
积分
491
精华
0
注册时间
2014-4-2
15#
发表于 2019-4-9 19:26 | 只看该作者
bin4633 发表于 2019-3-13 01:51
大神,我很好奇你是怎么得知需要修改的目标代码的查询关键字的?望指点
...

这种时候一般都是根据方法名类名去猜测的,在看看代码的具体逻辑,得出结论并不难,难的是汇编看着太费劲了
回复 支持 反对

使用道具 举报

0

主题

245

帖子

491

积分

高级玩家

Rank: 4

贡献度
0
金元
4905
积分
491
精华
0
注册时间
2014-4-2
16#
发表于 2019-4-11 23:40 | 只看该作者
大佬打包成dll时候错了ilasm /dll /resource:Assembly-CSharp.res Assembly-CSharp.il /output:Assembly-CSharp.dll 这一步报错了,fail to write output file, error code=0x80070005
回复 支持 反对

使用道具 举报

0

主题

245

帖子

491

积分

高级玩家

Rank: 4

贡献度
0
金元
4905
积分
491
精华
0
注册时间
2014-4-2
17#
发表于 2019-4-12 00:44 | 只看该作者
楼主你不仅把移动速度改成1.5了吧,整个游戏时间被你加快了1.5倍
回复 支持 反对

使用道具 举报

1

主题

127

帖子

237

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2366
积分
237
精华
0
注册时间
2013-9-15
18#
发表于 2019-4-12 17:38 | 只看该作者
大佬请问一下,使用40级上限那个补丁之后,新建角色和角色升级的时候,种族的名字和天赋的名字都不显示了,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

1

主题

127

帖子

237

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2366
积分
237
精华
0
注册时间
2013-9-15
20#
发表于 2019-4-12 17:48 | 只看该作者
liyun_1981 发表于 2019-4-12 17:42
在“游戏设置”界面把字体调到最小就行,这个是游戏的UI的框框不能自动跟随字体动态调整的问题。
...

谢大佬,去试一试
回复 支持 反对

使用道具 举报

1

主题

127

帖子

237

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2366
积分
237
精华
0
注册时间
2013-9-15
21#
发表于 2019-4-15 21:40 | 只看该作者
大佬游戏更新到1.3.2,40级上限那个mod是不是不能用了
回复 支持 反对

使用道具 举报

1

主题

127

帖子

237

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2366
积分
237
精华
0
注册时间
2013-9-15
23#
发表于 2019-4-16 17:38 | 只看该作者
那就等大佬更新mod了
回复 支持 反对

使用道具 举报

5

主题

735

帖子

746

积分

超级玩家

Rank: 5Rank: 5

贡献度
3
金元
7338
积分
746
精华
0
注册时间
2014-7-15
24#
发表于 2019-5-12 17:01 | 只看该作者
楼主牛逼!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

14

主题

1468

帖子

1599

积分

游戏狂人

Rank: 6Rank: 6

贡献度
14
金元
15426
积分
1599
精华
0
注册时间
2010-11-26
25#
发表于 2019-6-15 00:24 | 只看该作者
厉害!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

1

主题

140

帖子

200

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2002
积分
200
精华
0
注册时间
2015-3-16
26#
发表于 2019-6-22 07:34 | 只看该作者
谢大佬。。不过升两级拿属性的代码被改了。。还是那里是要加一行啊
回复 支持 反对

使用道具 举报

1

主题

610

帖子

642

积分

超级玩家

Rank: 5Rank: 5

贡献度
8
金元
6104
积分
642
精华
0
注册时间
2009-7-23

G胖の微笑

27#
发表于 2019-6-24 18:03 | 只看该作者
大佬牛逼啊,必须支持
回复 支持 反对

使用道具 举报

51

主题

2991

帖子

2958

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
117
金元
20903
积分
2958
精华
0
注册时间
2009-10-16
28#
发表于 2019-6-28 20:55 | 只看该作者
liyun_1981 发表于 2019-2-2 23:02
第三部分:IL文件的修改

LZ求问魔战士的法术战斗(SpellCombat)怎么改成神术/双手/双持武器可用?
回复 支持 反对

使用道具 举报

4

主题

604

帖子

596

积分

高级玩家

Rank: 4

贡献度
12
金元
5484
积分
596
精华
0
注册时间
2009-8-18
29#
发表于 2019-7-18 14:31 | 只看该作者
借地问一下,40级mod里秘术师10级之后不提升神术施法者等级了啊
回复 支持 反对

使用道具 举报

0

主题

909

帖子

1045

积分

游戏狂人

Rank: 6Rank: 6

贡献度
3
金元
10331
积分
1045
精华
0
注册时间
2006-4-19
30#
发表于 2019-8-18 23:29 | 只看该作者
真干货,感谢楼主分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|咖绿茵|求知网|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2024-4-25 12:21 , Processed in 0.149350 second(s), 48 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表