обновление свойства класса перекрывающегося актера

Я хотел бы переместить актера в набор актеров, размещенных в мире. Для набора актеров и движущегося актера настроено столкновение. Обычно всякий раз, когда движущийся субъект достигает одного из своих пунктов назначения, перекрывающийся субъект устанавливает свойство в классе движущегося объекта, которое является актором, к которому он перемещается следующим.

Вот важные фрагменты кода

Вот свойство, которое следует обновить:

      UPROPERTY(EditAnywhere, BlueprintReadWrite)
ARAStaticMeshActor* CurrentTarget;

Тик движущегося актера.

      void ARAScrapPart::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    if (CurrentTarget != nullptr)
    {
        ARAGameState* gameState = GetWorld()->GetGameState<ARAGameState>();

        FVector targetLocation = CurrentTarget->GetActorLocation();
        FVector currentLocation = GetActorLocation();

        UE_LOG(LogTemp, Warning, TEXT("this %X CurrentTarget %X"), this, CurrentTarget);

        if (FGenericPlatformMath::Abs(currentLocation.X - targetLocation.X) > 5.f
            || FGenericPlatformMath::Abs(currentLocation.Y - targetLocation.Y) > 5.f)
        {
            if (targetLocation.X > currentLocation.X)
            {
                currentLocation.X += Speed * DeltaTime;
            }

            if (targetLocation.X < currentLocation.X)
            {
                currentLocation.X -= Speed * DeltaTime;
            }

            if (targetLocation.Y > currentLocation.Y)
            {
                currentLocation.Y += Speed * DeltaTime;
            }

            if (targetLocation.Y < currentLocation.Y)
            {
                currentLocation.Y -= Speed * DeltaTime;
            }

            SetActorLocation(currentLocation);
        }
    }
}

И самое главное, событие перекрытия:

      void ARAStaticMeshActor::OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
    ARAScrapPart* scrapPart = Cast<ARAScrapPart>(OtherActor);

    if (scrapPart != nullptr)
    {
        ARAGameState* gameState = GetWorld()->GetGameState<ARAGameState>();

        for (size_t i = 0; i < gameState->conveyorFields.Num(); i++)
        {
            if (gameState->conveyorFields[i]->Actor == this)
            {
                if (i != gameState->conveyorFields.Num() - 1)
                {       
                    UE_LOG(LogTemp, Warning, TEXT("OtherActor %X , ScrapPart %X , CurrentTarget %X , nextField %X"), OtherActor, scrapPart, scrapPart->CurrentTarget, gameState->conveyorFields[i + 1]->Actor);

                    scrapPart->CurrentTarget = gameState->conveyorFields[i + 1]->Actor;

                    UE_LOG(LogTemp, Warning, TEXT("After update CurrentTarget %X"), scrapPart->CurrentTarget);
                }
                else
                {
                    scrapPart->Destroy();
                }

                break;
            }
        }
    }
}

Как видите, я обновляю scrapPart->CurrentTarget = gameState-> pipelineFields [i + 1] ->Actor; target движущегося актера, но он не обновляется в самом классе.

Я подтвердил, что scrapPart (движущаяся часть), которую я здесь пытаюсь изменить, совпадает с той, что Ticks, через UE_LOGs. (Проверка адреса scrapPart и this в функции Tick одинакова.) Еще одно очень интересное поведение заключается в том, что в области действия функции перекрытия после модификации свойства CurrentTarget UE_LOG показывал обновленное значение, но значение в функции тика scrapPart осталась прежней.

Это нереальный движок 5.

Кто-нибудь сталкивался с чем-то подобным?

РЕДАКТИРОВАТЬ: добавлены части регистрации, а также вывод из журнала:

      LogTemp: Warning: OtherActor 3587A80 , ScrapPart 3587A80 , CurrentTarget 0 , nextField 3585080
LogTemp: Warning: After update CurrentTarget 3585080
LogTemp: Warning: OtherActor 3587A80 , ScrapPart 3587A80 , CurrentTarget 3585080 , nextField 3585080
LogTemp: Warning: After update CurrentTarget 3585080
LogTemp: Warning: this 3587A80 CurrentTarget F0E5BD00
LogTemp: Warning: this 3587A80 CurrentTarget F0E5BD00
LogTemp: Warning: this 3587A80 CurrentTarget F0E5BD00
LogTemp: Warning: this 3587A80 CurrentTarget F0E5BD00
LogTemp: Warning: this 3587A80 CurrentTarget F0E5BD00

0 ответов

Другие вопросы по тегам