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

注册 登录

QQ登录

只需一步,快速开始

查看: 4152|回复: 30

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

[复制链接]

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
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

查看全部评分

回复

使用道具 举报

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

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

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

使用道具 举报

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

 楼主| 发表于 2019-4-15 22:35 | 显示全部楼层
午茶心情 发表于 2019-4-15 21:40
大佬游戏更新到1.3.2,40级上限那个mod是不是不能用了

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

使用道具 举报

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
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文件。


回复 支持 反对

使用道具 举报

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
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
回复 支持 反对

使用道具 举报

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
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代码:
  1.     IL_007a:  call       float64 [mscorlib]System.Math::Round(float64)
  2.     IL_007b:  conv.i4
  3.     IL_007c:  ldc.i4.s   100
  4.     IL_007d:  mul
  5.     IL_007f:  conv.i4
复制代码

如下图:



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代码片段如下:
  1. *开头的行表示需要替换,+开头的行表示需要新增,右边是查询需要被修改的IL代码片段的关键字


  2. 角色等级上限及经验值修改
  3. *  } // end of method LevelUpController::CanLevelUp
  4.     IL_0034:  ldloc.0
  5.     IL_0035:  ldc.i4.s   40
  6.     IL_0036:  blt        IL_0039
  7.     IL_0037:  ldc.i4.0
  8.     IL_0038:  ret

  9.     IL_0039:  ldloc.0
  10.     IL_003a:  ldc.i4.s   20
  11.     IL_003b:  bge        IL_004e
  12.     IL_003c:  call       class Kingmaker.Game Kingmaker.Game::get_Instance()
  13.     IL_003d:  callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
  14.     IL_003e:  ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
  15.     IL_003f:  ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
  16.     IL_0040:  ldloc.0
  17.     IL_0041:  ldc.i4.1
  18.     IL_0042:  add
  19.     IL_0043:  callvirt   instance int32 Kingmaker.Blueprints.Classes.BlueprintStatProgression::GetBonus(int32)
  20.     IL_0044:  ldc.i4.2
  21.     IL_0045:  div
  22.     IL_0046:  stloc.1
  23.     IL_0047:  ldloc.1
  24.     IL_0048:  ldarg.0
  25.     IL_0049:  ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
  26.     IL_004a:  callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_Experience()
  27.     IL_004b:  ble        IL_006e
  28.     IL_004c:  ldc.i4.0
  29.     IL_004d:  ret

  30.     IL_004e:  call       class Kingmaker.Game Kingmaker.Game::get_Instance()
  31.     IL_004f:  callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
  32.     IL_0050:  ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
  33.     IL_0051:  ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
  34.     IL_0052:  ldc.i4.s   20
  35.     IL_0053:  callvirt   instance int32 Kingmaker.Blueprints.Classes.BlueprintStatProgression::GetBonus(int32)
  36.     IL_0054:  ldc.i4.2
  37.     IL_0055:  div
  38.     IL_0056:  ldloc.0
  39.     IL_0057:  ldc.i4.s   19
  40.     IL_0058:  sub
  41.     IL_0059:  ldc.i4   90000
  42.     IL_005a:  mul
  43.     IL_005b:  add
  44.     IL_005c:  stloc.1
  45.     IL_005d:  ldloc.1
  46.     IL_005e:  ldarg.0
  47.     IL_005f:  ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
  48.     IL_0060:  callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_Experience()
  49.     IL_0061:  ble        IL_006e
  50.     IL_006c:  ldc.i4.0

  51. *  } // end of method UnitProgressionData::AddClassLevel
  52.     IL_0061:  ldloc.0
  53.     IL_0062:  ldloc.0
  54.     IL_0063:  ldlen
  55.     IL_0064:  conv.i4
  56.     IL_0065:  ldc.i4.1
  57.     IL_0066:  sub
  58.     IL_0067:  ldarg.0
  59.     IL_0068:  call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  60.     IL_0069:  call       int32 [mscorlib]System.Math::Min(int32,
  61.                                                           int32)
  62.     IL_006a:  ldelem.i4
  63.     IL_006b:  ldc.i4.2
  64.     IL_006c:  div
  65.     IL_006d:  stloc.1
  66.     IL_006e:  ldarg.0
  67.     IL_006f:  call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  68.     IL_0070:  ldc.i4.s   20
  69.     IL_0071:  ble        IL_007b
  70.     IL_0072:  ldloc.1
  71.     IL_0073:  ldarg.0
  72.     IL_0074:  call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  73.     IL_0075:  ldc.i4.s   20
  74.     IL_0076:  sub
  75.     IL_0077:  ldc.i4   90000
  76.     IL_0078:  mul
  77.     IL_0079:  add
  78.     IL_007a:  stloc.1
  79.     IL_007b:  ldarg.0
  80.     IL_007c:  ldarg.0
  81.     IL_007d:  call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_Experience()
  82.     IL_007e:  ldloc.1
  83.     IL_007f:  call       int32 [mscorlib]System.Math::Max(int32,
  84.                                                           int32)
  85.     IL_0081:  call       instance void Kingmaker.UnitLogic.UnitProgressionData::set_Experience(int32)

  86. *  } // end of method CharSLevel::FillData
  87.     IL_00bd:  br         IL_0100
  88.     IL_00c2:  ldarg.0
  89.     IL_00c3:  ldfld      class ['Assembly-CSharp-firstpass']TMPro.TextMeshProUGUI Kingmaker.UI.ServiceWindow.CharacterScreen.CharSLevel::Level
  90.     IL_00c8:  ldloc.0
  91.     IL_00c9:  ldfld      class Kingmaker.Localization.LocalizedString Kingmaker.Blueprints.Root.Strings.UITextCharSheet::LEVEL
  92.     IL_00ce:  call       string Kingmaker.Localization.LocalizedString::op_Implicit(class Kingmaker.Localization.LocalizedString)
  93.     IL_00d3:  ldstr      " "
  94.     IL_00d8:  ldarg.1
  95.     IL_00d9:  ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
  96.     IL_00de:  callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  97.     IL_00e3:  box        [mscorlib]System.Int32
  98.     IL_00e8:  call       string [mscorlib]System.String::Concat(object,
  99.                                                                 object,
  100.                                                                 object)
  101.     IL_00ed:  callvirt   instance void ['Assembly-CSharp-firstpass']TMPro.TMP_Text::set_text(string)
  102.     IL_00f2:  ldarg.0
  103.     IL_00f3:  ldfld      class [UnityEngine.UI]UnityEngine.UI.Image Kingmaker.UI.ServiceWindow.CharacterScreen.CharSLevel::NegativeLevel
  104.     IL_00f8:  callvirt   instance class [UnityEngine.CoreModule]UnityEngine.GameObject [UnityEngine.CoreModule]UnityEngine.Component::get_gameObject()
  105.     IL_00fd:  ldc.i4.0
  106.     IL_00fe:  callvirt   instance void [UnityEngine.CoreModule]UnityEngine.GameObject::SetActive(bool)
  107.     IL_0100:  ldarg.1
  108.     IL_0101:  ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
  109.     IL_0102:  callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  110.     IL_0103:  ldc.i4.s  20
  111.     IL_0104:  bge        IL_0141
  112.     IL_0105:  call       class Kingmaker.Game Kingmaker.Game::get_Instance()
  113.     IL_0106:  callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
  114.     IL_0107:  ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
  115.     IL_0108:  ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
  116.     IL_0109:  ldfld      int32[] Kingmaker.Blueprints.Classes.BlueprintStatProgression::Bonuses
  117.     IL_010a:  ldarg.1
  118.     IL_010b:  ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
  119.     IL_010c:  callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  120.     IL_010d:  ldc.i4.1
  121.     IL_010e:  add
  122.     IL_010f:  ldelem.i4
  123.     IL_0110:  ldc.i4.2
  124.     IL_0111:  div
  125.     IL_011c:  stloc.3
  126.     IL_011d:  call       class Kingmaker.Game Kingmaker.Game::get_Instance()
  127.     IL_011e:  callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
  128.     IL_011f:  ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
  129.     IL_0120:  ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
  130.     IL_0121:  ldfld      int32[] Kingmaker.Blueprints.Classes.BlueprintStatProgression::Bonuses
  131.     IL_0122:  ldarg.1
  132.     IL_0123:  ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
  133.     IL_0124:  callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  134.     IL_0125:  ldelem.i4
  135.     IL_0126:  ldc.i4.2
  136.     IL_0127:  div
  137.     IL_0128:  stloc.s    V_4

  138.     IL_0140:  br        IL_0174
  139.     IL_0141:  call       class Kingmaker.Game Kingmaker.Game::get_Instance()
  140.     IL_0142:  callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
  141.     IL_0143:  ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
  142.     IL_0144:  ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
  143.     IL_0145:  ldfld      int32[] Kingmaker.Blueprints.Classes.BlueprintStatProgression::Bonuses
  144.     IL_0146:  ldc.i4.s  20
  145.     IL_0147:  ldelem.i4
  146.     IL_0148:  ldc.i4.2
  147.     IL_0149:  div
  148.     IL_014a:  ldarg.1
  149.     IL_014b:  ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
  150.     IL_014c:  callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
  151.     IL_014d:  ldc.i4.s  19
  152.     IL_014e:  sub
  153.     IL_014f:  ldc.i4  90000
  154.     IL_0150:  mul
  155.     IL_0151:  add
  156.     IL_0152:  stloc.3
  157.     IL_0153:  ldloc.3
  158.     IL_0154:  ldc.i4  90000
  159.     IL_0155:  sub
  160.     IL_0172:  stloc.s    V_4

  161. 职业等级上限及升级能力点数修改
  162. *  } // end of method BlueprintCharacterClass::MeetsPrerequisites
  163.     IL_001a:  ldc.i4.s   40
  164.     IL_001c:  blt        IL_0023

  165.     IL_0021:  ldc.i4.0
  166.     IL_0022:  ret

  167.     IL_0023:  ldarg.0
  168.     IL_0024:  ldfld      bool Kingmaker.Blueprints.Classes.BlueprintCharacterClass::PrestigeClass
  169.     IL_0029:  brfalse    IL_0038

  170.     IL_002e:  ldloc.0
  171.     IL_002f:  ldc.i4.s   40

  172. *  } // end of method ProgressionData::GetLevelEntry
  173.     IL_0000:  ldarg.1
  174.     IL_0001:  ldc.i4.s   20
  175.     IL_0002:  rem
  176.     IL_0003:  starg.s   level
  177.     IL_0004:  ldarg.1
  178.     IL_0005:  brtrue.s   IL_0008
  179.     IL_0006:  ldc.i4.s   20
  180.     IL_0007:  starg.s   level
  181.     IL_0008:  newobj     instance void Kingmaker.UnitLogic.ProgressionData/'<GetLevelEntry>c__AnonStorey0'::.ctor()
  182.     IL_0009:  stloc.0
  183.     IL_000a:  ldloc.0
  184.     IL_000b:  ldarg.1
  185.     IL_000c:  stfld      int32 Kingmaker.UnitLogic.ProgressionData/'<GetLevelEntry>c__AnonStorey0'::level
  186.     IL_000d:  ldarg.0

  187. 角色属性点获得修改(每两级获得1点属性点)
  188. *  } // end of method LevelUpState::.ctor
  189.     IL_00c8:  ldc.i4.2

  190. 角色升级生命值修改(每级获得生命点数为:角色生命骰+2+体质加点)
  191. *// end of method ApplyClassMechanics::ApplyHitPoints
  192.     IL_00d4:  ldc.i4.1

  193. 角色负重值修改(100倍负重)
  194. *  } // end of method EncumbranceHelper::GetHeavy
  195.     IL_007a:  call       float64 [mscorlib]System.Math::Round(float64)
  196.     IL_007b:  conv.i4
  197.     IL_007c:  ldc.i4.s   100
  198.     IL_007d:  mul
  199.     IL_007f:  conv.i4

  200. 角色移动速度修改(移动1.5倍速,战斗1.25倍速)
  201. *  } // end of method TimeController::Tick
  202.     IL_0063:  beq        IL_0068

  203.     IL_0064:  call       class Kingmaker.Game Kingmaker.Game::get_Instance()
  204.     IL_0065:  callvirt   instance valuetype Kingmaker.GameModes.GameModeType Kingmaker.Game::get_CurrentMode()
  205.     IL_0066:  ldc.i4.7
  206.     IL_0067:  bne.un     IL_00aa

  207.     IL_0068:  call       class Kingmaker.Game Kingmaker.Game::get_Instance()
  208.     IL_0069:  callvirt   instance class Kingmaker.Player Kingmaker.Game::get_Player()
  209.     IL_006a:  callvirt   instance bool Kingmaker.Player::get_IsInCombat()
  210.     IL_006b:  brtrue    IL_0073
  211.     IL_006c:  ldarg.0
  212.     IL_006d:  ldarg.0
  213.     IL_006e:  call       instance float32 Kingmaker.Controllers.TimeController::get_DeltaTime()
  214.     IL_006f:  ldc.r4     1.5
  215.     IL_0070:  mul
  216.     IL_0071:  call       instance void Kingmaker.Controllers.TimeController::set_DeltaTime(float32)
  217.     IL_0072:  br    IL_0079
  218.     IL_0073:  ldarg.0
  219.     IL_0074:  ldarg.0
  220.     IL_0075:  call       instance float32 Kingmaker.Controllers.TimeController::get_DeltaTime()
  221.     IL_0076:  ldc.r4     1.25
  222.     IL_0077:  mul
  223.     IL_0078:  call       instance void Kingmaker.Controllers.TimeController::set_DeltaTime(float32)
  224.     IL_0079:  ldarg.0
  225.     IL_007a:  ldarg.0
  226.     IL_007b:  call       instance float32 Kingmaker.Controllers.TimeController::get_DeltaTime()
  227.     IL_007f:  call       instance void Kingmaker.Controllers.TimeController::set_GameDeltaTime(float32)

  228. 角色大地图移动速度修改(VisualSpeedBase越大移动越快,MechanicsSpeedBase越大游戏时间流逝越慢)
  229. *  } // end of method GlobalMapRoot::.ctor
  230.     IL_0000:  ldarg.0
  231.     IL_0001:  ldc.r4     0.02
  232.     IL_0006:  stfld      float32 Kingmaker.Blueprints.Root.GlobalMapRoot::VisualSpeedBase
  233.     IL_000b:  ldarg.0
  234.     IL_000c:  ldc.r4     12.
  235.     IL_0011:  stfld      float32 Kingmaker.Blueprints.Root.GlobalMapRoot::MechanicsSpeedBase

  236. 视野缩放范围修改
  237. *  } // end of method CameraZoom::TickZoom
  238.     IL_0088:  ldc.r4      30
  239.     IL_008f:  ldc.r4      5

  240. 新增隐藏UI开关快捷键 Ctrl + Alt + H
  241. *  } // end of method KeyboardAccess::RegisterBuiltinBindings
  242.     IL_04d1:  ldarg.0
  243.     IL_04d2:  ldstr      "RapidBugReportWindowOpen"
  244.     IL_04d3:  ldc.i4.s   98
  245.     IL_04d4:  ldloc.0
  246.     IL_04d5:  ldc.i4.1
  247.     IL_04d6:  ldc.i4.1
  248.     IL_04d7:  ldc.i4.1
  249.     IL_04d8:  ldc.i4.0
  250.     IL_04d9:  ldc.i4.0
  251.     IL_04da:  call       instance void Kingmaker.UI.KeyboardAccess::RegisterBinding(string,
  252.                                                                                     valuetype [UnityEngine.CoreModule]UnityEngine.KeyCode,
  253.                                                                                     class [mscorlib]System.Collections.Generic.IEnumerable`1<valuetype Kingmaker.GameModes.GameModeType>,
  254.                                                                                     bool,
  255.                                                                                     bool,
  256.                                                                                     bool,
  257.                                                                                     bool,
  258.                                                                                     valuetype Kingmaker.UI.KeyboardAccess/ModificationSide)
  259.     IL_04db:  ldarg.0
  260.     IL_04dc:  ldstr      "HideUI"
  261.     IL_04dd:  ldc.i4.s   104
  262.     IL_04de:  ldloc.0
  263.     IL_04df:  ldc.i4.1
  264.     IL_04e0:  ldc.i4.1
  265.     IL_04e1:  ldc.i4.0
  266.     IL_04e2:  ldc.i4.0
  267.     IL_04e3:  ldc.i4.0
  268.     IL_04e4:  call       instance void Kingmaker.UI.KeyboardAccess::RegisterBinding(string,
  269.                                                                                     valuetype [UnityEngine.CoreModule]UnityEngine.KeyCode,
  270.                                                                                     class [mscorlib]System.Collections.Generic.IEnumerable`1<valuetype Kingmaker.GameModes.GameModeType>,
  271.                                                                                     bool,
  272.                                                                                     bool,
  273.                                                                                     bool,
  274.                                                                                     bool,
  275.                                                                                     valuetype Kingmaker.UI.KeyboardAccess/ModificationSide)
  276.     IL_04e5:  ldarg.0
  277.     IL_04e6:  call       void Kingmaker.PubSubSystem.EventBus::Subscribe(object)
  278.     IL_04ea:  ret

  279. +  .field public class Kingmaker.GameStatistic Statistic
  280.   .field public class [UnityEngine.CoreModule]UnityEngine.GameObject GameObject

  281. +  } // end of method Game::.cctor

  282.   .method private hidebysig instance void
  283.           '<Initialize>m__13'() cil managed
  284.   {
  285.     .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
  286.     // 代码大小       19 (0x13)
  287.     .maxstack  8
  288.     IL_0000:  ldarg.0
  289.     IL_0001:  ldfld        class [UnityEngine.CoreModule]UnityEngine.GameObject Kingmaker.Game::GameObject
  290.     IL_0002:  brtrue     IL_000a
  291.     IL_0003:  ldarg.0
  292.     IL_0004:  ldarg.0
  293.     IL_0005:  ldfld        class Kingmaker.UI.UIAccess Kingmaker.Game::UI
  294.     IL_0006:  callvirt     instance class Kingmaker.Assets.UI.MainCanvas Kingmaker.UI.UIAccess::get_MainCanvas()
  295.     IL_0007:  callvirt     instance class [UnityEngine.UIModule]UnityEngine.CanvasGroup Kingmaker.Assets.UI.MainCanvas::get_CanvasGroup()
  296.     IL_0008:  callvirt     instance class [UnityEngine.CoreModule]UnityEngine.GameObject [UnityEngine.CoreModule]UnityEngine.Component::get_gameObject()
  297.     IL_0009:  stfld        class [UnityEngine.CoreModule]UnityEngine.GameObject Kingmaker.Game::GameObject
  298.     IL_000a:  ldarg.0
  299.     IL_000b:  ldfld        class [UnityEngine.CoreModule]UnityEngine.GameObject Kingmaker.Game::GameObject
  300.     IL_000c:  ldarg.0
  301.     IL_000d:  ldfld        class [UnityEngine.CoreModule]UnityEngine.GameObject Kingmaker.Game::GameObject
  302.     IL_000e:  callvirt     instance bool [UnityEngine.CoreModule]UnityEngine.GameObject::get_activeSelf()
  303.     IL_000f:  ldc.i4.0
  304.     IL_0010:  ceq
  305.     IL_0011:  callvirt     instance void [UnityEngine.CoreModule]UnityEngine.GameObject::SetActive(bool)
  306.     IL_0012:  ret
  307.   } // end of method Game::'<Initialize>m__13'

  308. *  } // end of method Game::Initialize
  309.       IL_0037:  ldarg.0
  310.       IL_0038:  ldfld      class Kingmaker.UI.KeyboardAccess Kingmaker.Game::Keyboard
  311.       IL_0039:  call       void Kingmaker.Utility.Screenshot::Initialize(class Kingmaker.UI.KeyboardAccess)
  312.       IL_003a:  ldarg.0
  313.       IL_003b:  ldfld      class AuraSupport Kingmaker.Game::AuraSupport
  314.       IL_003c:  callvirt   instance void AuraSupport::Initialize()
  315.       IL_003d:  ldarg.0
  316.       IL_003e:  ldfld      class Kingmaker.UI.KeyboardAccess Kingmaker.Game::Keyboard
  317.       IL_003f:  ldstr      "HideUI"
  318.       IL_0040:  ldarg.0
  319.       IL_0041:  ldftn      instance void Kingmaker.Game::'<Initialize>m__13'()
  320.       IL_0042:  newobj     instance void [mscorlib]System.Action::.ctor(object,
  321.                                                                         native int)
  322.       IL_0048:  callvirt   instance void Kingmaker.UI.KeyboardAccess::Bind(string,
  323.                                                                            class [mscorlib]System.Action)

  324. 修改施法造成的友军伤害减半
  325. *  } // end of method AbilityAcceptBurnOnCast::OnCast
  326.     IL_0019:  ldfld      int32 Kingmaker.UnitLogic.Class.Kineticist.AbilityAcceptBurnOnCast::BurnValue
  327.     IL_001a:  ldc.i4.2
  328.     IL_001b:  div
  329.     IL_001e:  ldarg.1

  330. *  } // end of method KineticistAbilityBurnCost::GetTotal
  331.     IL_0095:  brfalse    IL_009c

  332.     IL_009a:  ldc.i4.1
  333.     IL_009b:  br         IL_009d

  334.     IL_009c:  ldc.i4.0
  335.     IL_009d:  mul
  336.     IL_009e:  add
  337.     IL_009f:  ldc.i4.2
  338.     IL_00a0:  div
  339.     IL_00a3:  ret
