
目录一常用成员函数UObjectAActorUActorComponentUClass二实际应用一常用成员函数// 全局函数 bool IsValid(const UObject* InObject); // 检查UObject指针是否有效且未被标记为待销毁 bool IsValidChecked(const UObject* InObject)// 检查UObject指针是否有效无效会断言 template typename T T* GetValid(T* Test) // 获取UObject指针的有效性有效返回原指针无效则为nullptrUObject// UObjectBase 定义的成员函数 UObject* GetOuter() const; //获取对象的逻辑父级如Actor的Outer是LevelLevel的Outer是World FName GetFName() const; //获取对象的 FName 标识符轻量级索引用于比较和哈希查找性能极高O(1) UClass* GetClass() const; //获取对象的 UClass 常用于类型判断、动态创建 EObjectFlags GetFlags() const; //获取对象标志EObjectFlags UPackage* GetExternalPackage() const; //获取对象的外部包// UObjectBaseUtility 定义的成员函数 template typename T bool IsA() const; //检查对象是否属于某类或其子类MyActor-IsAAPawn() FString GetName() const {GetFName().ToString()}; //获取对象的 FString 名称用于输出或显示 FString GetFullName() const; //获取对象的完整名称包含类型前缀和路径Blueprint/Game/MyBlueprint.MyBlueprint FString GetPathName() const; //获取对象的路径名称不包含类型前缀/Game/MyBlueprint.MyBlueprint template typename T T* GetTypedOuter() const; //向上查找指定类型的 Outer 对象 UPackage* GetPackage() const; //获取对象所在的 Package包包是资源的逻辑容器如 /Game/MyFolder void SetFlags(EObjectFlags Flags); //设置对象标志EObjectFlags void ClearFlags(EObjectFlags Flags); //清除对象标志EObjectFlags bool HasAnyFlags(EObjectFlags Flags) const; //检查对象是否拥有某些标志 bool HasAllFlags(EObjectFlags Flags) const; //检查对象是否拥有某些标志 bool IsRooted() const; //查对象是否被标记为“根”RF_RootSet如是则不被垃圾回收 void AddToRoot(); //将对象添加到 GC 根集防止被回收 void RemoveFromRoot(); //将对象 GC 根集移除 void MarkAsGarbage(); //将对象标记为“垃圾”在下次 GC 时被回收// UObject 定义的成员函数 templateclass T T* CreateDefaultSubobject(FName SubobjectName, bool bTransient false); //创建默认子对象 UObject* GetDefaultSubobjectByName(FName ToFind); //查找附加的默认子对象 UFunction* FindFunction( FName InName ) const; //查找指定函数UClass::FindFunctionByName() virtual void ProcessEvent( UFunction* Function, void* Parms ); //执行一个 UFunction动态调用函数用于蓝图通信、RPC、反射调用等核心场景AActor// AActor 定义的成员函数 UWorld* GetWorld() const override; // 获取对象所在的 World世界避免在构造函数中调用此时 World 可能尚未初始化 ULevel* GetLevel() const; // 获取对象所在的 Level关卡 AActor* GetOwner() const; // 获取对象的拥有者Owner例如组件的 Owner 是挂载它的 Actor virtual void BeginPlay(); virtual void Tick( float DeltaSeconds ); virtual void EndPlay(const EEndPlayReason::Type EndPlayReason); virtual void EnableInput(class APlayerController* PlayerController); // 开启玩家输入 virtual void DisableInput(class APlayerController* PlayerController); // 禁用玩家输入 USceneComponent* GetRootComponent() const; // 获取 Actor 的根组件 bool SetRootComponent(USceneComponent* NewRootComponent); // 设置 Actor 的根组件 UActorComponent* GetComponentByClass(TSubclassOfUActorComponent ComponentClass) const; // 获取特定类型组件 void GetAttachedActors(TArrayAActor* OutActors) const; // 获取所有挂载的子 Actor bool ActorHasTag(FName Tag) const; // 检查 Actor 是否拥有指定标签AActor有成员TArray属性Tags FVector GetActorForwardVector() const; FVector GetActorUpVector() const; FVector GetActorRightVector() const; FVector GetActorLocation() const; void SetActorLocation(const FVector NewLocation);// 控制器会接收其关联Pawn事件的通知以让控制器针对该事件实现对应的行为 // AController抽象类 定义的成员函数 bool IsPlayerController() const; // 检查该控制器是否为 APlayerController 的实例 TObjectPtrAPawn GetPawn() const // 获取当前被此 Controller 控制的 Pawn ACharacter* GetCharacter() const; // 获取当前被控制的 Character virtual void Possess(APawn* InPawn) final; // 让此 Controller 控制一个 Pawn virtual void UnPossess() final; // 让此 Controller 放弃控制当前 Pawn template class T T* GetPlayerState() const // 获取控制器的玩家状态PlayerState void SetPlayerState(APlayerState* InPlayerState); // 设置控制器的玩家状态通常由 GameMode 调用 virtual FRotator GetControlRotation() const; // 获取控制器旋转值 virtual void SetControlRotation(const FRotator NewRotation); // 设置控制器旋转值 virtual AActor* GetViewTarget() const; // 获取控制器正在查看的Actor virtual void GetPlayerViewPoint( FVector Location, FRotator Rotation ) const; // 获取玩家视点 // APlayerController 定义的成员函数负责处理输入、控制 Pawn、管理视角等 AHUD* GetHUD() const; // 获取玩家的 HUD 实例 void GetViewportSize(int32 SizeX, int32 SizeY) const; // 获取HUD大小 virtual void SetViewTarget(class AActor* NewViewTarget); // 设置玩家的观察目标切换视角 virtual void SetViewTarget(class AActor* NewViewTarget); // 设置观察目标 virtual void SetViewTargetWithBlend(class AActor* NewViewTarget); // 平滑过渡设置观察目标 virtual void SetInputMode(const FInputModeDataBase InData); //设置输入模式控制输入是仅作用于游戏、仅作用于UI还是同时作用于两者 virtual void AddPitchInput(float Val); // 添加一个俯仰输入 virtual void AddYawInput(float Val); // 添加一个偏航输入 virtual void AddRollInput(float Val); // 添加一个翻滚输入 FVector GetSpawnLocation() const // 获取玩家的 Pawn 的起始位置 virtual FVector GetFocalLocation() const; // 获取玩家控制器当前位置 virtual bool InputKey(const FInputKeyEventArgs Params); // 处理输入按键 bool IsInputKeyDown(FKey Key) const; // 判断指定按键是否被按下 virtual void SetupInputComponent(); // 设置玩家的输入绑定 bool GetMousePosition(float X, float Y) const; // 获取鼠标位置坐标 void SetMouseLocation( const int X, const int Y ); // 设置鼠标位置 void SetMouseCursorWidget(EMouseCursor::Type Cursor, UPARAM(Required) class UUserWidget* CursorWidget); // 将自定义的 UMG Widget 设置为鼠标光标 // 光标下根据Trace Channel/Object Type进行碰撞检测 bool GetHitResultUnderCursorByChannel(ETraceTypeQuery TraceChannel, bool bTraceComplex, FHitResult HitResult) const; bool GetHitResultUnderCursorForObjects(const TArrayTEnumAsByteEObjectTypeQuery ObjectTypes, bool bTraceComplex, FHitResult HitResult) const; // 将屏幕坐标转换为世界坐标射线检测/ 将世界坐标转换为屏幕坐标 bool DeprojectScreenPositionToWorld(float ScreenX, float ScreenY, FVector WorldLocation, FVector WorldDirection) const; bool ProjectWorldLocationToScreen(FVector WorldLocation, FVector2D ScreenLocation, bool bPlayerViewportRelative false) const;// APawn 定义的成员函数 virtual bool IsPawnControlled() const; // 检查Pawn能否被任何 Controller控制替代IsControlled() virtual bool IsPlayerControlled() const; // 检查Pawn是否被人类玩家即一个 PlayerController所控制 virtual bool IsBotControlled() const; // 检查Pawn是否被AI即一个 AIController所控制 AController* GetController() const; // 获取当前控制此 Pawn 的 Controller class APlayerState* GetPlayerState() const; // 获取Pawn的玩家状态如果存在 FRotator GetControlRotation() const; // 获取控制Pawn的 Controller 的旋转值 virtual FRotator GetBaseAimRotation() const; // 获取 Pawn 用于“瞄准”的基础旋转通常用于射击等; virtual void AddControllerPitchInput(float Val); // 添加一个控制器的俯仰Pitch输入 virtual void AddControllerYawInput(float Val); // 添加一个控制器的偏航Yaw输入 virtual void AddControllerRollInput(float Val); // 添加一个控制器的翻滚Roll输入 class UPawnMovementComponent* GetMovementComponent() const; // 获取 Pawn 的运动组件 virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) // 设置输入绑定由PlayerController的CreatePlayerInputComponent()调用 // ACharacter 定义的成员函数 USkeletalMeshComponent* GetMesh() const // 获取角色的骨骼网格体组件 USkeletalMeshComponent UCharacterMovementComponent* GetCharacterMovement() const; // 获取角色运动组件更具体 UCapsuleComponent* GetCapsuleComponent() const // 获取角色的胶囊体组件CapsuleComponent UAnimMontage* GetCurrentMontage() const; float PlayAnimMontage(class UAnimMontage* AnimMontage, float InPlayRate 1.f, FName StartSectionName NAME_None); virtual void StopAnimMontage(class UAnimMontage* AnimMontage nullptr); bool CanJump() const; virtual void Jump(); virtual void StopJumping(); bool IsCrouched() const; virtual void Crouch(bool bClientSimulation false); virtual void Falling() virtual void Landed(const FHitResult Hit);UActorComponent// UActorComponent 定义的成员函数 virtual UWorld* GetWorld() const override final; // 通过其 Owner 获取世界仅当组件已注册时有效否则可能返回 nullptr AActor* GetOwner() const; // 获取拥有此组件的 Actor ULevel* GetComponentLevel() const; // 获取该组件所属的 ULevel virtual void BeginPlay(); // 由拥有者BeginPlay调用或拥有者的BeginPlay已经调用且创建该组件时调用 UFUNCTION(BlueprintImplementableEvent, meta(DisplayName Begin Play)) void ReceiveBeginPlay(); // 组件调用BeginPlay时执行该蓝图事件所属Actor的BeginPlay前调用 virtual void EndPlay(const EEndPlayReason::Type EndPlayReason); UFUNCTION(BlueprintImplementableEvent, meta(Keywords delete, DisplayName End Play)) void ReceiveEndPlay(EEndPlayReason::Type EndPlayReason); virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction);// USceneComponent 定义的成员函数 UFUNCTION(BlueprintCallable, CategoryRendering) virtual bool IsVisible() const; // 组件是否可见 bool IsAttachedTo(const USceneComponent* InParent) const; // 检查组件是否已挂载到某个父级 void SetupAttachment(USceneComponent* InParent); // 构造函数中设置父组件 const TArrayTObjectPtrUSceneComponent GetAttachChildren() const; // 获取附加此组件的子组件 void GetParentComponents(TArrayUSceneComponent* Parents) const; // 获取所有父组件包括根组件 USceneComponent* GetAttachParent() const; // 获取父组件 FName GetAttachSocketName() const; // 获取附加的Socket TArrayFName GetAllSocketNames() const; // 获取组件所有的Socket名称 FVector GetForwardVector() const; FVector GetUpVector() const; FVector GetRightVector() const; FVector GetComponentLocation() const; // 获取组件在世界空间中的位置 FRotator GetComponentRotation() const; // 获取组件在世界空间中的旋转 FVector GetComponentScale() const; // 获取组件在世界空间中的缩放 FTransform GetComponentTransform() const; // 获取组件在世界空间中的完整变换 void SetWorldLocation(const FVector NewLocation); // 设置组件的世界空间位置 void SetWorldRotation(const FRotator NewRotation); // 设置组件的世界空间旋转 void SetWorldScale3D(const FVector NewScale); // 设置组件的世界空间缩放 void SetWorldTransform(const FTransform NewTransform); // 设置组件的世界空间变换 void AddLocalOffset(const FVector Delta); // 在局部空间偏移组件位置 void AddWorldOffset(const FVector Delta); // 在世界空间中偏移组件位置 void AddLocalRotation(const FRotator Delta); // 在局部空间旋转组件 void AddWorldRotation(const FRotator Delta); // 在世界空间中旋转组件 FVector GetRelativeLocation() const; // 获取组件的相对位置相对于父级 FRotator GetRelativeRotation() const; // 获取组件的相对旋转相对于父级 FVector GetRelativeScale3D() const; // 获取组件的相对缩放相对于父级 void SetRelativeLocation(const FVector NewLocation); // 设置组件的相对位置 void SetRelativeRotation(const FRotator NewRotation); // 设置组件的相对旋转 void SetRelativeScale3D(const FVector NewScale); // 设置组件的相对缩放UClass// UStruct 定义的成员函数 bool IsChildOf(const UClass* OtherClass) const; // 判断该类是否继承自 OtherClass FProperty* FindPropertyByName(FName InName) const; // 按名称查找属性 UStruct* GetSuperStruct() const // 获取父结构体 virtual void SetSuperStruct(UStruct* NewSuperStruct); // 设置当前 UStruct 的父结构体指针 FTopLevelAssetPath GetStructPathName() const; // 获取结构体完整路径名// UClass 定义的成员函数 UClass* GetSuperClass() const; // 获取类的父类 FName GetDefaultObjectName() const; // 获取CDO名称 FTopLevelAssetPath GetClassPathName() const // 获取完整路径名 UFunction* FindFunctionByName(FName InName) const; // 按名称查找函数 virtual bool HasProperty(const FProperty* InProperty) const; // 检查给定的 FProperty 是否属于该类或父类的属性 UObject* GetDefaultObject(bool bCreateIfNeeded true) const; // 获取类的默认对象CDO UObject* GetDefaultSubobjectByName(FName ToFind); // 通过名字查找默认子对象 void GetDefaultObjectSubobjects(TArrayUObject* OutDefaultSubobjects); // 获取所有默认子对象 EClassFlags GetClassFlags() const // 获取该类的标签 bool HasAnyClassFlags( EClassFlags FlagsToCheck ) const // 检查该类是否拥有指定的任意一个标签 bool HasAllClassFlags( EClassFlags FlagsToCheck ) const // 检查该类是否拥有指定的所有标签 virtual bool IsFunctionImplementedInScript(FName InFunctionName) const; // 检查指定的函数是否在蓝图中被重写仅对蓝图生成的类有效 bool ImplementsInterface(const class UClass* SomeInterface) const; // 检查当前类是否实现了指定的接口类都是同步阻塞加载加载完成前游戏主线程会被卡住// ConstructorHelpers包含UE专门用设计于在构造内通过资源路径来同步加载并获取UObject资源如网格、材质、蓝图类等的辅助工具结构体 // 是一种构造时硬性引用当包含此引用的对象如AMyActor被加载到内存时它所引用的资源如Cube网格也会被一同强制加载进内存 // 通常声明为static仅首次构造时查找并加载后续构造将复用已加载的对象 // 可右击资产选择Copy Reference来获取路径对FObjectFinder可直接使用对FClassFinder末尾需加上 _C 后缀 namespace ConstructorHelpers { templateclass T // 加载任何继承自 UObject 的对象资源通过 .Object 访问 struct FObjectFinder { T* Object; FObjectFinder(const TCHAR* ObjectToFind, uint32 LoadFlags LOAD_None) { CheckIfIsInConstructor(ObjectToFind); // 检查是否在构造函数中如不是触发断言或错误 Object LoadObjectT(nullptr, ObjectToFind, nullptr, LoadFlags); } bool Succeeded() const { return Object ! nullptr; } }; templateclass T // 专门用于加载蓝图类的 UClass 对象通过 .Class 访问T为指定蓝图类的父类 struct FClassFinder { UClass* Class; FClassFinder(const TCHAR* ClassToFind) { CheckIfIsInConstructor(ClassToFind); Class LoadObjectUClass(nullptr, ClassToFind); } bool Succeeded() const { return Class ! nullptr; } }; // ... 其他辅助结构体 }// 运行时Runtime动态加载资源函数 template class T // 用于加载任何继承自 UObject 的具体资源Outer通常传入 nullptr 即可 inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filenamenullptr, uint32 LoadFlagsLOAD_None, UPackageMap* Sandboxnullptr ); templateclass T // 专门用于加载类尤其是蓝图类路径需包含 _C 后缀 UClass* LoadClass( UObject* Outer, const TCHAR* Name, const TCHAR* Filenamenullptr, uint32 LoadFlagsLOAD_None, UPackageMap* Sandboxnullptr );二实际应用// CreateDefaultSubobject是UEC中一个非常核心的函数专门用于在构造函数中为Actor或Object创建默认子对象也就是组件必须是UActorComponent及其子类; // 在构造阶段为对象创建子对象并让引擎正确地管理它包括反射、序列化、以及在蓝图编辑器中可见等; // 注只能在类的构造函数中调用; UStaticMeshComponent* MeshComponent CreateDefaultSubobjectUStaticMeshComponent(TEXT(MyMeshComponent)); UChildActorComponent* ChildComp CreateDefaultSubobjectUChildActorComponent(TEXT(Test)); ChildComp-SetChildActorClass(AMyChildActor::StaticClass());//设置根组件并附加子组件RootComponent是AActor类事先定义好的变量提供变换能力 RootComponent MeshComponent ChildComp-SetupAttachment(RootComponent);// 静态加载资源 static ConstructorHelpers::FObjectFinderUStaticMesh TempStaticMesh(TEXT(/Engine/BasicShapes/Cube.Cube)); myCube-SetStaticMesh(TempStaticMesh.Object); static ConstructorHelpers::FClassFinderAActor TempActorClass(TEXT(/Game/BP_TEST.BP_TEST_C)); myActor-SetChildActorClass(TempActorClass.Class);// 游戏运行时动态创建 Actor FTransform Trans; FActorSpawnParameters SpawnParams; SpawnParams.Name TEXT(MySpawnActor); //内部名不是显示标签 UClass* LoadedClass LoadClassAActor(nullptr, TEXT(/Game/BP_TEST.BP_TEST_C)); AActor* NewActor GetWorld()-SpawnActorAActor(LoadedClass, Trans, SpawnParams); if (NewActor) { NewActor-SetActorLabel(TEXT(MySpawnActorLabel)); //显示标签 UE_LOG(LogTemp, Log, TEXT(%s), *NewActor-GetName()); }// 在该C类的子蓝图中指定要生成的蓝图类 UPROPERTY(EditDefaultsOnly, Category Spawning) TSubclassOfAActor MySpawnActor; AActor* NewActor GetWorld()-SpawnActorAActor(MySpawnActor, Trans, SpawnParams);// TSubclassOfT 存储指定类型T的UClass指针类似智能指针类型安全的容器 // 会在编译时及运行时类型检查限制类型的继承链只能是T或T的子类仅UObject体系IsChildOf(T::StaticClass()) // 必须使用UPROPERTY()避免GC回收局部变量可不使用 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category Pawn) TSubclassOfAActor ActorClass; TSubclassOfAPawn PawnClass ActorClass; //编译时检查 PawnClass AActor::StaticClass()//运行时检查 // SpawnActor中ActorClass会隐式转换为UClass* AActor* SpawnedActor World-SpawnActorAActor(ActorClass, SpawnLocation, SpawnRotation); // UE提供的运行时类型安全转换仅用于UObject体系 AActor* CDO CastAActor(ActorClass-GetDefaultObject());