# 准备工作
在dnSpy中加载Assembly-CSharp.dll,找到CheatsManager这个类,下面会分别分析该类下各个函数的实现和作用。
控制台的UI由IMGUI构建,在本篇中,会暂时跳过所有UI相关代码。
# 代码分析
# Awake
# 作用
调用FillCards函数。
# 实现
Awake作为CheatsManager初始化后执行的第一个函数,代码逻辑非常简单:判断CheatActive的值,即控制台是否能被开启,如果能被开启,则调用FillCards函数。
if (this.CheatsActive)
{
this.FillCards();
CheatsManager.ShowFPS = true;
}
# FillCards
# 作用
获取并保存所有卡牌数据。该函数复用性很高,很多时候都可以直接抄来自己用。类似需求:获取所有包含tag_xxx的卡牌、获取所有会腐烂的卡牌。
# 实现
在执行FillCards函数时,先用了两条if语句,判断GameLoad类中的两个变量是否存在,因为后续会去读取GameLoad.Instance.DataBase中的数据,如果这个变量本身不存在,游戏就会报错卡死。
if (!GameLoad.Instance)
{
return;
}
if (!GameLoad.Instance.DataBase)
{
return;
}
在上一章,提到过,游戏中卡牌和状态都是以UniqueIDScriptable类型保存的,这些数据,就是保存在GameLoad.Instance.DataBase.AllData中的。
为了拿到所有卡牌数据,先新建了一个list列表来保存卡牌数据,然后遍历GameLoad.Instance.DataBase.AllData,通过if语句将其中所有类型为CardData的数据提取出来,放入自建的list列表中。
List<CardData> list = new List<CardData>();
for (int i = 0; i < GameLoad.Instance.DataBase.AllData.Count; i++)
{
if (GameLoad.Instance.DataBase.AllData[i] is CardData)
{
list.Add(GameLoad.Instance.DataBase.AllData[i] as CardData);
}
}
将list列表转换成array数组。同时计算MaxPages,顾名思义,这是在计算最大页数,虽然控制台的菜单可以下滑,但是下滑的距离是有限的,因此还需要分页,这里就是根据卡牌的数量计算UI需要多少页。这俩数据都会在其他函数中使用。
this.AllCards = list.ToArray();
this.MaxPages = list.Count / 150;
# CardsGUI
# 作用
提供部分控制台UI(搜索并显示卡牌数据那一块)。
# 实现
UI相关暂时不讲,该函数中,有一句代码比较有用:就是给卡。在dllmod中,想要直接给予玩家卡牌,就用这句代码,第一个参数传入对应卡牌的数据(如何获取特定卡牌的可以参考第二章)。对于普通卡牌来说,第二个参数应当传入false;对于环境改造类(EnvImprovement)卡牌来说,如果只希望解锁该改造,应当传入false,如果希望直接建成改造,应当传入true。
GameManager.GiveCard(this.AllCards[i], false);
GameManager.GiveCard(this.AllCards[i], true);
# GeneralOptionsGUI
# 作用
提供部分控制台UI(最上方几个单选框那一块)。
# 实现
除开IMGUI的代码,有一句代码比较实用:可以看出来是修改月亮。
GameLoad.Instance.SaveData.Moons++;
从这条和上条给卡的功能,可以发现,dllmod很多时候,都是从游戏代码中获取数据,或者直接调用游戏代码中的函数。
# OnGUI
# 作用
是否显示UI。
# 实现
IMGUI相关。
# SetCheatsActive
# 作用
设置控制台状态。
# TimeGUI
# 作用
提供部分控制台UI(调节时间那一块)。
# 实现
IMGUI相关功能是用来调整数值的,调整好数值后,通过下面这句代码来调整时间。
这个功能只是调了游戏中的时间,并不会对卡牌产生任何影响,例如食物腐烂。
但如果dllmod中有读取时间信息,则会产生影响(例如后天mod通过读取时间来调整暴风雪等级,那么通过该功能,可以动态调整暴风雪等级)。
this.GM = MBSingleton<GameManager>.Instance;
this.GM.SetTimeTo(this.SetTimeDay, this.SetTimeTick);
# Update
# 作用
实现一些快捷键操作(例如Tab打开控制台)。
# 实现
IMGUI相关。