复制代码


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

 楼主| 发表于 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语句的帮助信息。



回复 支持 反对

使用道具 举报

31

主题

1540

帖子

8526

积分

3DM Mod原创组

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

贡献度
725
金元
55658
积分
8526
精华
6
注册时间
2011-12-23

3DM MOD站(白银)

 楼主| 发表于 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

主题

334

帖子

480

积分

高级玩家

Rank: 4

贡献度
11
金元
4364
积分
480
精华
0
注册时间
2008-5-30
发表于 2019-2-8 22:37 | 显示全部楼层
强力支持~希望好MOD越来越多。
回复 支持 反对

使用道具 举报

0

主题

444

帖子

371

积分

高级玩家

Rank: 4

贡献度
0
金元
3705
积分
371
精华
0
注册时间
2012-1-17
发表于 2019-2-10 21:51 | 显示全部楼层
楼主对游戏是真爱
回复 支持 反对

使用道具 举报

1

主题

767

帖子

652

积分

超级玩家

Rank: 5Rank: 5

贡献度
2
金元
6443
积分
652
精华
0
注册时间
2009-10-4
发表于 2019-2-13 12:19 | 显示全部楼层
楼主牛逼
回复 支持 反对

使用道具 举报

0

主题

692

帖子

518

积分

高级玩家

