1.TSubclassOf模板
TSubclassOf<T> subclass , 值存储某个类的子类类型不存储具体的对象
1.类型安全只接受T类型和T类型的子类类型
2.可以用于蓝图选择子类,使用UPROPERTY()宏可以将TSubclassOf暴露给蓝图
3.在C++和蓝图中都可以使用
4.TSubclassOf它就是封装的UClass的指针,当某个函数需要的参数是UClass*是可以使用TSubclassOf进行传递,
2.定时器
1.立即触发的定时器--语法 -- 这个定时器只执行一次,立即触发,不需要手动清除
cpp
GetWorld()->GetTimerManager().SetTimerForNextTick(类指针, &类作用域::执行函数);
例如GetWorld()->GetTimerManager().SetTimerForNextTick(this, &AMyActor::MyFunction);
2.可以循环触发的定时器--语法 -- 需要定时器句柄
cpp
句柄定义 FTimerHandle handle;
cpp
定时器实现
GetWorldTimerManager().SetTimer(handle, &class::function, 5.0f, true);
void SetTimer(
FTimerHandle& InOutHandle, // 定时器句柄
UObject* Object, // 目标对象
FName FunctionName, // 要执行的函数名
float Time, // 触发时间(秒)
bool bLooping = false, // 是否循环
float InitialStartDelay = 0.0f // 初始延迟(可选)
);
3.定时器绑定处理函数的方式
3.1直接绑定,需要使用UFUNCTION()宏 , 支持蓝图调用 , 函数不能有参数
cpp
// 头文件
FTimerHandle Handle;
UFUNCTION()
void function();
// 源文件
GetWorldTimerManager().SetTimer(Handle, this , &class::function, 5.0f, true);
3.2使用lambda表达式 , 不需要宏,不支持蓝图调用 , 函数可以有参数
cpp
1.直接使用lambda
GetWorld()->GetTimerManager().SetTimer(TimerHandle,
[this](参数1 ,参数2 ...)
{
UE_LOG(LogTemp, Warning, TEXT("Lambda 定时器触发!"));
},
2.0f, true
);
2.使用FTimerDelegate
FTimerDelegate TimerDel = FTimerDelegate::CreateLambda([this, 参数1, 参数2 ,...]()
{
UE_LOG(LogTemp, Warning, TEXT("RandomLocation %s"), *RandomLocation.ToString());
}
);
GetWorldTimerManager().SetTimer(SpawnTimerHandle, TimerDel, 5.0f, true);
3.SpawnActor
cpp
AActor* UWorld::SpawnActor
(
UClass* Class, // 生成的类的类型
FVector const* Location, // 生成的位置
FRotator const* Rotation, // 生成的旋转
FActorSpawnParameters Params // 生成的参数
)
struct FActorSpawnParameters
{
UObject* Owner; // Actor的所有者
AActor* Instigator; // 产生该Actor的源,例如攻击者
TSubclassOf<AActor> OverrideLevel; // 如果需要,指定Actor的特定级别(Level)
UWorld* OverrideWorld; // 如果需要,指定Actor生成的特定世界(World)
FName Name; // Actor的名称
TArray<UActorComponent*> ComponentsToInitialize; // 生成后需要初始化的组件
bool bNoCollisionFail; // 如果为True,即使发生碰撞,也不会失败
bool bDeferConstruction; // 如果为True,生成的Actor将会推迟构造,直到显式调用FinishSpawning()
bool bAllowDuringConstructionScript; // 是否允许在构造脚本中生成Actor
bool bHideFromSceneOutliner; // 如果为True,生成的Actor将不会出现在场景大纲中
bool bTemporary; // 是否生成临时Actor,通常用于仅在运行时存在的对象
bool bTransient; // 是否是临时的,不会保留在序列化中
bool bNoFail; // 如果为True,生成Actor时不会因错误失败
ESpawnActorCollisionHandlingMethod SpawnCollisionHandlingOverride; // 碰撞处理方式:如忽略、阻塞等
FTransform SpawnTransform; // 生成时Actor的位置、旋转和缩放
};
// 模板是想要生成的类的类型,类的指针 ,生成位置,旋转 ,生成参数
GetWorld()->SpawnActor<classtype>(UClass, Location, Rotation , Params);
//例如 我想生成AActor
头文件定义
TSubclassOf<AActor> subclassof;
GetWorld()->SpawnActor<AActor>(subclassof, Location, Rotation , Params);
4.SetStaticMesh
给生成的AActor设置静态网格体
cpp
// 参数是静态网格体的指针
UStaticMeshComponent::SetStaticMesh(UStaticMesh* staticmesh)