最近在学习用C++复刻YouTube上的一个蓝图库存系统,其中在从背包中丢弃枪械,然后在世界中生成一个枪械Actor的时候遇到了问题,由于这个生成函数是在几个不同的类中复用的,YouTube原版的做法是把这个函数写在了GameState类里面,以实现随处调用,但我思考了一下觉得把它用C++写在UBlueprintFunctionLiberary子类里是一种更合适的做法。而问题也就在这时候出现,在UBlueprintFunctionLiberary子类中一般都是使用静态函数,这就导致如果按一般C++中SpawnActor的方法写会有错误
GetWorld()->SpawnActor<AActor>(Params...)
在静态函数中使用GetWorld()操作非静态成员变量会报错call to non-static member function without an object argument,所以我们需要其他方法来SpawnActor,而这个方法就是UGamePlayStatic类中的BeginDeferredActorSpawnFromClass()函数以及FinishSpawningActor()函数,以我在上述内容中需要设计的函数为例,使用如下
.h
static AActor* SpawnActorFromItemObject(UItemObject* ItemObject, AActor* OriginLocationActor);
.cpp
AActor* UHelperFunctionLibrary::SpawnActorFromItemObject(UItemObject* ItemObject, AActor* OriginLocationActor)
{
if (ItemObject && OriginLocationActor)
{
FVector SpawnLocation = OriginLocationActor->GetActorLocation() + OriginLocationActor->GetActorForwardVector() * 150;
FTransform SpawnTransform(FRotator::ZeroRotator, SpawnLocation);
//该函数向世界中注册一个新Actor但不执行Actor的初始化
AActor* Actor = UGameplayStatics::BeginDeferredActorSpawnFromClass(OriginLocationActor->GetWorld(), ItemObject->ItemClass, SpawnTransform, ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn);
return UGameplayStatics::FinishSpawningActor(Actor, SpawnTransform);//该函数完成Actor的初始化
}
return nullptr;
}
这样就可以实现通过静态函数在世界中SpawnActor
第一次写,主要用于个人记录,语言啰嗦,有大佬看到请见谅
文章介绍了在UE4的C++代码中,如何在静态函数内正确调用SpawnActor来生成Actor。由于静态函数无法访问非静态成员,作者利用UGameplayStatics的BeginDeferredActorSpawnFromClass和FinishSpawningActor两个函数来解决这个问题。具体实现包括获取世界引用,设置SpawnTransform,并在静态函数中完成Actor的延迟生成和初始化。
3697

被折叠的 条评论
为什么被折叠?



