c++ 从类数组UE5生成执行元

yhuiod9q  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(174)

我正在尝试使用SpawnActor()从一个类数组中生成随机演员。我已经使用UE4/UE 5蓝图好几年了,但这是我很长一段时间以来第一次使用cpp。我遇到的问题是SpawnActor函数,可能是我连接的参数错误。
下面是cpp文件中的生成逻辑的代码:

void ADS_Generator::SpawnFlora()
{
    FHitResult CurrentHit;
    FActorSpawnParameters SpawnInfo;

    for (int F = 0; F < FloraIterations; ++F)
    {
        if (SpawnedFlora.Num() <= MaxFlora)
        {
            CurrentHit = SpawnLineTrace(Vertices[FMath::RandRange(0, Vertices.Num() - 1)]);
            if (CurrentHit.bBlockingHit == true)
            {
                if (FMath::RandRange(1, 100) >= FloraTolerance)
                {
                    AActor* CurrentFlora = GetWorld()->SpawnActor(Flora[0], CurrentHit.ImpactPoint, FVector(0, 0, FMath::RandRange(-180, 180)), SpawnInfo);
                    SpawnedFlora.Add(CurrentFlora);
                }
            }
        }
    }
}

下面是头文件的代码,我在其中声明了actor类的数组:

UPROPERTY(EditAnywhere)
TArray<TSubclassOf<class AActor>> Flora;
UPROPERTY(EditAnywhere)
TArray<TSubclassOf<class AActor>> Fauna;

我得到的具体错误如下:

"C++ no instance of overloaded function matches the argument list
            argument types are: (TSubclassOf<AActor>, FVector_NetQuantize, FVector, FActorSpawnParameters)
            object type is: UWorld"

我尝试过添加“::StaticClass()”以及使用“-〉StaticClass”,但都无济于事。
有什么想法或建议吗?我肯定需要看一些视频和温习我的cpp,我非常生疏。注意:我使用植物群[0]作为占位符,而不是仅仅为了测试而随机化数组索引。

kpbpu008

kpbpu0081#

找到问题了!问题是我的Rotation被定义为一个普通的FVector,但是它需要被分别转换为Rotation和四元数。下面是代码,但是已经修复:

void ADS_Generator::SpawnFlora()
{
    FHitResult CurrentHit;
    FActorSpawnParameters SpawnInfo;

    for (int F = 0; F < FloraIterations; ++F)
    {
        if (SpawnedFlora.Num() <= MaxFlora)
        {
            CurrentHit = SpawnLineTrace(Vertices[FMath::RandRange(0, Vertices.Num() - 1)]);
            if (CurrentHit.bBlockingHit == true)
            {
                UE_LOG(LogTemp, Warning, TEXT("HIT!"));
                if (FMath::RandRange(1, 100) >= FloraTolerance)
                {
                    FTransform SpawnLoc;
                    SpawnLoc.SetLocation(CurrentHit.ImpactPoint);
                    SpawnLoc.SetRotation((FVector(0, 0, FMath::RandRange(-180, 180)).Rotation().Quaternion()));
                    SpawnLoc.SetScale3D(FVector(1, 1, 1));
                    AActor* CurrentFlora = GetWorld()->SpawnActor<AActor>(Flora[0]->StaticClass(), SpawnLoc, SpawnInfo);
                    SpawnedFlora.Add(CurrentFlora);
                    UE_LOG(LogTemp, Warning, TEXT("Spawned Flora!"));
                }
            }
            else if(CurrentHit.bBlockingHit == false)
            {
                UE_LOG(LogTemp, Warning, TEXT("NO HIT"));
            }
        }
    }
}

TLDR;位置和旋转存储不同,我完全忘记了。

相关问题