обновление свойства класса перекрывающегося актера
Я хотел бы переместить актера в набор актеров, размещенных в мире. Для набора актеров и движущегося актера настроено столкновение. Обычно всякий раз, когда движущийся субъект достигает одного из своих пунктов назначения, перекрывающийся субъект устанавливает свойство в классе движущегося объекта, которое является актором, к которому он перемещается следующим.
Вот важные фрагменты кода
Вот свойство, которое следует обновить:
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