Rank: 4

贡献度
9
金元
4819
积分
518
精华
0
注册时间
2008-11-4
发表于 2019-2-15 17:05 | 显示全部楼层
感谢分享!~
回复 支持 反对

使用道具 举报

2

主题

183

帖子

213

积分

中级玩家

Rank: 3Rank: 3

贡献度
1
金元
2092
积分
213
精华
0
注册时间
2010-9-4
发表于 2019-3-9 02:12 | 显示全部楼层
66666666666666666666666666666
回复 支持 反对

使用道具 举报

2

主题

183

帖子

213

积分

中级玩家

Rank: 3Rank: 3

贡献度
1
金元
2092
积分
213
精华
0
注册时间
2010-9-4
发表于 2019-3-9 02:21 | 显示全部楼层
66666666666666666666666666666
回复 支持 反对

使用道具 举报

2

主题

183

帖子

213

积分

中级玩家

Rank: 3Rank: 3

贡献度
1
金元
2092
积分
213
精华
0
注册时间
2010-9-4
发表于 2019-3-10 01:41 | 显示全部楼层
liyun_1981 发表于 2019-2-2 23:02
第二部分:DLL文件的反编译与重编译

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

使用道具 举报

2

主题

183

帖子

213

积分

中级玩家

Rank: 3Rank: 3

