FVector FSCSEditorViewportClient::GetWidgetLocation() const { FVector Location = FVector::ZeroVector; AActor* PreviewActor = GetPreviewActor(); if(PreviewActor) { TArray<FSCSEditorTreeNodePtrType> SelectedNodes = BlueprintEditorPtr.Pin()->GetSelectedSCSEditorTreeNodes(); if(SelectedNodes.Num() > 0) { // Use the last selected item for the widget location USceneComponent* SceneComp = Cast<USceneComponent>(SelectedNodes.Last().Get()->FindComponentInstanceInActor(PreviewActor)); if( SceneComp ) { TSharedPtr<ISCSEditorCustomization> Customization = BlueprintEditorPtr.Pin()->CustomizeSCSEditor(SceneComp); FVector CustomLocation; if(Customization.IsValid() && Customization->HandleGetWidgetLocation(SceneComp, CustomLocation)) { Location = CustomLocation; } else { Location = SceneComp->GetComponentLocation(); } } } } return Location; }
AActor::FActorTransactionAnnotation::FActorTransactionAnnotation(const AActor* Actor, const bool bCacheRootComponentData) : ComponentInstanceData(Actor) { USceneComponent* ActorRootComponent = Actor->GetRootComponent(); if (bCacheRootComponentData && ActorRootComponent && ActorRootComponent->IsCreatedByConstructionScript()) { bRootComponentDataCached = true; RootComponentData.Transform = ActorRootComponent->ComponentToWorld; RootComponentData.Transform.SetTranslation(ActorRootComponent->GetComponentLocation()); // take into account any custom location if (ActorRootComponent->GetAttachParent()) { RootComponentData.AttachedParentInfo.Actor = ActorRootComponent->GetAttachParent()->GetOwner(); RootComponentData.AttachedParentInfo.AttachParent = ActorRootComponent->GetAttachParent(); RootComponentData.AttachedParentInfo.AttachParentName = ActorRootComponent->GetAttachParent()->GetFName(); RootComponentData.AttachedParentInfo.SocketName = ActorRootComponent->GetAttachSocketName(); RootComponentData.AttachedParentInfo.RelativeTransform = ActorRootComponent->GetRelativeTransform(); } for (USceneComponent* AttachChild : ActorRootComponent->GetAttachChildren()) { AActor* ChildOwner = (AttachChild ? AttachChild->GetOwner() : NULL); if (ChildOwner && ChildOwner != Actor) { // Save info about actor to reattach FActorRootComponentReconstructionData::FAttachedActorInfo Info; Info.Actor = ChildOwner; Info.SocketName = AttachChild->GetAttachSocketName(); Info.RelativeTransform = AttachChild->GetRelativeTransform(); RootComponentData.AttachedToInfo.Add(Info); } } } else { bRootComponentDataCached = false; } }
void ALD35Character::OnFire() { if (IsInAlternateForm) { FVector trgPos = FindComponentByClass<UCameraComponent>()->GetComponentLocation() + GetActorRotation().RotateVector(FVector(140, 0, 0)); //DrawDebugSphere(GetWorld(), trgPos, 150, 8, FColor::Red, false, 0.5f); TArray<FOverlapResult> res; if (GetWorld()->OverlapMultiByChannel(res, trgPos, FQuat::Identity, ECollisionChannel::ECC_WorldDynamic, FCollisionShape::MakeSphere(150))) { for (auto& a : res) { if (a.Actor.Get() && a.Actor != this) { a.Actor->TakeDamage(1, FDamageEvent(), this->GetController(), this); } } } if (FMath::Rand() % 3 == 0) { UGameplayStatics::PlaySoundAtLocation(this, TransformSound, GetActorLocation()); } return; } // try and fire a projectile if (ProjectileClass != NULL) { USceneComponent* cam = FindComponentByClass<UCameraComponent>(); if (cam) { FRotator SpawnRotation = cam->GetComponentRotation(); FVector SpawnLocation = cam->GetComponentLocation(); TArray<UActorComponent*> childComponents = GetComponentsByTag(USceneComponent::StaticClass(), "Gun"); for (auto& b : childComponents) { if (auto a = Cast<USceneComponent>(b)) { if (a->ComponentHasTag(TEXT("Gun"))) { SpawnRotation = a->GetComponentRotation(); SpawnLocation = a->GetComponentLocation(); //UE_LOG(LogTemp, Display, TEXT("NM %s %s %s %s %s"), *a->GetName(), *cam->GetName(), *SpawnLocation.ToString(), *cam->GetComponentLocation().ToString(), *a->GetRelativeTransform().ToString()); } } } UWorld* const World = GetWorld(); if (World != NULL) { // spawn the projectile at the muzzle FActorSpawnParameters params; params.Instigator = this; World->SpawnActor<ALD35Projectile>(ProjectileClass, SpawnLocation, SpawnRotation, params); } } } // try and play the sound if specified if (FireSound != NULL) { UGameplayStatics::PlaySoundAtLocation(this, ShootCrossbowSound, GetActorLocation()); } }
void UUnrealEdEngine::UpdatePivotLocationForSelection( bool bOnChange ) { // Pick a new common pivot, or not. AActor* SingleActor = nullptr; USceneComponent* SingleComponent = nullptr; if (GetSelectedComponentCount() > 0) { for (FSelectedEditableComponentIterator It(*GetSelectedComponents()); It; ++It) { UActorComponent* Component = CastChecked<UActorComponent>(*It); AActor* ComponentOwner = Component->GetOwner(); if (ComponentOwner != nullptr) { auto SelectedActors = GetSelectedActors(); const bool bIsOwnerSelected = SelectedActors->IsSelected(ComponentOwner); check(bIsOwnerSelected); if (ComponentOwner->GetWorld() == GWorld) { SingleActor = ComponentOwner; if (Component->IsA<USceneComponent>()) { SingleComponent = CastChecked<USceneComponent>(Component); } const bool IsTemplate = ComponentOwner->IsTemplate(); const bool LevelLocked = !FLevelUtils::IsLevelLocked(ComponentOwner->GetLevel()); check(IsTemplate || LevelLocked); } } } } else { for (FSelectionIterator It(GetSelectedActorIterator()); It; ++It) { AActor* Actor = static_cast<AActor*>(*It); checkSlow(Actor->IsA(AActor::StaticClass())); if (Actor->GetWorld() == GWorld) { const bool IsTemplate = Actor->IsTemplate(); const bool LevelLocked = !FLevelUtils::IsLevelLocked(Actor->GetLevel()); check(IsTemplate || LevelLocked); SingleActor = Actor; } } } if (SingleComponent != NULL) { SetPivot(SingleComponent->GetComponentLocation(), false, true); } else if( SingleActor != NULL ) { // For geometry mode use current pivot location as it's set to selected face, not actor FEditorModeTools& Tools = GLevelEditorModeTools(); if( Tools.IsModeActive(FBuiltinEditorModes::EM_Geometry) == false || bOnChange == true ) { // Set pivot point to the actor's location FVector PivotPoint = SingleActor->GetActorLocation(); // If grouping is active, see if this actor is part of a locked group and use that pivot instead if(GEditor->bGroupingActive) { AGroupActor* ActorGroupRoot = AGroupActor::GetRootForActor(SingleActor, true, true); if(ActorGroupRoot) { PivotPoint = ActorGroupRoot->GetActorLocation(); } } SetPivot( PivotPoint, false, true ); } } else { ResetPivot(); } }