void UActorComponent::BeginDestroy() { if (bHasBegunPlay) { EndPlay(EEndPlayReason::Destroyed); } // Ensure that we call UninitializeComponent before we destroy this component if (bHasBeenInitialized) { UninitializeComponent(); } ExecuteUnregisterEvents(); // Ensure that we call OnComponentDestroyed before we destroy this component if (bHasBeenCreated) { OnComponentDestroyed(); } World = NULL; // Remove from the parent's OwnedComponents list if (AActor* MyOwner = GetOwner()) { MyOwner->RemoveOwnedComponent(this); } Super::BeginDestroy(); }
void UActorComponent::UnregisterComponent() { // Do nothing if not registered if(!IsRegistered()) { UE_LOG(LogActorComponent, Log, TEXT("UnregisterComponent: (%s) Not registered. Aborting."), *GetPathName()); return; } // If registered, should have a world checkf(World != NULL, TEXT("%s"), *GetFullName()); // Notify the texture streaming system const UPrimitiveComponent* Primitive = Cast<const UPrimitiveComponent>(this); if ( Primitive ) { GStreamingManager->NotifyPrimitiveDetached( Primitive ); } AActor* Owner = GetOwner(); // Get Owner while we are still registered RegisterAllComponentTickFunctions(false); ExecuteUnregisterEvents(); World = NULL; }
void UActorComponent::ConsolidatedPostEditChange(const FPropertyChangedEvent& PropertyChangedEvent) { FComponentReregisterContext* ReregisterContext = nullptr; if(EditReregisterContexts.RemoveAndCopyValue(this, ReregisterContext)) { delete ReregisterContext; AActor* MyOwner = GetOwner(); if ( MyOwner && !MyOwner->IsTemplate() && PropertyChangedEvent.ChangeType != EPropertyChangeType::Interactive ) { MyOwner->RerunConstructionScripts(); } } else { // This means there are likely some stale elements left in there now, strip them out for (auto It(EditReregisterContexts.CreateIterator()); It; ++It) { if (!It.Key().IsValid()) { It.RemoveCurrent(); } } } // The component or its outer could be pending kill when calling PostEditChange when applying a transaction. // Don't do do a full recreate in this situation, and instead simply detach. if( IsPendingKill() ) { // @todo UE4 james should this call UnregisterComponent instead to remove itself from the RegisteredComponents array on the owner? ExecuteUnregisterEvents(); World = NULL; } }
void UActorComponent::BeginDestroy() { // Ensure that we call OnComponentDestroyed before we destroy this component if(bHasBeenCreated) { #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) //UE_LOG(LogActor, Warning, TEXT("UChildActorComponent::BeginDestroy called on '%s' before without OnComponentDestroyed being called."), *this->GetPathName()); #endif OnComponentDestroyed(); } ExecuteUnregisterEvents(); World = NULL; Super::BeginDestroy(); }
void UActorComponent::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) { FComponentReregisterContext* ReregisterContext = EditReregisterContexts.FindRef(this); if(ReregisterContext) { delete ReregisterContext; EditReregisterContexts.Remove(this); } // The component or its outer could be pending kill when calling PostEditChange when applying a transaction. // Don't do do a full recreate in this situation, and instead simply detach. if( IsPendingKill() ) { // @todo UE4 james should this call UnregsiterComponent instead to remove itself from the RegisteteredComponents array on the owner? ExecuteUnregisterEvents(); World = NULL; } Super::PostEditChangeProperty(PropertyChangedEvent); }
void UActorComponent::PreEditChange(UProperty* PropertyThatWillChange) { Super::PreEditChange(PropertyThatWillChange); if(IsRegistered()) { // The component or its outer could be pending kill when calling PreEditChange when applying a transaction. // Don't do do a full recreate in this situation, and instead simply detach. if( !IsPendingKill() ) { check(!EditReregisterContexts.Find(this)); EditReregisterContexts.Add(this,new FComponentReregisterContext(this)); } else { ExecuteUnregisterEvents(); World = NULL; } } // Flush rendering commands to ensure the rendering thread processes the component detachment before it is modified. FlushRenderingCommands(); }
void UActorComponent::ConsolidatedPostEditChange(const FPropertyChangedEvent& PropertyChangedEvent) { FComponentReregisterContext* ReregisterContext = EditReregisterContexts.FindRef(this); if(ReregisterContext) { delete ReregisterContext; EditReregisterContexts.Remove(this); AActor* MyOwner = GetOwner(); if ( MyOwner && !MyOwner->IsTemplate() && PropertyChangedEvent.ChangeType != EPropertyChangeType::Interactive ) { MyOwner->RerunConstructionScripts(); } } // The component or its outer could be pending kill when calling PostEditChange when applying a transaction. // Don't do do a full recreate in this situation, and instead simply detach. if( IsPendingKill() ) { // @todo UE4 james should this call UnregisterComponent instead to remove itself from the RegisteredComponents array on the owner? ExecuteUnregisterEvents(); World = NULL; } }