贡献度
1
金元
2092
积分
213
精华
0
注册时间
2010-9-4
发表于 2019-3-13 01:51 | 显示全部楼层
liyun_1981 发表于 2019-2-2 23:02
第三部分:IL文件的修改

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

使用道具 举报

0

主题

115

帖子

352

积分

高级玩家

Rank: 4

贡献度
0
金元
3523
积分
352
精华
0
注册时间
2014-4-2
发表于 2019-4-9 19:26 | 显示全部楼层
bin4633 发表于 2019-3-13 01:51
大神,我很好奇你是怎么得知需要修改的目标代码的查询关键字的?望指点
...

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

使用道具 举报

0

主题

115

帖子

352

积分

高级玩家

Rank: 4

贡献度
0
金元
3523
积分
352
精华
0
注册时间
2014-4-2
发表于 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

主题

115

帖子

352

积分

高级玩家

Rank: 4

贡献度
0
金元
3523
积分
352
精华
0
注册时间
2014-4-2
发表于 2019-4-12 00:44 | 显示全部楼层
楼主你不仅把移动速度改成1.5了吧,整个游戏时间被你加快了1.5倍
回复 支持 反对

使用道具 举报

0

主题

81

帖子

188

积分

中级玩家

Rank: 3Rank: 3

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

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

