最近在学习用C++复刻YouTube上的一个蓝图库存系统,其中在从背包中丢弃枪械,然后在世界中生成一个枪械Actor的时候遇到了问题,由于这个生成函数是在几个不同的类中复用的,YouTube原版的做法是把这个函数写在了GameState
类里面,以实现随处调用,但我思考了一下觉得把它用C++写在UBlueprintFunctionLiberary
子类里是一种更合适的做法。而问题也就在这时候出现,在UBlueprintFunctionLiberary
子类中一般都是使用静态函数,这就导致如果按一般C++中SpawnActor的方法写会有错误
GetWorld()->SpawnActor(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
第一次写,主要用于个人记录,语言啰嗦,有大佬看到请见谅
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