UE4C++如何在静态函数中SpawnActor-创新互联

最近在学习用C++复刻YouTube上的一个蓝图库存系统,其中在从背包中丢弃枪械,然后在世界中生成一个枪械Actor的时候遇到了问题,由于这个生成函数是在几个不同的类中复用的,YouTube原版的做法是把这个函数写在了GameState类里面,以实现随处调用,但我思考了一下觉得把它用C++写在UBlueprintFunctionLiberary子类里是一种更合适的做法。而问题也就在这时候出现,在UBlueprintFunctionLiberary子类中一般都是使用静态函数,这就导致如果按一般C++中SpawnActor的方法写会有错误

创新互联客户idc服务中心,提供简阳服务器托管、成都服务器、成都主机托管、成都双线服务器等业务的一站式服务。通过各地的服务中心,我们向成都用户提供优质廉价的产品以及开放、透明、稳定、高性价比的服务,资深网络工程师在机房提供7*24小时标准级技术保障。
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元起,快前往官网查看详情吧


文章名称:UE4C++如何在静态函数中SpawnActor-创新互联
分享路径:http://ybzwz.com/article/dpisic.html