0

主题

81

帖子

188

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1883
积分
188
精华
0
注册时间
2013-9-15
发表于 2019-4-12 17:48 | 显示全部楼层
liyun_1981 发表于 2019-4-12 17:42
在“游戏设置”界面把字体调到最小就行,这个是游戏的UI的框框不能自动跟随字体动态调整的问题。
...

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

使用道具 举报

0

主题

81

帖子

188

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1883
积分
188
精华
0
注册时间
2013-9-15
发表于 2019-4-15 21:40 | 显示全部楼层
大佬游戏更新到1.3.2,40级上限那个mod是不是不能用了
回复 支持 反对

使用道具 举报

0

主题

81

帖子

188

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1883
积分
188
精华
0
注册时间
2013-9-15
发表于 2019-4-16 17:38 | 显示全部楼层
那就等大佬更新mod了
回复 支持 反对

使用道具 举报

5

主题

648

帖子

637

积分

超级玩家

Rank: 5Rank: 5

贡献度
3
金元
6246
积分
637
精华
0
注册时间
2014-7-15
发表于 2019-5-12 17:01 | 显示全部楼层
楼主牛逼!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

8

主题

702

帖子

763

积分

3DM创意工坊

Rank: 11Rank: 11Rank: 11Rank: 11

贡献度
14
金元
7073
积分
763
精华
0
注册时间
2010-11-26
发表于 2019-6-15 00:24 | 显示全部楼层
厉害!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

