组件
## 组件API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
StaticMeshComponent=CreateDefaultSubobject<UStaticMeshComponent>("AuraStaticMeshComponent"); SetRootComponent(StaticMeshComponent); SkeletalMeshComponent->SetupAttachment(父级);
SkeletalMeshComponent->RegisterComponent()
AddInstanceComponent(SkeletalMeshComponent);
FindComponentByClass() UMyCustomComponent* MyComponent = FindComponentByClass(MyActor, UMyCustomComponent::StaticClass());
就是组件你已经给定了变量来存储
|
SetVisibility(bool): 设置组件是否可见。传入true表示显示,false表示隐藏。
SetWorldLocation(FVector): 设置组件在世界空间中的位置。
SetWorldRotation(FRotator): 设置组件在世界空间中的旋转。
SetWorldScale3D(FVector): 设置组件在世界空间中的缩放比例。
AddLocalOffset(FVector, bool): 在组件的本地坐标系下添加一个偏移量。第二个参数决定是否更新组件的物理状态。
AddLocalRotation(FRotator, bool): 在组件的本地坐标系下添加一个旋转增量。第二个参数决定是否更新组件的物理状态。
SetRelativeLocation(FVector): 设置组件相对于其父组件的位置。
SetRelativeRotation(FRotator): 设置组件相对于其父组件的旋转。
SetCollisionEnabled(ECollisionEnabled::Type): 控制组件的碰撞检测模式,如禁用、查询或物理模拟。
SetCollisionProfileName(FName): 改变组件的碰撞配置文件,用于定义组件的碰撞行为。
AttachToComponent(UPrimitiveComponent, FAttachmentTransformRules, FName): 将当前组件附加到指定的父组件上,并可自定义附加规则(如是否保持相对位置、旋转等)。
DetachFromParent(bool): 从父组件上分离当前组件。如果参数为true,则保持当前位置和旋转;否则,重置到组件的初始变换。
SetSimulatePhysics(bool): 开启或关闭组件的物理模拟,使组件受到物理引擎的影响。
SetMaterial(int32, UMaterialInterface): 更改组件材质的某一索引处的材质。
GetOwner(): 获取组件所属的Actor。
1 2 3 4
| Myclass::构造函数 { myclass = CreateDefaultSubobject<USceneCo
|
加载静态网格体资源
1 2 3 4 5 6 7 8 9
| UPROPERTY(EditInstanceOnly, Category = "StaticMesh") UStaticMeshComponent* StaticMeshComponent;
static ConstructorHelpers::FObjectFinder<UStaticMesh>Cube(TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_Tube.Shape_Tube'")); StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("name")); StaticMeshComponent->SetupAttachment(RootComponent); StaticMeshComponent->SetStaticMesh(Cube.Object);
|
添加骨骼网格体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| USkeletalMesh*Skletamesh;
void construct(); void CreateMode();
void construct();{ Skletamesh=LoadObject<USkeletalMesh>(NULL,TEXT(CHAT)); }
void CreateMode(){ GetMesh()->设置旋转(); 0,-90,0 GetMesh()->设置位置(); 0,0,-100 GetMesh()->SetSkeletaMesh(Skletamesh); GetCapsuleComponent()->InitCapsuleSize(4.,100) }
|
获取玩家对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| APlayerController* PlayerController = UGameplayStatics::GetPlayerController(this, 0);
if (PlayerController) { APawn* Pawn = PlayerController->GetPawn(); if (Pawn) { UE_LOG(LogTemp, Warning, TEXT("PlayerController:%s, Pawn:%s"), *PlayerController->GetName(), *Pawn->GetName()); }else { UE_LOG(LogTemp, Warning, TEXT("PlayerController:%s, Pawn:NULL"), *PlayerController->GetName()); } } else { UE_LOG(LogTemp, Warning, TEXT("未能获取到 PlayerController")); }
|
类:UGameplayStatics
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| UGameplayStatics 是 Unreal Engine 中的一个静态类,提供了一些便捷的静态方法,帮助开发者在游戏中执行常见的操作,比如获取游戏实例、玩家控制器、播放声音、生成粒子效果等。它主要用于简化一些重复性操作,避免直接操作底层 API。
主要功能 以下是 UGameplayStatics 常见的一些功能:
获取玩家控制器:例如,UGameplayStatics::GetPlayerController 可以获取当前玩家的控制器。
获取玩家角色:还有一个方法 UGameplayStatics::GetPlayerPawn,可以直接获取到第一个玩家的角色(Pawn)。
生成对象:使用如 UGameplayStatics::SpawnActor 来在世界中生成新的对象(例如生成子弹或敌人)。
播放声音/音乐:可以通过 UGameplayStatics::PlaySoundAtLocation 播放指定位置的声音等。
蓝图与 C++ 的交互:UGameplayStatics 提供的方法可在蓝图中使用,方便设计师与程序员协作。
|
朝玩家移动
1 2
| APawn*PlayerPawn PlayerPawn=Pawn
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| if (PlayerPawn) { FVector PlayerLocation = PlayerPawn->GetActorLocation();
FVector NewLocation = FMath::VInterpTo(GetActorLocation(), PlayerLocation, DeltaTime, 2.0f); SetActorLocation(NewLocation); `FRotator NewRotation = (PlayerLocation - GetActorLocation()).Rotation(); SetActorRotation(NewRotation); }
|
在 Unreal Engine 中,有许多常用的类用于不同的游戏开发需求。以下是一些常见的重要类及其简要说明:
以下是将上述内容整理成表格的形式,以便更清晰地查看和比较这些Unreal Engine中常用的类及其简要说明:
| 类名 |
简要说明 |
| AActor |
所有游戏对象的基类,可以放置在关卡中。它是所有可以在世界中被实例化的对象的基础。 |
| APawn |
表示一个可控制的游戏实体,可以是玩家角色或 AI 角色。提供移动和控制的功能。 |
| ACharacter |
APawn 的子类,适用于需要复杂移动(如跳跃、滑行等)的角色。它通常用于玩家角色,并集成了动画组件。 |
| APlayerController |
代表玩家的控制器,用于处理玩家输入、相机控制和与游戏逻辑的交互。 |
| AGameMode |
定义游戏规则、胜利条件以及玩家生成的逻辑。一个关卡只能有一个游戏模式。 |
| AGameState |
用于保存游戏的状态信息,允许所有客户端(在网络游戏中)访问相同的游戏状态数据。 |
| APlayerState |
存储与个别玩家(及其状态)相关的信息,比如分数、生命值等。每个玩家控制器都有一个对应的 APlayerState 实例。 |
| UComponent |
所有组件类的基类,用于给 Actor 添加功能(如运动、碰撞、渲染等)。 |
| UStaticMeshComponent |
用于在世界中显示静态网格(3D 模型),通常用于表示环境中的物体。 |
| USkeletalMeshComponent |
用于显示具有骨骼动画的网格,通常用于角色模型,允许其执行动画。 |
| UCapsuleComponent |
通常用于角色的碰撞检测,帮助其处理地面、墙壁等显示和逻辑。 |
| UAnimInstance |
动画实例类,用于控制角色的动画状态和过渡,允许开发者实现复杂的动画逻辑。 |
| UBlueprint |
可视化脚本系统,用于实现游戏逻辑,无需编写代码。它可以代表任何 Actor 类型,允许设计师和程序员协作。 |
| UTexture2D |
用于处理 2D 纹理,常用于界面元素或游戏对象的外观。 |
| USoundBase |
一个音频资产的基类,所有音效和背景音乐都从这个类派生。 |
| UMaterial |
用于定义表面属性和视觉效果的类,包括颜色、纹理和光照等。 |
| AEnvironment |
环境类,允许在环境中引入动态光源和其他视觉效果。 |
| UPhysicsComponent |
用于处理物理效果的组件,可以用于模拟重力、碰撞和其他物理现象。 |
这个表格提供了Unreal Engine中一些常见和重要的类的快速概览,有助于理解这些类在游戏开发中的作用和关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 不一定非要将敌人数组放在游戏模式中,虽然游戏模式是一种常见的做法。根据你的游戏设计和需求,你可以选择以下几个比较适合的方案:
游戏模式(GameMode):
如果敌人在整个游戏的不同关卡中都是共享的,你可以将敌人数组放在游戏模式中。这是一个便于全球管理敌人的方式。 自定义关卡类(Level Script Actor):
如前所述,你可以创建一个自定义的关卡类(继承自 ALevelScriptActor),将敌人数组放在这个类中,这样你可以针对每个关卡进行特定的敌人管理。 敌人生成器(Spawner):
如果你有复杂的敌人生成逻辑,可以创建一个独立的敌人生成器类来管理敌人。这可以让敌人生成和管理更加模块化。 角色类(Character Class):
尽管不太常见,但如果你的角色需要跟特定的敌人进行交互或者影响,你可以在角色类中持有敌人数组。 全局单例或管理器:
如果你的游戏架构较为复杂,可以考虑使用单例模式或管理器类,它们可以在游戏中完成敌人的全局管理。 总结 虽然将敌人数组放在游戏模式是一个常见且有效的方案,但根据你的实际需求和游戏结构,你可以选择最适合你的方案。考虑到扩展性和代码组织,选择一个易于管理和维护的方法是很重要的。如果你有具体的场景或设计考虑,请告诉我,我可以提供更具体的建议!
|
遍历世界的物体
1 2 3 4 5 6 7
| TArray<AActor*> ActorsToFind; if(UWorld* World = GetWorld()) { UGameplayStatics::GetAllActorsOfClass(GetWorld(), AFireEffect::StaticClass(), ActorsToFind); } for (AActor* FireEffectActor: ActorsToFind)
|
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
#include "DemoCharacter.h" #include "Engine/LocalPlayer.h" #include "Camera/CameraComponent.h" #include "Components/CapsuleComponent.h" #include "GameFramework/CharacterMovementComponent.h" #include "GameFramework/SpringArmComponent.h" #include "GameFramework/Controller.h" #include "EnhancedInputComponent.h" #include "EnhancedInputSubsystems.h" #include "InputActionValue.h"
DEFINE_LOG_CATEGORY(LogTemplateCharacter);
ADemoCharacter::ADemoCharacter() { GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);
bUseControllerRotationPitch = false; bUseControllerRotationYaw = false; bUseControllerRotationRoll = false;
GetCharacterMovement()->bOrientRotationToMovement = true; GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f);
GetCharacterMovement()->JumpZVelocity = 700.f; GetCharacterMovement()->AirControl = 0.35f; GetCharacterMovement()->MaxWalkSpeed = 500.f; GetCharacterMovement()->MinAnalogWalkSpeed = 20.f; GetCharacterMovement()->BrakingDecelerationWalking = 2000.f; GetCharacterMovement()->BrakingDecelerationFalling = 1500.0f;
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom")); CameraBoom->SetupAttachment(RootComponent); CameraBoom->TargetArmLength = 400.0f; CameraBoom->bUsePawnControlRotation = true;
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera")); FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); FollowCamera->bUsePawnControlRotation = false;
}
void ADemoCharacter::BeginPlay() { Super::BeginPlay();
if (APlayerController* PlayerController = Cast<APlayerController>(Controller)) { if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer())) { Subsystem->AddMappingContext(DefaultMappingContext, 0); } } }
void ADemoCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent)) { EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ADemoCharacter::Move);
EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &ADemoCharacter::Look); } else { UE_LOG(LogTemplateCharacter, Error, TEXT("'%s' 找不到增强输入组件!此模板是建立在增强输入系统上。如果您打算使用传统系统,则需要更新此C++文件。"), *GetNameSafe(this)); } }
void ADemoCharacter::Move(const FInputActionValue& Value) { FVector2D MovementVector = Value.Get<FVector2D>();
if (Controller != nullptr) { const FRotator Rotation = Controller->GetControlRotation(); const FRotator YawRotation(0, Rotation.Yaw, 0);
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
AddMovementInput(ForwardDirection, MovementVector.Y); AddMovementInput(RightDirection, MovementVector.X); } }
void ADemoCharacter::Look(const FInputActionValue& Value) { FVector2D LookAxisVector = Value.Get<FVector2D>();
if (Controller != nullptr) { AddControllerYawInput(LookAxisVector.X); AddControllerPitchInput(LookAxisVector.Y); } }
|
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
#pragma once
#include "CoreMinimal.h" #include "GameFramework/Character.h" #include "Logging/LogMacros.h" #include "DemoCharacter.generated.h"
class USpringArmComponent; class UCameraComponent; class UInputMappingContext; class UInputAction; struct FInputActionValue;
DECLARE_LOG_CATEGORY_EXTERN(LogTemplateCharacter, Log, All);
UCLASS(config=Game) class ADemoCharacter : public ACharacter { GENERATED_BODY()
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) USpringArmComponent* CameraBoom;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) UCameraComponent* FollowCamera; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) UInputMappingContext* DefaultMappingContext;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) UInputAction* JumpAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) UInputAction* MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) UInputAction* LookAction;
public: ADemoCharacter(); protected:
void Move(const FInputActionValue& Value);
void Look(const FInputActionValue& Value);
protected: virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; virtual void BeginPlay();
public: FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; } FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; } };
|
类
玩家类
角色移动组件:Pawn
1 2
| AddMovementInput(FVector WorldDirection, float ScaleValue = 1.0f, bool bForce = false)
|
碰撞
碰撞检测与命中测试(Overlap and Hit Test)
使用方法:为玩家角色或其攻击组件添加一个碰撞体(如Sphere Collision或Capsule Component),并启用重叠事件(Overlap Events)或使用线性投射(Line Trace)进行命中测试。
实现细节:在蓝图中,可以设置OnComponentBeginOverlap或OnComponentEndOverlap事件处理函数来检测玩家与敌人的碰撞。如果是C++,则需要覆写相关组件的OnComponentBeginOverlap或OnActorBeginOverlap等函数。
2. 视线投射(Raycast)
使用方法:当玩家按下攻击键时,从玩家视角发出一条射线(Raycast),检测这条射线是否击中了敌人。
实现细节:可以使用蓝图中的Line Trace By Channel节点,或者在C++中使用UKismetSystemLibrary::LineTraceSingleForObjects函数。根据返回的结果判断是否击中敌人,并获取击中对象的信息。
3. 感知系统(Sense Component)
使用方法:为敌人添加感知组件(Senses Component),定义它们的感知范围和条件,然后在玩家身上添加相应的标签(Tags)。敌人通过感知组件检查范围内是否有带有特定标签的玩家。
实现细节:配置敌人蓝图中的感知组件(如AIPerceptionComponent),并在玩家蓝图中设置相应的感知标签。通过感知委托处理感知到玩家的逻辑。
4. 基于脚本的行为树(Behavior Tree)
使用方法:创建一个行为树,其中包含一个用于寻找玩家节点(Find Player Node),该节点利用上述的碰撞检测或视线投射机制来定位玩家。
实现细节:在UE编辑器中设计行为树,使用蓝图或C++编写具体逻辑。例如,可以使用BTTask_FindPlayer节点,并在成功找到玩家后触发其他行为,如追击或攻击。
5. 事件调度器(Event Dispatchers)
使用方法:利用UE5的事件系统,在玩家到达特定位置或满足特定条件时,触发一个全局或局部事件,敌人对象监听这个事件并作出反应。
实现细节:可以创建自定义事件,在玩家达到某些条件时广播该事件。敌人蓝图或代码中注册监听这些事件,并执行相应的逻辑来响应玩家的动作
变换向量
旋转
GetUnitDirection 获取一个位置到一个位置的旋转向量
目标相对位置=向前向量乘以距离+自身XYz位置
平均旋转=360除以箭头数量
箭头度数等于上一个箭头加上平均值
用户控件
当然,以下是 UWidget 类中部分 API 的用途翻译:
渲染变换相关
- GetRenderTransform: 获取小部件的渲染变换。
- SetRenderTransform: 设置小部件的渲染变换。
- SetRenderScale: 设置小部件的渲染缩放。
- SetRenderShear: 设置小部件的渲染剪切。
- SetRenderTransformAngle: 设置小部件的渲染旋转角度。
- GetRenderTransformAngle: 获取小部件的渲染旋转角度。
- SetRenderTranslation: 设置小部件的渲染平移。
- SetRenderTransformPivot: 设置小部件的渲染变换中心点。
- GetRenderTransformPivot: 获取小部件的渲染变换中心点。
流向方向偏好
- GetFlowDirectionPreference: 获取小部件的流向方向偏好。
- SetFlowDirectionPreference: 设置小部件的流向方向偏好。
启用状态
- GetIsEnabled: 获取小部件当前的启用状态。
- SetIsEnabled: 设置小部件当前的启用状态。
是否在视口中
- IsInViewport: 返回小部件是否已通过
AddToViewport 或 AddToPlayerScreen 添加到视口中。
提示文本
- GetToolTipText: 获取小部件的提示文本。
- SetToolTipText: 设置小部件的提示文本。
- GetToolTip: 获取小部件的自定义提示小部件。
- SetToolTip: 设置小部件的自定义提示小部件。
鼠标光标
- GetCursor: 获取小部件上的鼠标光标。
- SetCursor: 设置小部件上的鼠标光标。
- ResetCursor: 重置小部件上的鼠标光标,移除任何自定义设置。
渲染状态
- IsRendered: 返回小部件是否可见且渲染透明度大于 0。
- IsVisible: 返回小部件是否可见、命中测试不可见或自身命中测试不可见。
- GetVisibility: 获取小部件当前的可见性。
- SetVisibility: 设置小部件的可见性。
- SetVisibilityInternal: 内部方法,用于设置小部件的可见性。
这些 API 主要用于控制和获取小部件的各种属性和状态,以便在用户界面中进行动态调整和响应。
提供的文件 UserWidget.h 是 Unreal Engine 5.3 版本中的一个头文件,定义了 UUserWidget 类。这个类是 Unreal Engine 中用于创建用户界面(UI)的基础类,支持通过蓝图(Blueprint)进行扩展。
主要功能和特性:
- 继承关系:
UUserWidget 继承自 UWidget 和 INamedSlotInterface,提供了基本的 UI 功能和命名插槽接口。
- 生命周期方法:
OnInitialized:初始化时调用,仅在游戏运行时调用一次。
PreConstruct:构造前调用,适用于编辑器预览和运行时。
Construct:Slate 小部件构造后调用。
Destruct:Slate 小部件销毁时调用。
- 输入事件处理:
OnFocusReceived:获取焦点时调用。
OnFocusLost:失去焦点时调用。
OnAddedToFocusPath:添加到焦点路径时调用。
OnRemovedFromFocusPath:从焦点路径中移除时调用。
OnKeyChar:接收到字符输入时调用。
OnPreviewKeyDown:预览按键按下事件。
OnKeyDown:按键按下事件。
OnKeyUp:按键释放事件。
OnAnalogValueChanged:模拟值变化事件。
OnMouseButtonDown:鼠标按钮按下事件。
OnPreviewMouseButtonDown:预览鼠标按钮按下事件。
OnMouseButtonUp:鼠标按钮释放事件。
OnMouseMove:鼠标移动事件。
OnMouseEnter:鼠标进入小部件时调用。
OnMouseLeave:鼠标离开小部件时调用。
OnMouseWheel:鼠标滚轮事件。
- 其他方法:
AddToViewport:将小部件添加到视口中。
AddToPlayerScreen:将小部件添加到玩家屏幕。
SetPositionInViewport:设置小部件在视口中的位置。
SetDesiredSizeInViewport:设置小部件在视口中的大小。
SetAnchorsInViewport:设置小部件在视口中的锚点。
SetAlignmentInViewport:设置小部件在视口中的对齐方式。
SetVisibility:设置小部件的可见性。
SetPlayerContext:设置玩家上下文。
GetOwningLocalPlayer:获取拥有该小部件的本地玩家。
GetOwningPlayer:获取拥有该小部件的玩家控制器。
GetOwningPlayerPawn:获取拥有该小部件的玩家角色。
GetOwningPlayerState:获取拥有该小部件的玩家状态。
GetOwningPlayerCameraManager:获取拥有该小部件的玩家相机管理器。
枚举类型:
EWidgetTickFrequency:定义了小部件的更新频率。
EWidgetAnimationEvent:定义了动画事件类型。
EUMGSequencePlayMode:定义了 UMG 序列的播放模式。
EDesignPreviewSizeMode:定义了设计预览的尺寸模式。
结构体:
FAnimationEventBinding:用于管理动画事件绑定。
FPaintContext:用于绘制上下文。
FNamedSlotBinding:用于命名插槽绑定。
其他:
GetWorld:获取当前世界。
PostDuplicate:复制后调用。
BeginDestroy:开始销毁时调用。
PostLoad:加载后调用。
DuplicateAndInitializeFromWidgetTree:从小部件树中复制并初始化。
Initialize:初始化小部件。
GetDesiredTickFrequency:获取期望的更新频率。
GetWidgetTreeOwningClass:获取生成小部件树的蓝图类。
UpdateCanTick:更新是否可以更新。
这些功能和特性使得 UUserWidget 成为 Unreal Engine 中创建和管理用户界面的重要基础类。
绑定UI和动画
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 31 32 33 34 35 36 37 38
|
#pragma once
#include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "Components/SizeBox.h" #include "ItemBoxBase.generated.h"
UCLASS() class TESTDEMO_API UItemBoxBase : public UUserWidget { GENERATED_BODY() public:
virtual void NativePreConstruct() override; virtual void NativeConstruct() override;
UPROPERTY(BlueprintReadWrite,EditAnywhere,meta = (BindWidget)) USizeBox* sizebox;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animations") UWidgetAnimation* ShowAnimation;
UPROPERTY(BlueprintReadOnly, Transient, meta = (BindWidgetOptional) , meta = (BindWidgetAnim)) UWidgetAnimation* Fade; };
|
数据表格
1 2 3 4 5
| const FFairyItemStruct* Row = DataTable->FindRow<FFairyItemStruct>(RowName, ContextString);
DataTable->GetRowNames()
|
FTableRowBase 结构体
成员函数
virtual void OnPostDataImport(const UDataTable* InDataTable, const FName InRowName, TArray<FString>& OutCollectedImportProblems)
- 可以被子类重写;当数据表导入或重新导入时调用。
- 允许对初始读取的数据进行自定义修复、解析等操作。
- 参数:
InDataTable: 拥有此行的数据表。
InRowName: 要进行修复的行的名称。
OutCollectedImportProblems: 导入过程中累积的问题列表,可以通过此方法添加问题。
virtual void OnDataTableChanged(const UDataTable* InDataTable, const FName InRowName)
- 可以被子类重写;当拥有此行的数据表被修改时调用。
- 允许对用户更改进行自定义修复、解析等操作。
- 参数:
InDataTable: 拥有此行的数据表。
InRowName: 要进行修复的行的名称。
UDataTable 类
成员变量
TObjectPtr<UScriptStruct> RowStruct
- 数据表中每一行使用的结构体,必须继承自
FTableRowBase。
TMap<FName, uint8*> RowMap
uint8 bStripFromClientBuilds : 1
- 如果设置为
true,则不会将此数据表打包到客户端构建中。适用于只有服务器需要知道的敏感表。
uint8 bIgnoreExtraFields : 1
- 如果设置为
true,则在导入数据时忽略多余的字段。否则会发出警告。
uint8 bIgnoreMissingFields : 1
- 如果设置为
true,则在导入数据时忽略预期但缺失的字段。否则会发出警告。
FString ImportKeyField
- 导入数据中的显式键字段。如果为空,则使用 JSON 中的
Name 或 CSV 中的第一个字段作为键。
TObjectPtr<class UAssetImportData> AssetImportData
FOnDataTableChanged OnDataTableChangedDelegate
成员函数
virtual void AddRowInternal(FName RowName, uint8* RowDataPtr)
virtual void RemoveRowInternal(FName RowName)
const TMap<FName, uint8*>& GetRowMap() const
const UScriptStruct* GetRowStruct() const
virtual bool AllowDuplicateRowsOnImport() const
virtual void FinishDestroy()
virtual void Serialize(FStructuredArchiveRecord Record)
static void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector)
virtual void GetPreloadDependencies(TArray<UObject*>& OutDeps)
virtual void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize)
virtual bool NeedsLoadForClient() const
virtual bool NeedsLoadForEditorGame() const
void HandleDataTableChanged(FName ChangedRowName = NAME_None)
- 当数据表数据发生变化时调用此方法,触发
OnDataTableChanged 委托和每行回调。
template <class T> void GetAllRows(const TCHAR* ContextString, OUT TArray<T*>& OutRowArray) const
template <class T> T* FindRow(FName RowName, const TCHAR* ContextString, bool bWarnIfRowMissing = true) const
template <class T> void ForeachRow(const TCHAR* ContextString, TFunctionRef<void (const FName& Key, const T& Value)> Predicate) const
FProperty* FindTableProperty(const FName& PropertyName) const
uint8* FindRowUnchecked(FName RowName) const
virtual void EmptyTable()
virtual TArray<FName> GetRowNames() const
virtual void RemoveRow(FName RowName)
virtual void AddRow(FName RowName, const FTableRowBase& RowData)
virtual void CleanBeforeStructChange()
virtual void RestoreAfterStructChange()
FString GetTableAsString(const EDataTableExportFlags InDTExportFlags = EDataTableExportFlags::None) const
FString GetTableAsCSV(const EDataTableExportFlags InDTExportFlags = EDataTableExportFlags::None) const
FString GetTableAsJSON(const EDataTableExportFlags InDTExportFlags = EDataTableExportFlags::None) const
template<typename CharType = TCHAR> bool WriteTableAsJSON(const TSharedRef< TJsonWriter<CharType, TPrettyJsonPrintPolicy<CharType> > >& JsonWriter, const EDataTableExportFlags InDTExportFlags = EDataTableExportFlags::None) const
- 将整个数据表输出为 JSON 格式并写入 JSON 写入器。
template<typename CharType = TCHAR> bool WriteTableAsJSONObject(const TSharedRef< TJsonWriter<CharType, TPrettyJsonPrintPolicy<CharType> > >& JsonWriter, const EDataTableExportFlags InDTExportFlags = EDataTableExportFlags::None) const
- 将整个数据表输出为 JSON 对象并写入 JSON 写入器。
template<typename CharType = TCHAR> bool WriteRowAsJSON(const TSharedRef< TJsonWriter<CharType, TPrettyJsonPrintPolicy<CharType> > >& JsonWriter, const void* RowData, const EDataTableExportFlags InDTExportFlags = EDataTableExportFlags::None) const
- 将特定行的字段输出为 JSON 格式并写入 JSON 写入器。
bool CopyImportOptions(UDataTable* SourceTable)
TArray<FString> CreateTableFromCSVString(const FString& InString)
TArray<FString> CreateTableFromJSONString(const FString& InString)
TArray<FString> CreateTableFromOtherTable(const UDataTable* InTable)
TArray<FString> CreateTableFromRawData(TMap<FName, const uint8*>& DataMap, UScriptStruct* InRowStruct)
TArray<FString> GetColumnTitles() const
TArray<FString> GetUniqueColumnTitles() const
TArray< TArray<FString> > GetTableData(const EDataTableExportFlags InDTExportFlags = EDataTableExportFlags::None) const
void SaveStructData(FStructuredArchiveSlot Slot)
void LoadStructData(FStructuredArchiveSlot Slot)
void OnPostDataImported(OUT TArray<FString>& OutCollectedImportProblems)
- 当新数据导入数据表时调用,通知每个导入的行,并给行结构体一个操作导入数据的机会。
UScriptStruct& GetEmptyUsingStruct() const
FDataTableRowHandle 结构体
成员变量
成员函数
bool IsNull() const
template <class T> T* GetRow(const TCHAR* ContextString) const
template <class T> T* GetRow(const FString& ContextString) const
FString ToDebugString(bool bUseFullPath = false) const
bool operator==(FDataTableRowHandle const& Other) const
bool operator!=(FDataTableRowHandle const& Other) const
void PostSerialize(const FArchive& Ar)
FDataTableCategoryHandle 结构体
成员变量
成员函数
bool IsNull() const
template <class T> void GetRows(TArray<T*>& OutRows, const FString& ContextString) const
- 在数据表中搜索所有包含
RowContents 的行,并将它们添加到 OutRows 中。
bool operator==(FDataTableCategoryHandle const& Other) const
bool operator!=(FDataTableCategoryHandle const& Other) const