1. 项目概述:为什么RE-UE4SS是UE游戏模组开发的“瑞士军刀”?
如果你玩过基于虚幻引擎4(Unreal Engine 4)开发的PC游戏,比如《赛博朋克2077》、《艾尔登法环》或者最近大火的《幻兽帕鲁》,并且对游戏内置的功能感到不满足,或者想创造一些全新的玩法,那么你很可能已经听说过“UE4SS”或者“RE-UE4SS”这个名字。这玩意儿在游戏模组(Mod)圈子里,尤其是那些深度定制玩法的硬核玩家和开发者中,几乎是人手必备的神器。简单来说, RE-UE4SS是一个功能极其强大的运行时脚本注入与修改系统 ,它允许你在游戏运行时,动态地加载和执行自定义的Lua脚本,从而实现对游戏逻辑、界面、数据乃至内存的深度干预。
这听起来可能有点技术化,我打个比方:原版游戏就像一台出厂设置的电视机,你只能看固定的频道。而RE-UE4SS则像是一台被“越狱”了的智能电视,你不仅可以安装各种第三方应用(脚本),还能直接修改电视的系统固件(游戏底层逻辑),实现画中画、自定义UI、甚至播放原本不支持格式的视频。在《幻兽帕鲁》里,有人用它来修改帕鲁的刷新率、调整建造限制、甚至创造全新的交互指令,这些都是原版游戏不具备的功能。
它的核心价值在于“运行时”和“无源码”。传统游戏模组开发往往需要反编译游戏、理解其复杂的C++代码结构,门槛极高。而RE-UE4SS通过注入技术,在游戏进程内部搭建了一个安全的“沙盒”环境。你只需要用相对简单的Lua语言编写脚本,就能调用游戏内部成千上万个现成的函数和对象,极大地降低了模组开发的门槛,将创造力从繁琐的技术细节中解放出来。因此,无论是想给自己心爱的游戏添加一个物品栏搜索功能,还是想彻底改变一个游戏系统的运作方式,RE-UE4SS都提供了那条最直接、最强大的路径。
2. 核心原理与架构拆解:RE-UE4SS如何“无痛”修改游戏?
在深入实操之前,我们必须先搞懂RE-UE4SS到底是怎么工作的。知其然更要知其所以然,这能帮助你在后续遇到各种诡异问题时,快速定位根源,而不是盲目地试错。
2.1 核心机制:DLL注入与虚幻引擎UObject反射系统
RE-UE4SS的运作建立在两大技术基石之上: DLL注入 和 虚幻引擎的UObject反射系统 。
首先,是 DLL注入 。游戏本身是一个独立的可执行程序(.exe)。RE-UE4SS本身是一个动态链接库文件(.dll)。通过一些外部工具(如注入器),我们在游戏启动时或运行中,将这个RE-UE4SS的dll文件“注入”到游戏进程的内存空间里。一旦注入成功,RE-UE4SS的代码就成为了游戏进程的一部分,拥有了和游戏原生代码同等级别的内存访问权限。这是所有后续操作的前提。
注意 :DLL注入本身是一个中性技术,广泛用于调试、性能分析等领域。但请注意,在多人联机游戏中使用此类技术可能违反游戏用户协议,导致封号。请务必仅用于单人游戏或已明确允许模组的私人服务器。
其次,也是最关键的一环: 利用虚幻引擎的反射系统 。虚幻引擎有一个强大的特性,就是为其大部分C++类、函数、属性和结构体生成了完整的“反射”数据。你可以把它想象成游戏所有代码的一份“地图”或“字典”。这份“地图”在游戏运行时存在于内存中,详细记录了每个类的名字、它有哪些成员函数、函数的参数类型和内存地址、有哪些属性等等。
RE-UE4SS的核心魔法就在于,它能在注入后, 扫描并解析这份“反射地图” 。解析完成后,它会生成一个Lua环境,并将这份“地图”映射到Lua中。这意味着,你在Lua脚本里,可以直接通过类名、函数名来调用游戏内部的C++函数,或者读取、修改游戏对象的属性,就像在调用Lua自己的函数一样自然。你不再需要去猜测某个功能对应的内存地址,也不需要去写复杂的机器码,反射系统为你提供了一条安全的“高速公路”。
2.2 RE-UE4SS与原始UE4SS的差异:稳定性与功能的飞跃
你可能会问,既然有UE4SS,为什么又出来一个RE-UE4SS?这里的“RE”通常可以理解为“Refactored”(重构版)或“Revised”(修订版)。原始UE4SS项目在早期为社区打开了大门,但其代码结构和稳定性存在一定问题,对较新版本的虚幻引擎游戏支持不佳,崩溃和兼容性问题频发。
RE-UE4SS则是一次彻底的重写和增强。它的主要改进包括:
- 更健壮的反射信息收集 :采用了更稳定、更全面的模式来扫描游戏内存,能更好地适配不同版本、不同打包方式的UE4游戏,减少了因游戏更新导致模组失效的情况。
- 增强的Lua API :提供了更多、更易用的Lua函数,用于与游戏世界交互,例如更便捷地查找游戏中的Actor(演员,即游戏内实体)、生成物体、监听游戏事件等。
- 改进的Mod管理 :支持更好的Mod热重载(修改脚本后无需重启游戏)、依赖管理以及配置系统。
- 社区与维护 :通常有一个更活跃的维护团队,能更快地响应新游戏或新引擎版本的适配需求。
因此,对于新接触的玩家和开发者, 我强烈建议直接从RE-UE4SS开始 ,它能为你省去大量在原始版本上折腾和排错的时间。
3. 环境准备与安装部署:5步搭建你的模组实验室
理论讲完,我们进入实战环节。我将以《幻兽帕鲁》这款近期热门的UE4游戏为例,演示RE-UE4SS的完整安装流程。这个流程具有普适性,稍作调整即可用于其他UE4游戏。
3.1 第一步:获取游戏根目录与确认版本
首先,找到你的游戏安装位置。以Steam平台为例,在游戏库中右键点击《幻兽帕鲁》,选择“管理” -> “浏览本地文件”。打开的文件夹就是游戏的根目录(例如
X:\Steam\steamapps\common\Palworld
)。
接着,我们需要确认游戏使用的虚幻引擎版本。一个简单的方法是查看根目录下是否有
\Pal\Binaries\Win64\
文件夹,里面会有游戏的主程序(如
Palworld-Win64-Shipping.exe
)。更准确的方法是,你可以搜索或查阅社区资料,对于《幻兽帕鲁》,它使用的是UE4.27版本。知道引擎版本有助于你在寻找特定Mod或排查问题时更有针对性。
3.2 第二步:下载与解压RE-UE4SS
前往RE-UE4SS的官方发布页面(如GitHub Releases)。下载最新稳定版本的压缩包(通常是
RE-UE4SS-x.x.x.zip
)。请务必从官方或可信渠道下载,以避免安全风险。
将下载的ZIP文件解压。你会得到一个包含若干文件和文件夹的包,其核心结构通常如下:
RE-UE4SS/
├── dxgi.dll / xinput*.dll (注入入口文件,不同版本名称可能不同)
├── UE4SS.dll (核心模块)
├── Mods/ (存放你的Lua脚本的文件夹)
├── Settings/ (配置文件目录)
└── ... (其他依赖文件)
3.3 第三步:部署文件到游戏目录
这是最关键的一步,但操作很简单:
将解压后的RE-UE4SS文件夹内的所有内容,复制到游戏的根目录
。也就是和
Palworld-Win64-Shipping.exe
同一个层级的目录下。
当系统提示“目标已包含同名文件”时,选择“替换目标中的文件”。这是因为RE-UE4SS需要将其dll文件放在这里,以便被游戏加载或通过注入器识别。
3.4 第四步:配置基础设置(首次运行)
首次运行游戏前,建议先检查配置文件。进入
Settings
文件夹,用文本编辑器(如Notepad++或VSCode)打开
mods.txt
或
main.ini
(取决于版本)。
你需要关注几个关键配置:
-
脚本加载路径
:确保
Mods目录的路径设置正确,通常默认就是./Mods。 -
控制台快捷键
:很多RE-UE4SS版本内置了一个Lua控制台,默认快捷键可能是
~(波浪键)或F10。在游戏中按这个键可以打开一个命令行窗口,直接执行Lua代码,用于调试非常方便。你可以在配置文件中修改这个快捷键。 -
日志级别
:如果遇到问题,可以将日志级别调到
Debug或Trace,这样会输出更详细的信息到日志文件(通常在Logs文件夹),便于排查。
对于初次使用,大部分默认配置即可工作。保存配置文件。
3.5 第五步:启动游戏与验证安装
现在,像往常一样通过Steam启动《幻兽帕鲁》。如果安装成功,你可能会在游戏启动时的命令行窗口(如果游戏有)或者游戏过程中,看到RE-UE4SS相关的加载信息一闪而过。
最直接的验证方法是:
- 进入游戏世界。
-
按下之前配置的控制台快捷键(例如
~)。 - 如果屏幕上弹出一个可以输入文字的控制台窗口,那么恭喜你,RE-UE4SS已经成功注入并运行了!
此时,
Mods
文件夹就是你的“脚本仓库”。任何你放入其中的、符合规范的Lua脚本(
.lua
文件),都会在游戏下次启动时(或支持热重载时)自动加载。
4. 核心脚本编写实战:从“Hello World”到功能Mod
环境搭好了,我们来真正写点东西。我将通过三个由浅入深的例子,带你掌握RE-UE4SS脚本开发的核心。
4.1 示例一:日志输出与游戏内通知——你的第一个脚本
在
Mods
文件夹下,新建一个文本文件,将其重命名为
MyFirstMod.lua
。用编辑器打开,输入以下代码:
-- MyFirstMod.lua
-- 这是一个简单的RE-UE4SS Mod示例
local function Initialize()
-- 1. 输出到RE-UE4SS的日志文件,用于后台调试
Log.Info("[MyFirstMod] 模组加载成功!")
-- 2. 在游戏屏幕中央显示一个持续5秒的提示信息
-- 这是与玩家交互最直接的方式之一
RegisterHook("PostBeginPlay", function()
Utilities.ShowHUDMessage("RE-UE4SS 模组已激活!", 5.0) -- 消息内容,显示时长(秒)
end)
-- 3. 我们还可以尝试获取玩家角色并打印其名称(如果可能)
RegisterHook("Tick", function(DeltaTime)
-- 注意:在PostBeginPlay之后,游戏世界才稳定,这里只是示例hook位置
-- 实际获取玩家对象的代码会更复杂,需要先找到本地玩家控制器
end)
end
-- 将初始化函数注册到Mod初始化事件
RegisterInitFunction(Initialize)
代码解析与实操要点 :
-
Log.Info:这是调试的基石。所有信息会写入Logs目录下的文件。养成关键步骤打日志的习惯,出问题时能救命。 -
RegisterHook:这是RE-UE4SS的灵魂函数之一。它允许你在游戏的特定事件发生时插入自己的代码。"PostBeginPlay"事件发生在游戏世界初始化完成后,是执行很多初始化操作的理想位置。"Tick"事件每帧都会触发,用于需要持续运行的逻辑,但要小心性能。 -
Utilities.ShowHUDMessage:一个非常实用的API,用于在游戏内显示提示,给玩家直接的反馈。 -
RegisterInitFunction:告诉RE-UE4SS,当这个Mod加载时,请执行我指定的Initialize函数。
保存文件,重启游戏(或如果支持热重载则按配置键重载Mod)。进入游戏后,你应该能在屏幕上方看到“RE-UE4SS 模组已激活!”的提示,并且在日志文件中找到对应的记录。
4.2 示例二:与游戏世界交互——获取并修改玩家属性
现在我们来点更实际的:找到游戏中的玩家角色,并修改其某个属性。我们以“无限耐力”这个经典需求为例。
-- InfiniteStamina.lua
local PlayerController = nil
local PlayerCharacter = nil
local OriginalStaminaConsume = nil
local function FindLocalPlayer()
-- 尝试获取本地玩家控制器,这是获取玩家角色的起点
local World = GetWorld()
if not World then return end
local LocalPlayer = World:GetFirstLocalPlayerFromController()
if not LocalPlayer then return end
PlayerController = LocalPlayer:GetPlayerController()
if PlayerController then
PlayerCharacter = PlayerController:GetPawn()
if PlayerCharacter then
Log.Info("[无限耐力] 找到玩家角色: " .. tostring(PlayerCharacter:GetName()))
-- 假设耐力消耗函数是 PlayerCharacter:ConsumeStamina(Amount)
-- 我们通过Hook来拦截这个调用
OriginalStaminaConsume = RegisterHook(PlayerCharacter.ConsumeStamina, function(self, Amount)
Log.Debug("[无限耐力] 尝试消耗耐力: " .. tostring(Amount))
-- 直接返回,不执行原函数,或者将消耗量改为0
-- 这里我们选择不执行原函数,实现“无限”
return 0 -- 或者直接 return,取决于函数原型
end)
end
end
end
local function Initialize()
Log.Info("[无限耐力] 模组初始化")
-- 由于玩家对象可能在游戏加载后稍晚才创建,我们延迟一点执行查找
RegisterHook("PostBeginPlay", function()
Utilities.DelayExecute(2.0, FindLocalPlayer) -- 延迟2秒执行
end)
end
RegisterInitFunction(Initialize)
核心难点与技巧 :
-
对象查找链
:在虚幻引擎中,通常遵循
World -> LocalPlayer -> PlayerController -> Pawn/Character这条链来获取当前控制的角色。这个链因游戏而异,需要一些探索。 -
函数Hook
:
RegisterHook不仅可以Hook事件名,还可以直接Hook一个具体的函数地址或函数对象。这行代码RegisterHook(PlayerCharacter.ConsumeStamina, ...)就是一个例子。它拦截了角色的ConsumeStamina函数调用,允许我们修改其行为(比如让消耗量归零)。 -
延迟执行
:
Utilities.DelayExecute非常有用。因为游戏世界的初始化是异步的,在PostBeginPlay时,玩家角色可能还未被创建完成。延迟几秒再执行查找逻辑,能大大提高成功率。 -
假设与探索
:示例中的
ConsumeStamina函数名是我假设的。 真实情况中,你需要自己去发现这个函数叫什么 。如何发现?这就要用到RE-UE4SS的另一个强大工具: 对象浏览器和反射信息输出 。很多RE-UE4SS版本内置了命令,可以在控制台输入DumpObjects或DumpFunctions之类的命令,将当前游戏中的所有类、函数列表输出到日志文件,然后你再用文本编辑器搜索“stamina”、“energy”等关键词来定位。
4.3 示例三:创建游戏内菜单与交互界面
一个成熟的Mod往往需要一个图形界面(GUI)来让玩家配置选项。RE-UE4SS可以通过ImGui库来创建原生的游戏内叠加菜单。
-- CoolModMenu.lua
local bShowMenu = false
local SomeValue = 50.0
local bToggleFeature = true
local function DrawMenu()
if not bShowMenu then return end
-- 开始一个ImGui窗口
if ImGui.Begin("我的酷炫模组设置", bShowMenu) then
-- 添加一个文本标签
ImGui.Text("欢迎使用本模组!")
-- 添加一个滑动条
SomeValue, _ = ImGui.SliderFloat("强度设置", SomeValue, 0.0, 100.0)
-- 添加一个复选框
bToggleFeature, _ = ImGui.Checkbox("启用超级跳", bToggleFeature)
-- 添加一个按钮
if ImGui.Button("应用设置") then
Log.Info(string.format("设置已应用:强度=%.1f, 超级跳=%s", SomeValue, tostring(bToggleFeature)))
-- 这里调用实际修改游戏逻辑的函数
ApplySettings(SomeValue, bToggleFeature)
end
ImGui.SameLine() -- 让下一个按钮和上一个在同一行
if ImGui.Button("关闭菜单") then
bShowMenu = false
end
end
ImGui.End()
end
local function ApplySettings(value, toggle)
-- 根据菜单设置,实际修改游戏行为
if toggle then
-- 启用超级跳的逻辑,例如修改重力或跳跃速度
-- Hook玩家角色的跳跃函数,或者修改其移动组件属性
else
-- 恢复原状
end
-- 根据value调整其他效果...
end
local function Initialize()
Log.Info("[酷炫菜单] 模组加载")
-- 注册一个每帧执行的Hook来绘制菜单
RegisterHook("PostRender", DrawMenu)
-- 绑定一个快捷键来开关菜单,例如F5
RegisterKeyBind("F5", function()
bShowMenu = not bShowMenu
Log.Info("菜单显示状态: " .. tostring(bShowMenu))
end)
end
RegisterInitFunction(Initialize)
GUI开发要点 :
-
ImGui库 :RE-UE4SS通常集成了ImGui,这是一个非常轻量级的即时模式GUI库。ImGui.Begin/ImGui.End创建一个窗口,中间调用各种ImGui.Widget(如SliderFloat,Checkbox,Button)来添加控件。 -
渲染时机
:
"PostRender"事件在游戏每帧绘制完成后触发,是绘制叠加UI的理想位置。 -
键位绑定
:
RegisterKeyBind让你可以轻松地将自定义功能绑定到键盘按键上,极大增强了Mod的交互性。 -
状态管理
:菜单的显示/隐藏状态(
bShowMenu)、配置值(SomeValue)都需要用Lua变量保存起来。
通过这三个例子,你已经走过了从输出调试信息、到与游戏核心逻辑交互、再到创建用户界面的完整路径。这构成了绝大多数功能性Mod的基础骨架。
5. 高级技巧与深度调试:从能用走向好用
掌握了基础开发后,要让你的Mod更稳定、更强大,还需要一些高级技巧和调试手段。
5.1 利用反射信息进行精准定位
当你不知道某个功能对应的类名或函数名时,反射信息是你的雷达。除了前面提到的控制台命令,你还可以在脚本中动态查询。
-- 打印某个对象的所有属性和函数(示例)
local player = GetLocalPlayerPawn()
if player then
for property in player:GetClass():GetProperties() do
Log.Info("属性: " .. property:GetName())
end
for func in player:GetClass():GetFunctions() do
Log.Info("函数: " .. func:GetName())
end
end
更高效的做法是,将反射信息输出到文件,然后用专业的文本编辑器(支持正则表达式搜索)进行分析。寻找关键词如“Health”、“Damage”、“Speed”、“Inventory”、“Item”等。
5.2 错误处理与脚本稳定性
Lua脚本如果抛出未捕获的错误,可能导致整个RE-UE4SS环境不稳定甚至游戏崩溃。良好的错误处理至关重要。
local function SafeGameFunctionCall()
local success, result = pcall(function()
-- 这里放置可能出错的游戏函数调用
local riskyValue = SomeGameObject:SomeUnstableFunction()
return riskyValue
end)
if not success then
Log.Error("调用游戏函数失败: " .. tostring(result))
-- 提供降级方案或安全值
return nil
else
return result
end
end
-- 在Tick等高频Hook中尤其要注意
RegisterHook("Tick", function(DeltaTime)
pcall(function()
-- 将所有可能出错的代码包在pcall里
if someCondition then
DoSomething()
end
end)
end)
使用
pcall
(protected call)来包裹任何可能失败的操作,特别是那些涉及调用未知游戏API的操作。
5.3 性能优化:别让你的Mod成为卡顿之源
脚本运行在游戏主线程,低效的代码会直接导致游戏掉帧。
-
避免在
Tick中做繁重操作 :Tick每帧调用(每秒60或更高次)。不要在里边进行复杂的循环、大量的日志输出或频繁的对象查找。 - 使用缓存 :对于需要频繁访问但又不常变化的数据,如玩家角色指针、游戏世界对象,找到后将其保存在局部变量中复用,而不是每次都重新查找。
- 减少不必要的Hook :只注册你真正需要的事件Hook。不用的Hook及时注销(如果API支持)。
- 延迟与节流 :对于非即时性的操作,使用计时器或帧计数器来降低执行频率。
local cachedPlayer = nil
local findPlayerCooldown = 0
RegisterHook("Tick", function(DeltaTime)
findPlayerCooldown = findPlayerCooldown - DeltaTime
if findPlayerCooldown <= 0 then
findPlayerCooldown = 5.0 -- 每5秒尝试查找一次玩家,而不是每帧
cachedPlayer = FindLocalPlayerSafely()
end
-- 使用缓存的玩家进行其他操作
if cachedPlayer then
-- ... 每帧都需要执行的轻量级逻辑
end
end)
5.4 社区资源与逆向工程工具
一个人的力量是有限的。活跃的模组社区(如GitHub、Discord群组、NexusMods论坛)是宝库。在那里你可以:
- 找到现成的脚本参考 :很多作者会开源他们的Mod,这是最好的学习材料。
- 获取游戏特定的偏移量和签名 :对于新游戏,社区大神通常会率先找到关键函数的内存签名(Sig),你可以直接使用,免去自己逆向的麻烦。
- 使用专业工具辅助 :虽然RE-UE4SS很强,但像Unreal Engine SDK Dumper、IDA Pro、Cheat Engine这样的专业逆向工具,在分析复杂的游戏结构、寻找虚函数表(vftable)时仍然是不可或缺的。它们可以帮助你更精确地定位RE-UE4SS需要Hook的地址。
6. 常见问题排查与实战心得
即使按照教程操作,你也一定会遇到各种问题。下面是我在长期使用中总结的“排坑指南”。
6.1 问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 游戏启动崩溃或闪退 |
1. RE-UE4SS版本与游戏不兼容。
2. DLL文件被游戏反作弊系统拦截。 3. 与其他Mod(如ReShade、其他注入器)冲突。 |
1. 检查RE-UE4SS的发布说明,确认支持你的游戏版本。尝试更旧或更新的版本。
2. 确认游戏是否运行在反作弊环境(如EAC)。单人游戏通常可禁用反作弊启动(如Steam启动项加
-NoAntiCheat
,
需确认游戏支持
)。
3. 移除所有其他第三方Mod/插件,仅保留RE-UE4SS进行测试。 |
控制台(
~
)按了没反应
|
1. 快捷键被占用或未正确设置。
2. RE-UE4SS未成功注入。 3. 游戏以管理员权限运行,而注入器没有。 |
1. 检查
Settings
中的控制台快捷键配置,尝试改为其他键(如
F1
,
Insert
)。
2. 查看游戏根目录下
Logs
文件夹中的RE-UE4SS日志文件,看是否有错误信息。
3. 尝试以管理员身份运行游戏启动器。 |
| Mod脚本不执行 |
1. 脚本文件未放在正确的
Mods
文件夹。
2. 脚本有语法错误导致加载失败。 3. Mod依赖的特定游戏事件未触发。 |
1. 确认脚本
.lua
文件在
游戏根目录\Mods\
下。
2. 查看日志文件,通常会有Lua语法错误的详细报告。 3. 在脚本开头加
Log.Info(“脚本开始加载”)
测试,确认脚本是否被加载。检查Hook的事件名是否正确。
|
| 游戏功能异常或性能下降 |
1. 脚本逻辑错误,陷入死循环或高频操作。
2. Hook了不稳定的游戏函数。 3. 内存泄漏(Lua中较少见,但错误使用全局变量可能导致)。 |
1. 禁用所有Mod,逐个启用,定位问题脚本。在
Tick
Hook中加入帧计数器,限制操作频率。
2. 使用
pcall
保护所有游戏API调用。检查日志中的错误信息。
3. 避免在全局作用域创建大型表或函数,确保局部化。 |
| 更新游戏后Mod全部失效 | 游戏更新导致内存布局和函数地址发生变化,RE-UE4SS的签名扫描失效。 |
1. 等待RE-UE4SS作者更新适配新游戏版本。
2. 在社区寻找针对新版本的游戏签名(Sig)并手动更新配置文件中的签名部分(高级操作)。 |
6.2 个人实战心得与建议
-
日志是你的第一道防线 :遇到任何问题, 第一时间打开
Logs目录 。RE-UE4SS和你的脚本输出的错误信息、警告都在这里。学会阅读日志,能解决90%的配置和脚本错误。 -
从简到繁,逐步测试 :不要一开始就写一个几百行的复杂Mod。从一个能成功打印
“Hello World”的脚本开始,然后增加一个简单的Hook,再尝试调用一个游戏函数。每步都测试,确保上一步是稳定的。 -
备份!备份!备份! :在安装任何Mod(包括RE-UE4SS本身)前,备份你的游戏存档。对于重要的脚本,也定期备份。一次错误的Hook可能导致存档损坏。
-
理解“时机”的重要性 :虚幻引擎对象的生命周期非常关键。在游戏世界完全加载前(
PostBeginPlay之前),很多对象是nullptr(空指针)。你的脚本必须等待正确的时机再去获取和操作它们。大量Mod失效都是因为“抢跑”。 -
加入社区 :无论是Discord、GitHub Issues还是专门的模组论坛,遇到解决不了的问题时,去搜索或提问。描述清楚你的问题、游戏版本、RE-UE4SS版本、已做的排查和日志中的关键错误信息,你会更容易得到帮助。
-
保持敬畏,安全第一 :虽然RE-UE4SS功能强大,但请勿将其用于破坏他人游戏体验(尤其是在联机环境中)、制作作弊工具盈利或进行任何违法活动。技术的乐趣在于创造和探索,而不是破坏。

700

被折叠的 条评论
为什么被折叠?



