[Reframework教程] 认识游戏单例对象
Pre

此对象非彼对象~ 在详细讲解对象前,请确保你在大学本科已经学完了最基础的面向对象编程知识,否则可能不太好理解下面的内容~

老规矩,还是先放一下索引贴的反向链接 REF教程索引

这一章暂时不涉及REManagedObject、RETypeDefinition相关的使用方法,仅对最基本的概念进行说明~如果你已经了解了单例和TypeDefine的概念,这章完全可以不看~

开发模式?

首先先说一下,单例是什么?单例就是全局唯一的对象,这个对象有且只有唯一地址,通常在游戏生命周期中不会被销毁,可以随时访问。而对应的则是非单例对象,在游戏生命周期中可能会被多次创建和销毁,每次地址都有可能不一致,Reframework所做的就是把对象的指针暴露给你,方便你进行修改,因此对于单例对象和非单例对象的捕捉方法是完全不一样的思想

那么在开始找到对象入口前,你需要先点击下DeveloperTools按钮,并会稍微卡一下,等待Reframework捕获对象。

我们需要用到的就是ObjectExplorer。

在ObjectExplorer中,有两个主要功能是常用的,第一个就是Singletons,这里是以树形结构存储游戏中所有能访问的`单例对象` ,以及下方的搜索框

找到你想要的单例对象

展开Singletons后会发现下面有非常多的单例对象管理器,可能绝大多数在数据修改方面都用不太到,这里我提供几个常用的对象和大致内容,其他内容还请自行探索:

  1. app.ChatManager 信息管理器。游戏的弹窗提示信息以及聊天信息等等都在这里,可以用于向用户发送信息
  2. app.EnemyManager 怪物管理器。顾名思义,游戏中的怪物对象均在此进行管理,例如怪物尺寸、血量等等数据。需要单独说的就是鱼类、环境生物也是怪物哦~
  3. app.GUIManager UI管理器。如果你要对UI进行修改或者想利用UI显示一些东西则可以通过这个模块实现
  4. app.PlayerManager 玩家管理器。最核心的app.HunterCharacter就保存在这里。
  5. app.SaveDataManager 存储管理器。如果你想修改金币、道具箱、道具袋、装备箱等等物品或资源数据,那么就在这里找就好了,存档数据都在这里
  6. app.VariousDataManager 杂项数据。字面翻译是这样的,但是这个管理器可非常的重要!装备数据、道具数据、技能数据等等的数值定义都保存在这个管理器中!

如果你的对象是以单例存储的,那么你就可以通过sdk.get_native_singleton(name)的方式来找到这个数据的位置,例如我希望找到游戏中的技能数据并修改,那么我就会从app.VariousDataManager中去获取它。平时你可以多多浏览这几个Singletons来熟悉数据的保存位置,从单例获取对象可比使用Hook捕获稳定多了~

method? Field?

当你打开任何一个对象,你一定会疑惑它存在好几个不同的内容,这些都是干什么的捏?

这里我简单说一下纯新手用不到的几个功能:

  1. Owner:对象所有者,一般是说这个对象所处的命名空间
  2. ChildComponents,我也没太搞懂,个人理解是与其相关的实例对象,但应该不是继承关系
  3. Pre和NextComponent,相邻地址空间的实例对象--基本用不到
  4. app.xxxxxx这个类实例本身(与标题名称一致),你需要用到的对象都在这里
  5. ace.GEAlements 这个类的父类,一般都位于最后一个位置,有时候会非常有用。

OK,那么在这个类下方能够看到几个信息

  1. Type Information,不熟悉类对象定义的话不用管
  2. Reflection Properties:该对象中所包含的实例,一般都会被映射到Fields并以别名显示,也不用管。
  3. TBD Methods: 列出该类下所有可以使用的方法。重点!!!
  4. TBD Fields: 以别名存储的类对象。重点!!

TBD Methods

这里面包括了该类所暴露的接口函数,如果你的功能能够使用接口函数获取,那么请尽量不要直接修改Fields。例如我在抓取游戏的技能时,就是使用各个函数去实现,并非直接去扫描fields:

这样的访问会更安全,能够规避掉当某个对象修改后导致其他需要跟随修改的内容没有被修改进而闪退的问题。

TBD Fields

可以简单理解为这个对象中所包含的实例元素,你可以通过查看Fields来确定它都包含哪些数据和方法,并进一步进行修改。以获取_Settings这个别名对象为例,在Reframework中这三种方式都是等效的:

  1. self.VariousDataManager:get_Setting() [最安全]
  2. self.VariousDataManager:get_Field("_Setting")
  3. self.VariousDataManager._Setting

他们捕获的都是这个对象

你可以右键点击_Setting,通过Copy Name的方法来粘贴别名。并通过get_Field或直接使用方法c来获取对象。

有时候你会发现某个Field会显示为 no pointer ,这说明对应的内容还没有被创建,对于这种Field的捕获请千万小心,我会在后面生命周期那一章中进行详细讲解

对于应该怎么确定你想修改的功能位置,我的建议是~多看别人的代码~看看各位大佬是怎么通过单例类获取到对应内容的~【不过他们大概率不会用单例啊哈哈哈哈哈哈,我自己觉得单例还是最安全的方式】

当然,你也可以通过多去尝试阅读结构来猜测和验证对应的内容,相对还比较好理解~

by Tweister 发布于 2025-04-20
若有附件,打赏后可直接下载 赠人玫瑰 手留余香
默认
最新


1