找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6|回复: 0

[原创]UObjcet & UClass基础(八)— Q&A(不定期更新)

[复制链接]

371

主题

13

回帖

1273

积分

管理员

积分
1273
发表于 2026-5-28 09:30:40 | 显示全部楼层 |阅读模式
A:一般人都会回用来描述 UObject 对象;那我是一般人么?我会给你娓娓道来
要回答这个问题,首先我们要搞懂 "对象" 和 "类" 的区别。类描述的是一种数据类型,它定义了一组属性(数据成员)和行为(成员函数);而对象则是类的具体实例,它是根据类的定义在内存中分配的实体。我们看以下 C++ 示例:
class MyClass {public:    int value;};int main() {    MyClass* MyObj = new MyClass();    MyObj->value = 10086;    delete MyObj;    return 0;}
MyObj 是根据 MyClass 类创建的一个实例对象。C++ 有个缺点,就是无法做到对象自省(传说中的反射)。什么意思呢?拿到 MyObj 对象,我无法知道它有哪些属性、哪些方法(断点不算,因为调试器可以访问程序的符号表和调试信息)。UE 采用的也是 C++,但是它却能实现对象自省,代码如下:
UCLASS(BlueprintType, Blueprintable)class UMyObject : public UObject{        GENERATED_BODY()public:        UPROPERTY(BlueprintReadWrite)        int32 value= 0;};void UFunctionLibrary::CreateObject(UObject* Outer){        auto MyObj = NewObject<UMyObject>(Outer, UMyObject::StaticClass());        MyObj->value = 10086;        GetAllPropertyValues(MyObj);}void UFunctionLibrary::GetAllPropertyValues(UObject* Object){    UClass* ObjectClass = Object->GetClass();    for (TFieldIterator<UProperty> PropertyIterator(ObjectClass);          PropertyIterator; ++PropertyIterator)    {        UProperty* Property = *PropertyIterator;        FString PropertyValue = Property->GetName();        FString PropertyValue;        //整形变量        else if (UIntProperty* IntProperty = Cast<UIntProperty>(Property))        {            int32 Value = IntProperty->GetPropertyValue_InContainer(Object);            PropertyValue = FString::FromInt(Value);        }        //处理其他类型的属性        //......        UE_LOG(LogTemp, Log, TEXT("%s,%s"), *PropertyName, *PropertyValue);    }}
UE 创建对象用的不是 new 关键字,而是 NewObject 方法。MyObj 对象的类型是 UMyObject ,同时还有个伴随对象用于实现对象自省;这个伴随对象存放在 UMyObject 类的变量内,伴随对象的类型就是大名鼎鼎的 UClass(获取 UClass 对象请参考:GetClass 和 StaticClass)。UClass 主要就是为了实现虚幻引擎中的反射(又名类型系统)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|联系我们

GMT+8, 2026-6-13 20:08 , Processed in 0.073257 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表