解密《黑神话:悟空》脚本
《黑神话:悟空》这游戏昨天上线了,我第一时间就下载玩了。玩的时候我就挺好奇他们是怎么写的程序,毕竟这么大的游戏项目肯定不会只用C++一种语言来写。所以我解压了游戏文件,看看里面有没有什么线索,结果还真发现了一些有趣的东西。
在游戏正式上线前,官方就发布了一个免费的测试工具,这个工具里其实包含了完整的游戏代码,只是把大部分游戏资源给删掉了。项目组应该是没时间再单独做一个新的测试工程,比起删代码,删资源简单多了,这是程序员都能理解的事情。
引擎版本
一开始他们用的是UE4,后来UE5出来后他们就转用了UE5。现在游戏用的引擎版本是UE5.0.0。虽然Epic后来又发布了UE5.0.3这些更新版本,但项目组一般不会随便升级引擎版本。
他们可能会从新版本里拿一些需要的代码过来用,毕竟如果换引擎的话,之前做的大量定制化改动很难迁移过去。
代码段大小
游戏的exe文件大小达到了859MB,这个大小有点不寻常。相比之下,像《三角洲行动》这样的UE游戏客户端大小是140MB,《极品飞车:集结》客户端大小是105MB。我觉得可能是游戏中包含了太多不必要的插件代码或者是没有去掉一些不需要的符号信息。
技术总监
游戏科学的团队创始人来自腾讯的《斗战神》项目,他们的技术总监招文勇是在2010年加入腾讯量子工作室的,后来这个工作室并入了光子工作室。
文勇是从中山大学软件工程系毕业的,2014年他和冯骥、杨奇等《斗战神》的核心成员一起创立了游戏科学。在这之前,他还担任过《战争艺术:赤潮》的主程。如果有人做过Unity开发并且经常关注Unity Wechat Academy(UWA)的话,应该看过他在UWA平台上的分享文章。其中有一篇写得特别好
他曾经分享过一种配置存储方法,就是把配置放在Lua表里,然后用C#的unsafe code来访问这些配置,这样配置数据只需要占用一份内存空间而且还能保持高效。
那时候他们用的是xLua,所以我猜测他们选择的脚本方案可能还是基于Lua的。比如像sluaunreal这种已经在吃鸡手游上验证过的,或者UnLua,因为它维护得比较好。
还有一种可能是他们用了最近车神新出的PuerTS,不过考虑到《黑神话:悟空》立项的时间比较早,应该不会用这两年才兴起的PuerTS,因为切换成本太高。
另外,他们也可能用了C#,但现在市面上的一些C#方案要么没人维护,而且基本上只能在Windows上用,跨平台支持不太好。
我在检查代码符号的时候,发现了好多跟V8有关的内容,所以自然而然地以为他们用了PuerTS,感觉项目组还挺跟得上潮流的。
但是奇怪的是,我没有找到任何跟PuerTS相关的符号。后来我试着搜索"js"这个词,结果发现代码里包含了Unreal.js这个插件。
Unreal.js 这个插件是几年前的东西了,一直都没人维护,直到去年才增加了对 UE5 的支持。看起来《黑神话:悟空》项目组对这个插件做了一些修改。
就这样,我原本以为他们用的就是 Unreal.js,但当我开始解包 pak 文件时,情况有了变化。
解包UE的Pak文件通常需要知道对应的引擎版本和AES密钥,因为不同版本的PakInfo结构会有所不同。
这里就不详细说了,直接说结论吧。我在解包的过程中没有找到像 js、ts 或 wasm 这样的代码文件,所以他们可能继承了Unreal.js插件但并没有真正使用它,或者他们用了其他的方式来存储脚本代码。
但在翻阅Pak文件时,我发现了很多两种类型的二进制文件:.data 和 .Data。小写开头的 .data 文件看起来像是配置文件,而大写开头的 .Data 文件更像是某种代码的二进制形式。
比如 .data 文件中包含的是物品的配置信息,里面似乎记录了物品的蓝图路径和其他配置内容,整体结构类似于protobuf。
.Data 文件看起来就像是某种代码的二进制形式,但按照我的经验,JavaScript(js)或 TypeScript(ts)编译后的代码通常不是这样的形式。这些 .Data 文件倒更像是自定义的状态机代码的样子。
这就有点奇怪了,既没有找到 JavaScript 代码,也没有发现类似 Lua 编译后的代码。但是既然有这种看起来像是二进制代码的文件,那么他们是不是用了 C# 相关的方案呢?
比如 USharp、UnrealCLR 或者 UnrealSharp。我在代码符号中搜索了这些相关的字符串,果然找到了 USharp 的痕迹,并且在 Pak 文件中也发现了 USharp 的 uplugin 文件。所以现在可以确定他们用的就是 USharp。
简单来说,在上面的图中我们可以看到被选中的节点里大量使用了 SharpClass,这是 USharp 中的一个自定义类 UBlueprintGeneratedClass。
它的作用是在运行时将 C# 中定义的 UClass 动态地转换成虚幻引擎(UE)能够识别的类型。这样就可以在虚幻引擎中使用 C# 编写的类了。
看起来事情并不那么简单。虽然 USharp 本身并不支持虚幻引擎 5(UE5),也不支持主机和移动设备平台,但在《黑神话:悟空》的项目文件中却包含了对这些平台的支持。
这很可能意味着《黑神话:悟空》的开发者们对 USharp 进行了大量的修改和兼容性改进,以便让它能在 UE5 和不同平台上运行。
尽管如此,我在游戏的打包文件(Pak 文件)中没有找到 JavaScript (js)、Lua (lua) 或者 USharp 的 DLL 文件。这就有点奇怪了,因为在游戏的代码中确实有使用到 Unreal.js 和 USharp 插件的迹象。让我们接着往下探究这个问题。
提到 il2cpp,对于 Unity 开发者来说应该很熟悉。这是 Unity 为了改善 mono 虚拟机的兼容性和性能问题而推出的一种解决方案。简单来说,il2cpp 可以把 C# 代码编译成原生机器码,这样就能提高游戏的运行效率。
然而 il2cpp 是 Unity 专有的技术,用来提高 C# 代码的性能和兼容性,但它通常是和 Unity 引擎绑定在一起的。
在查看《黑神话:悟空》中与 USharp 相关的代码符号时,我发现了一个令人惊讶的情况。《黑神话:悟空》所使用的 USharp 并不是原版的,而是经过了修改,添加了 USharp 运行模式的切换功能。
这意味着他们可以在不同的运行模式之间选择,包括常用的 mono 和 clr 模式,还有 il2cpp 模式!
换句话说,《黑神话:悟空》的团队不仅使用了 USharp,而且还对它进行了大量的定制,使得它能够支持多种不同的运行模式,包括 Unity 的 il2cpp 技术。这表明他们为了让游戏运行更加高效,做了很多额外的工作。
这些不同的运行模式并不是原版 USharp 包含的功能,这意味着项目组为了提高兼容性和性能做了大量的定制和改进。
他们实际上是基于 USharp 重新开发了一个支持多种模式的 C# 脚本方案,包括 mono、clr 和 il2cpp。
既然在 Pak 文件中没有找到 DLL 或脚本文件,那么在正式发布的版本中他们很可能是使用了 il2cpp。这样一来,C# 中定义的所有类型和符号都被编译成了 C++ 代码,并最终整合进了 exe 文件中。这就是为什么 exe 文件会变得如此之大的原因。
如果把 C# 代码打包成 DLL 文件,整个游戏的大小可能只会增加几十 MB,而 exe 文件的大小大概能减少到 100 MB 左右。不过这样做可能会稍微牺牲一些性能。
总结一下,《黑神话:悟空》的脚本方案是基于 USharp 进行了大量定制化的改进,他们自己实现了支持 mono、clr 和 il2cpp 的运行模式,并且这套方案还支持多个平台,包括 PC、Mac、Linux、Android、iOS、PS5 和 Xbox。
此外,虽然游戏的代码中集成了 Unreal.js,但看起来并没有真正使用到它。他们还使用了一种自研的状态机或行为树系统,并且配置表是以 protobuf 结构的二进制数据形式存储的。
需要注意的是,这里只是简单分析了《黑神话:悟空》的脚本方案,并没有涉及任何解包方法或资源破解的信息,请不要用于非法用途。
黑神话悟空:杨奇专访!二郎神早期白发形象公布!废案实锤!嫦娥CP解密!各位黑神话们的大佬好呀,一起来看看今天都有哪些值得关注的信息吧!周冬雨:“若有机会希望出演黑神话悟空影视化角色...
据Steam数据显示,全球玩家中仅有0.9%的人解锁了《黑神话:悟空》的“第八十一难”成就。同时,有部分网友质疑最后几个成就是否使用了第三方工具进行一键解锁。《黑神话:悟空》是一款...
9月20日,《黑神话:悟空》在官方微博发布声明称。《黑神话:悟空》自上线以来,受到了广大玩家的全情支持与社会各方的广泛关注。除了不断提升游戏本身的品质,我们也正在与合作伙伴密切沟通...
近日,国产第一部3A大作《黑神话:悟空》可以说是火出了天际。不仅在国内火,在国外亦是刮起了一阵“西游风”,截止至今日《黑神话:悟空》在Steam的销量已突破了840万份,销量过千万...
黑神话三件趣味吧。第一件,游戏发售满两个月,每天在线人数仍有17万。近期,外网又给对黑神话冷嘲热讽,“两个月过去了,黑神话悟空在线数从最初的300万剧降到17万,游科可定损失巨大”...
文/墨尔本强森 【游机社www.gamermarch.com(转载请注明出处)】自《黑神话:悟空》问世以来,其如烈火燎原之势,迅速风靡四海,引得世人瞩目。此游戏之火爆,非但令众多玩...
黑神话悟空:彻底懵了!日本玩家对剧情感到破防!直言看得是盗版西游!各位黑神话的大佬们好呀,随着黑神话悟空的爆火,那么作为喜爱单机大作的日服玩家,是如何评价《黑神话悟空》的呢?一起来...
《黑神话悟空》制作人采访,解释了被砍掉的狮驼岭,女儿国等关卡!各位黑神话的大佬们好呀,就在刚刚。有媒体放出了有关“黑神话悟空”上线前唯一的独家深度专访,信息量还是非常巨大的。同时也...
直播吧11月18日讯 老头杯(传奇杯)S2小组赛Day3的赛程结束,leyan豹女化身代练豪取18杀、Uzi卡莎残局一打三带队取胜。第一局:
众所周知,官方曾承诺所有限定的皮肤均有一次直售返场的机会。但这是并不包括6元皮肤的,这也导致有的6元皮肤发布超千天,也至今没有过返场~那么具体有哪些皮肤呢?本期我们一起来看看吧马可...
大话西游2守护石推出已经有一段时间了,不知老铁们都洗出自己心爱的属性了么?今天来给大家展示一波江湖大佬的珍藏,这些极品守护石集中出现的画面。平时可很难见到!连击五叶神器!极品大力...
如果要问这款游戏里面哪些武将非常的强大,可能有一些玩家觉得是神将。有这种想法的,都不是真正资深的玩家,因为神将在游戏里面只是等级比较高,展现出的能力并没有那么的出彩。真正让大家觉得...
大家好,我是如风,资深老玩家给你带来关于梦幻的故事!(原创码字、抵制抄袭,感谢关注点赞)二狗分析假赛最大原因是围子!二狗在昨晚的直播当中,再次聊到了武神坛假赛的话题。他表示服战假赛...
三国杀这款游戏,本质上还是一款需要操作的游戏,只要我们在游戏当中能够拥有出色的操作,就可以赢得队友的鼓励,而且自己也非常的有成就感。可是很多玩家对这款游戏的操作并不是特别的理解,使...
体验服最新改动,只要角色等级高于可领取的任务等级,即可一键跳过逸闻录任务。所以现在还有小号没有过任务的玩家,可以停手安心屯疲劳了,27号当天可以直接刷50级深渊到60级,然后去刷6...
探寻游戏世界巅峰的极致体验,本文将带你领略那些备受玩家喜爱、下载量傲视群雄的开放世界游戏。无论是宏大的剧情、自由探索的广阔天地,还是精良的画面与深度玩法。这些热门大作定能满足你对冒...
一只乌龟坐骑即将在11.0.7登录商栈,根据这只坐骑的描述来看。它在地面上的移动会很慢,但是水下会非常快。另外它还有一个非常酷的描述,它自带一门大炮,不知道会不会有特殊的动画效果。...
小编推荐