1

主题

62

帖子

122

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1217
积分
122
精华
0
注册时间
2015-3-16
发表于 2019-6-22 07:34 | 显示全部楼层
谢大佬。。不过升两级拿属性的代码被改了。。还是那里是要加一行啊
回复 支持 反对

使用道具 举报

0

主题

449

帖子

459

积分

高级玩家

Rank: 4

贡献度
8
金元
4274
积分
459
精华
0
注册时间
2009-7-23
发表于 2019-6-24 18:03 | 显示全部楼层
大佬牛逼啊,必须支持
回复 支持 反对

使用道具 举报

51

主题

2837

帖子

2749

积分

游戏达人

Rank: 7Rank: 7Rank: 7

贡献度
117
金元
18814
积分
2749
精华
0
注册时间
2009-10-16
发表于 2019-6-28 20:55 | 显示全部楼层
liyun_1981 发表于 2019-2-2 23:02
第三部分:IL文件的修改

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

使用道具 举报

3

主题

510

帖子

481

积分

高级玩家

Rank: 4

贡献度
12
金元
4325
积分
481
精华
0
注册时间
2009-8-18
发表于 2019-7-18 14:31 | 显示全部楼层
借地问一下,40级mod里秘术师10级之后不提升神术施法者等级了啊
回复 支持 反对

使用道具 举报

0

主题

423

帖子

450

积分

高级玩家

Rank: 4

贡献度
3
金元
4381
积分
450
精华
0
注册时间
2006-4-19
发表于 2019-8-18 23:29 | 显示全部楼层
真干货,感谢楼主分享
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2019-9-23 00:23 , Processed in 0.130254 second(s), 19 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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