|
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 主要就是为了实现虚幻引擎中的反射(又名类型系统)
|