三、初识反射与数据挖掘

三、初识反射与数据挖掘

一、初识反射

  • 何为反射反射是指在运行状态下,任意一个实体类都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能称为语言的反射。可以简单看看如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Object
{
public:
virtual string ToString() = 0;
};
class ClassA :public Object
{
public:
virtual string ToString(){ return "MyClass"; }
};
class ClassB :public Object
{
public:
virtual string ToString(){ return "MyClass"; }
};
Object* FactoryCreat(const string& className)
{
if (className == "ClassA")
return new ClassA;
else if (className == "ClassB")
return new ClassB;
...
}
int main()
{
Object* obj = FactoryCreat("ClassA");
cout << obj->ToString();
delete obj;
return 0;
}
  • 原生的C++是并不支持反射的的,因此UE引擎构建了一个自己的反射系统。那么为什么要做那么一个反射?最直接的例子就是UE蓝图。蓝图是一类特殊的asset,可以使用直观、基于节点的方式创建逻辑,或者设置一些变量数据。策划可以创建自定义的Actor、Event、函数等等,快速的做Gameplay迭代,不需要写任何代码。蓝图也可以选择继承C++类,获取C++中定义的变量,调用C++中定义的函数,或者实现C++中定义的event

document_image_rId4

U3D也存在反射,效果就是将脚本绑定到对象后,面板上会出现你这个脚本的类名和属性。

document_image_rId5

document_image_rId6

document_image_rId7

document_image_rId8

  • 使用反射

写一个简单的反射工具,遍历对象下面的类有哪些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class UObject
{
/** virtual function table */
void* vtf;
/** Flags used to track and report various object states. This needs to be 8 byte aligned on 32-bit
platforms to reduce memory waste */
EObjectFlags ObjectFlags;
/** Index into GObjectArray...very private. */
int32 InternalIndex; //表明该对象在GObjectArray中的第几个
/** Class the object belongs to. */
UClass* ClassPrivate; //对象所属的基类
/** Name of this object */
FName NamePrivate; //类名
/** Object this object resides in. */
UObject* OuterPrivate; //这个对象是从哪个对象来的
}

document_image_rId9

二、数据挖掘

  • 基本数据
1
2
3
4
5
6
7
8
数组:Uworld -> ULevel -> Actor
鼠标:Uworld -> GameInstance -> LocalPlayer -> PlayerController -> TargetViewRotation
相机坐标:Uworld -> GameInstance -> LocalPlayer ->LocalPosition
本人:Uworld -> GameInstance -> LocalPlayer -> PlayerController -> AcknowledgedPawn
坐标:本人 -> RootComponent
骨骼:本人 -> MeshComponent
运动:本人 -> MovementComponent(高跳,重力,三个方向速度,1
名字:本人 -> PlayerState -> PlayerName(PlayerNamePrivate)
  • 其他数据:
1
2
3
4
5
6
7
8
骨骼名:骨骼 -> SkeletalMesh(访问骨骼)
全局加速:本人 -> CustomTimeDilation
地图高亮:Uworld -> GameInstance -> LocalPlayer -> PlayerController -> CameraManager
灵魂出窍:xxxxxx
穿墙:E8 ?? ?? ?? ?? 85 ?? 75 ?? 0F ?? ?? ?? ?? ?? ?? ?? EB(E8 ? ? ? ? 80 67 32 FD)改JE(原理)
高跳:xxxxxxx(运动).....
静默自瞄:xxxxx(CameraManager)
无后座:xxxxx