ProjectileMovement не работает при втором возрождении

Я делаю простую игру в весло с Blueprints сначала и C++ после.

У меня есть текущий рабочий процесс в моем игровом режиме blueprint: GameMode

И это моя кодовая база:

void APaddleGameGameMode::SpawnBall()
{
    UWorld *world = GetWorld();
    if (world)
    {
        Ref_GameBall = world->SpawnActorDeferred<APaddleGameBall>(APaddleGameBall::StaticClass(), FTransform(FRotator::ZeroRotator, FVector::ZeroVector, FVector::OneVector), NULL, NULL, ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding);

        if (Ref_GameBall) world->GetTimerManager().SetTimer(DelayBallMovement, this, &APaddleGameGameMode::SetVelocity, 0.2f);
    }
}

void APaddleGameGameMode::SetVelocity()
{
    if(Ref_GameBall) Ref_GameBall->ProjectileMovement->Velocity = FVector(Direction * Speed, 0.f, 0.f).RotateAngleAxis(FMath::RandRange(-45.f, 45.f), FVector(0.f, 1.f, 0.f));
    Ref_GameBall->ProjectileMovement->Activate();
}

Проблема здесь в том, что каждый раз, когда игрок делает очко, мяч уничтожается и создается новый: UpdateScore

void APaddleGameGameMode::UpdateScore(bool bIsAI)
{
    UWorld *world = GetWorld();
    if (bIsAI)
    {
        SPScore++;
        Direction = 1.f;
    }
    else
    {
        FPScore++;
        Direction = -1.f;
    }
    if (world)  world->GetTimerManager().SetTimer(DelaySpawningBall, this, &APaddleGameGameMode::SpawnBall, 1.f);
}

На первом, начальном спавне работает нормально: мяч спавнится и двигается; а на втором спауне не работает, не понимаю почему, мяч спавнится но не двигается.

Может ли кто-нибудь объяснить мне это и помочь мне решить эту проблему?

Спасибо.


person SalahAdDin    schedule 27.06.2020    source источник


Ответы (1)


Функция SpawnActorDeferred откладывает BeginPlay, давая возможность вызывающей стороне заранее установить параметры, это означает, что порожденный актор находится на полпути к полной конструкции (является наполовину актором) до FinishSpawningActor вызывается функция, где бы она ни находилась; это означает, что действительный экземпляр актора, который еще не получил BeginPlay, поэтому он не полностью инициализирован.
Здесь Ref_GameBall ->FinishSpawning( Transform ) можно поставить перед активацией движения снаряда или заменить SpawnActorDeferred на SpawnActor:

FActorSpawnParameters SpawnParameters;
SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
Ref_GameBall = world->SpawnActor<APaddleGameBall>(APaddleGameBall::StaticClass(), FTransform(FRotator::ZeroRotator, FVector::ZeroVector, FVector::OneVector), SpawnParameters);

Вот и все. Спасибо @KnownBugg из Discord за помощь в этом.

person SalahAdDin    schedule 27.06.2020