解密《黑神话:悟空》脚本

news2024/11/28 17:43:02

本文部分参考来自于:john        

《黑神话:悟空》这游戏昨天上线了,我第一时间就下载玩了。玩的时候我就挺好奇他们是怎么写的程序,毕竟这么大的游戏项目肯定不会只用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 文件时,情况有了变化。

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

提到 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 结构的二进制数据形式存储的。

需要注意的是,这里只是简单分析了《黑神话:悟空》的脚本方案,并没有涉及任何解包方法或资源破解的信息,请不要用于非法用途。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开学季必备物品有什么?收下这份高三党开学必备清单!

随着新学期的脚步越来越近,高三的同学们即将迎来人生中至关重要的一年。这一年里,你们将面临无数挑战,同时也将迎来成长的机遇。为了帮助大家更好地准备,我们特别整理了这份“高三党开学必备清单”。这里不仅涵盖了高效学习所需的…

用博达网站群管理平台设计网站时如何引用组件

1 介绍 开发网站时,通常会遇到一种情况,就是在多个页面上需显示相同的内容,例如树状导航,网站导航等。这种情况下可以用博达网站群管理平台中的引用组件功能。引用组件就是与原组件相关联,修改任何一个,其…

书画家•郭晋山•系列作品•赏析之三十三•甲辰龙年第二十九版

[个人简介]: 郭晋山,男,1964年生,祖籍山西繁峙人。 经常欣赏书画名家大作,仔细研究作品之中蕴含的深情厚谊及大自然的美,与作者是如何将内心所想,淋漓尽致地表达在作品之中的! [艺术…

我知道要学GIS开发哪些内容,也已经按照框架全部学完了,为什么还是不会开发?还是没有公司要?

大家都知道GIS行业前景和待遇最好的是GIS开发,但是在学校学不到什么核心技能,所以很多同学都想自学。 动手能力强一点的小伙伴们,会自己去找一些GIS开发教程、开源资料库等等来展开自学。这些资料百度上一搜一大把,加个QQ群、微信…

iTOP-3562开发板/核心板应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)、车牌识别、物体识别等

可应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)、车牌识别、物体识别等。 iTOP-3562开发板/核心板采用瑞芯微RK3562处理器,内部集成了四核A53Mali G52架构,主频2GHZ,内置1TOPSNPU算力,R…

二叉树剪枝

1、题目解析 2、算法解析 本题使用二叉树的后序遍历,通过递归函数将左右子树进行处理,得到处理结果后,判断左右结果以及自身的val判断是否需要剪枝。 3、代码编写 class Solution { public:TreeNode* pruneTree(TreeNode* root) {if(root …

Ollama 使用指南:Linux、Windows 和 macOS

Ollama 是一个开源平台,用于部署和运行大型语言模型。它提供了一种在本地环境中运行语言模型的能力,使得用户可以在本地安全地与这些模型进行交互,而无需将数据发送到云端。 安装 Ollama 确保您已经安装了 Ollama。如果还没有安装&#xf…

HashMap实现原理 | HashMap扩容机制 | 底层源码

新人写手,代码菜鸡;笔下生涩,诚惶诚恐。 初试锋芒,尚显青涩; 望君指点,愿受教诲。 目录 一、构造函数 1.1 无参构造函数 1.2 指定HashMap初始容量、负载因子 1.3 传入Map 二、成员变量 三、添加元素及…

Linux--网络配置命令和配置文件--路由实战

文章目录 基本网络配置网卡命名规范为什么要统一网卡名称 修改网卡名称1.修改/etc/default/grub配置2.执行生效命令和重启Ubuntu的网卡名修改 配置网络接口网络接口配置DHCP自动分配静态IP手动分配 网卡配置文件生效方法验证文件是否生效1.验证IP2.验证网关3.验证DNS VMware网卡…

深入探究神经网络的图像处理机制

深入探究神经网络的图像处理机制 前言1. 输入图像的初步处理2. 卷积层的作用3. 归一化与激活函数4. 下采样的深化5. 全局池化的影响6. 特征的融合与转换7. 上采样与图像重建8. 图像的生成与拼接9. 残差学习结语 前言 在人工智能的浪潮中,神经网络以其强大的数据处理…

R语言论文插图模板第7期—分组散点图

在之前的文章中,分享过R语言折线图的绘制模板: 柱状图的绘制模板: 本期再来分享一下散点图(分组)的绘制方法。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,…

蓝牙资讯|苹果研究无感触控技术,可控制苹果设备

苹果正在研究让织物具有触控功能的方法,目标是在更多的产品上嵌入控件或检测手势,而不仅仅是 Apple Watch 表带或 iPhone 手机壳。他们之前就已经开始研究如何把控件融入织物之中了。 最新的专利 " 织物传感设备 " 显示苹果正进一步推进这个…

OpenLayers3, 导出图片

文章目录 一、前言二、代码实现三、总结 一、前言 本文基于OpenLayers3&#xff0c;canvas转图片实现地图导出图片的功能。 二、代码实现 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head><meta http-equiv"Content…

Stable Diffusion 3 Medium开源,创作自由一触即发!

前言 HyperAl超神经现已上线「ComfyUl Stable Diffusion3工作流在线教程」&#xff0c;已经为大家搭建好了环境&#xff0c;使用时无需输入任何命令&#xff0c;一键克隆即可启动。 该教程将Stable Diffusion3 Medium强大的文生图能力与ComfyUl直观、简洁的工作流强强结合&am…

Prettier+Vscode setting提高前端开发效率

文章目录 前言Prettier第一步&#xff1a;下载依赖&#xff08;团队合作&#xff09;或下载插件&#xff08;独立开发&#xff09;第二步&#xff1a;添加.prettierrc.json文件**以下是我使用的****配置规则** 第三步&#xff1a;添加.prettierignore文件**以下是我常用的****配…

1000人规模冗余设置

1000人规模冗余设置 步骤①&#xff1a;Vlan Trunk Eth-trunk 底层配置 #eth-trunk配置&#xff1a; sw1 &#xff1a; int eth-trunk 2 mode lacp-static trunkport gi 0/0/2 trunkport gi 0/0/3 sw2 &#xff1a; int eth-trunk 2 mode lacp-static trunkport gi 0/…

PythonStudio 控件使用常用方式(三十三)TMonthCalendar

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

Mysql删除几亿条数据表中的部分数据

1、需求 老项目&#xff0c;实时数据还是用mysql去存储的&#xff0c;而且又没有定时去清理数据的程序。目前这些实时数据只需保留近半年的即可。 其他几张实时表数据量没有这么夸张。 我随即用 delete from table_name where id < 39000000 limit 10000 但是几亿条记录…

[DL]深度学习_扩散模型

扩散模型原理 深入浅出扩散模型 一、概念简介 1、Denoising Diffusion Probalistic Models&#xff0c;DDPM 1.1 扩散模型运行原理 首先sample一个都是噪声的图片向量&#xff0c;这个向量的shape和要生成的图像大小相同。通过Denoise过程来一步一步有规律的滤去噪声。Den…

【第69课】Java安全JWT攻防Swagger自动化算法签名密匙Druid未授权

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…