UE4C++ 如何在静态函数中SpawnActor

文章介绍了在UE4的C++代码中,如何在静态函数内正确调用SpawnActor来生成Actor。由于静态函数无法访问非静态成员,作者利用UGameplayStatics的BeginDeferredActorSpawnFromClass和FinishSpawningActor两个函数来解决这个问题。具体实现包括获取世界引用,设置SpawnTransform,并在静态函数中完成Actor的延迟生成和初始化。

最近在学习用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
第一次写,主要用于个人记录,语言啰嗦,有大佬看到请见谅

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值