// Sets default values AMyPawn::AMyPawn() { // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; //Set this pawn to be controlled by the lowest numbered player AutoPossessPlayer = EAutoReceiveInput::Player0; //Create a dummy root component to attach things to. RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); //create a camera and a visible object UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera")); OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent")); //attach our camera and visible object to the root OurCamera->AttachTo(RootComponent); (*OurVisibleComponent).AttachTo(RootComponent); //offset camera OurCamera->SetRelativeLocation(FVector(-250, 0, 250)); //rotate camera OurCamera->SetRelativeRotation(FRotator(-45, 0, 0)); InitLocation = GetActorLocation(); }
// Sets default values ASkateboardPawn::ASkateboardPawn() { // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; // Makes the first player take control of this pawn automatically AutoPossessPlayer = EAutoReceiveInput::Player0; // Create a dummy root component we can attach things to RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); // Create a camera and a visible object UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent")); Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent")); static ConstructorHelpers::FObjectFinder<UStaticMesh>CubeVisualAsset(TEXT("/Game/skateboard")); if (CubeVisualAsset.Succeeded()) { Mesh->SetStaticMesh(CubeVisualAsset.Object); Mesh->SetSimulatePhysics(true); //Mesh->SetMassOverrideInKg("", 100); } // Attach our camera and visible object to our root component. Offset and rotate the camera. Camera->AttachTo(Mesh); Camera->SetRelativeLocation(FVector(-450.0f, 0.0f, 450.0f)); Camera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f)); Camera->SetWorldScale3D(FVector(1, 1, 1)); Mesh->AttachTo(RootComponent); }
// Sets default values ACollidingPawn::ACollidingPawn() { // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; // Tutorial code // Our root component will be a sphere that reats to Physics USphereComponent* SphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("RootComponent")); RootComponent = SphereComponent; SphereComponent->InitSphereRadius(40.0f); SphereComponent->SetCollisionProfileName(TEXT("Pawn")); // Creating and correctly Positioning the Mesh component so that it fits the sphere collision UStaticMeshComponent* SphereVisual = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation")); SphereVisual->AttachTo(RootComponent); static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere")); if (SphereVisualAsset.Succeeded()) { SphereVisual->SetStaticMesh(SphereVisualAsset.Object); SphereVisual->SetRelativeLocation(FVector(0.0f, 0.0f,-40.0f)); SphereVisual->SetWorldScale3D(FVector(0.8f)); } // Particle system Creation, Positioning (Offset) OurParticleSystem = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("MovementParticles")); OurParticleSystem->AttachTo(SphereVisual); OurParticleSystem->bAutoActivate = false; OurParticleSystem->SetRelativeLocation(FVector(-20.0f,0.0f,0.0f)); static ConstructorHelpers::FObjectFinder<UParticleSystem> ParticleAsset(TEXT("/Game/StarterContent/Particles/P_Fire.P_Fire")); if (ParticleAsset.Succeeded()) { OurParticleSystem->SetTemplate(ParticleAsset.Object); } // SpringArm creation for a smooth and fast Camera Experience ( We could have just avoided this springArm ) but for the sake of smoothness USpringArmComponent* SpringArm = CreateAbstractDefaultSubobject<USpringArmComponent>(TEXT("CameraAttachmentArm")); SpringArm->AttachTo(RootComponent); SpringArm->RelativeRotation = FRotator(-45.0f,0.0f,0.0f); SpringArm->TargetArmLength = 400.0f; SpringArm->bEnableCameraLag = true; SpringArm->CameraLagSpeed = 3.0f; // Easy to create the Camera component and attach it to the built in Socket at the end of springArm UCameraComponent* ActualCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("ActualCamera")); ActualCamera->AttachTo(SpringArm, USpringArmComponent::SocketName); // Take control of the default player AutoPossessPlayer = EAutoReceiveInput::Player0; // creating an instance of our movement component, and telling it to update the root. OurMovementComponent = CreateDefaultSubobject<UCollidingPawnMovementComponent>(TEXT("CustomMovementComponent")); OurMovementComponent->UpdatedComponent = RootComponent; }
FExecStatus FCameraCommandHandler::SetCameraHorizontalFieldOfView(const TArray<FString>& Args) { if (Args.Num() == 2) { int32 CameraId = FCString::Atoi(*Args[0]); // TODO: Add support for multiple cameras if (CameraId != 0) { return FExecStatus::Error("Setting field of view is only supported for camera 0"); } float FieldOfView = FCString::Atof(*Args[1]); bool bIsMatinee = false; for (AActor* Actor : this->GetWorld()->GetCurrentLevel()->Actors) { // if (Actor && Actor->IsA(AMatineeActor::StaticClass())) // AMatineeActor is deprecated bool FoundCamera = false; if (Actor && Actor->IsA(ACameraActor::StaticClass())) { bIsMatinee = true; UCameraComponent* CameraComponent = Actor->FindComponentByClass<UCameraComponent>(); if (CameraComponent != nullptr) { UE_LOG(LogUnrealCV, Warning, TEXT("Setting field of view to: %f"), FieldOfView); CameraComponent->SetFieldOfView(FieldOfView); FoundCamera = true; APlayerCameraManager* CameraManager = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0); CameraManager->SetFOV(FieldOfView); break; } } } UGTCaptureComponent* CaptureComponent = FCaptureManager::Get().GetCamera(CameraId); if (CaptureComponent == nullptr) { return FExecStatus::Error(FString::Printf(TEXT("Camera %d can not be found."), CameraId)); } UGTCaptureComponent* GTCapturer = FCaptureManager::Get().GetCamera(CameraId); if (GTCapturer == nullptr) { return FExecStatus::Error(FString::Printf(TEXT("Invalid camera id %d"), CameraId)); } GTCapturer->SetFOVAngle(FieldOfView); return FExecStatus::OK(); } return FExecStatus::Error("Number of arguments incorrect"); }
// Sets default values APawnCharacter::APawnCharacter() { // Stats moveSpeed = 300.0f; dodgeSpeed = 800.0f; // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; // Our root component will be a sphere that reacts to physics USphereComponent* SphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("RootComponent")); RootComponent = SphereComponent; SphereComponent->InitSphereRadius(40.0f); SphereComponent->SetCollisionProfileName(TEXT("Pawn")); // Create and position a mesh component so we can see where our sphere is UStaticMeshComponent* SphereVisual = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation")); SphereVisual->AttachTo(RootComponent); static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere")); if (SphereVisualAsset.Succeeded()) { SphereVisual->SetStaticMesh(SphereVisualAsset.Object); SphereVisual->SetRelativeLocation(FVector(0.0f, 0.0f, -40.0f)); SphereVisual->SetWorldScale3D(FVector(0.8f)); } // Use a spring arm to give the camera smooth, natural-feeling motion. USpringArmComponent* SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraAttachmentArm")); SpringArm->AttachTo(RootComponent); SpringArm->RelativeRotation = FRotator(-75.f, 0.f, 0.f); SpringArm->TargetArmLength = 800.0f; SpringArm->bEnableCameraLag = true; SpringArm->CameraLagSpeed = 5.0f; // Create a camera and attach to our spring arm UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("ActualCamera")); Camera->AttachTo(SpringArm, USpringArmComponent::SocketName); // Take control of the default player AutoPossessPlayer = EAutoReceiveInput::Player0; // Create an instance of our movement component, and tell it to update the root. OurMovementComponent = CreateDefaultSubobject<UPawnCharacterMovementComponent>(TEXT("CustomMovementComponent")); OurMovementComponent->UpdatedComponent = RootComponent; OurMovementComponent->setMoveSpeed(moveSpeed); }
EBTNodeResult::Type UBTTask_CloseDialogue::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { EBTNodeResult::Type NodeResult = EBTNodeResult::Failed; if (!DialogueWidget.IsNone()) { FName KeyName = DialogueWidget.SelectedKeyName; UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent(); UUserWidget* Widget = Cast<UUserWidget>(BlackboardComp->GetValueAsObject(KeyName)); UWidgetComponent* WidgetComp = Cast<UWidgetComponent>(BlackboardComp->GetValueAsObject(KeyName)); if (!Widget && !WidgetComp) { #if WITH_EDITOR FMessageLog("PIE").Error() ->AddToken(FTextToken::Create(LOCTEXT("InvalidWidgetKey", "Invalid key for Dialogue Widget in "))) ->AddToken(FUObjectToken::Create((UObject*)OwnerComp.GetCurrentTree())); #endif return EBTNodeResult::Failed; } if (!Widget && WidgetComp) { Widget = CreateWidget<UUserWidget>(GetWorld(), WidgetComp->GetWidgetClass()); } APlayerController* PlayerController = Widget->GetOwningPlayer(); FInputModeGameOnly InputMode; PlayerController->SetInputMode(InputMode); if (Widget && Widget->IsInViewport()) { Widget->RemoveFromParent(); } switch (MouseOptions) { case ECloseDialogueCursorOptions::Show: PlayerController->bShowMouseCursor = true; break; default: PlayerController->bShowMouseCursor = false; break; } } // set camera default values if (!PlayerCamera.IsNone()) { FName PlayerCameraKeyName = PlayerCamera.SelectedKeyName; UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent(); UCameraComponent* PlayerCameraComp = Cast<UCameraComponent>(BlackboardComp->GetValueAsObject(PlayerCameraKeyName)); if (PlayerCameraComp) { PlayerCameraComp->SetWorldLocationAndRotation(DefaultCameraLocation, DefaultCameraRotation); UBTTask_ShowPhrases* ShowPhrases = Cast<UBTTask_ShowPhrases>(FirstTaskNode); UBTTask_WaitAnswer* WaitAnswer = Cast<UBTTask_WaitAnswer>(FirstTaskNode); if (ShowPhrases) { ShowPhrases->DefaultCameraLocation = FVector(0.f, 0.f, 0.f); } if (WaitAnswer) { WaitAnswer->DefaultCameraLocation = FVector(0.f, 0.f, 0.f); } } } return NodeResult; }
EBTNodeResult::Type UBTTask_WaitAnswer::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { ClearAnswer(); EBTNodeResult::Type NodeResult = !bAnswerDone ? EBTNodeResult::InProgress : NodeResult = EBTNodeResult::Succeeded; TimerCount = Timer; AActor* OwnerActor = OwnerComp.GetOwner(); if (!DialogueWidget.IsNone()) { FName WidgetKeyName = DialogueWidget.SelectedKeyName; BlackboardComp = OwnerComp.GetBlackboardComponent(); Widget = Cast<UUserWidget>(BlackboardComp->GetValueAsObject(WidgetKeyName)); WidgetComp = Cast<UWidgetComponent>(BlackboardComp->GetValueAsObject(WidgetKeyName)); UDialogueButton* FirstButton = nullptr; if (!Widget && !WidgetComp) { #if WITH_EDITOR FMessageLog("PIE").Error() ->AddToken(FTextToken::Create(LOCTEXT("InvalidWidgetKey", "Invalid key for Dialogue Widget in "))) ->AddToken(FUObjectToken::Create((UObject*)OwnerComp.GetCurrentTree())); #endif return EBTNodeResult::Failed; } if (WidgetComp) { Widget = CreateWidget<UUserWidget>(GetWorld(), WidgetComp->GetWidgetClass()); PlayerController = WidgetComp->GetUserWidgetObject()->GetOwningPlayer(); bIsUserWidget = false; } else { bIsUserWidget = true; PlayerController = Widget->GetOwningPlayer(); } if (Widget && Widget->IsInViewport()) { Widget->RemoveFromParent(); } if (!Widget) { NodeResult = EBTNodeResult::Failed; } else { WidgetTree = Widget->WidgetTree; UWidget* DialogueQuestionsSlot = WidgetTree->FindWidget(DialogueQuestionsSlotName); UPanelWidget* Panel = Cast<UPanelWidget>(DialogueQuestionsSlot); if (Panel) { TArray<UWidget*> Buttons; UDialogueButton* SampleButton = nullptr; UTextBlock* SampleTextBlock = nullptr; WidgetTree->GetChildWidgets(DialogueQuestionsSlot, Buttons); for (auto& elem : Buttons) { UDialogueButton* Button = Cast<UDialogueButton>(elem); if (Button) { SampleButton = Button; WidgetTree->RemoveWidget(elem); } UTextBlock* TextBlock = Cast<UTextBlock>(elem); if (TextBlock) { SampleTextBlock = TextBlock; WidgetTree->RemoveWidget(elem); } } if (SampleButton != nullptr && SampleTextBlock != nullptr) { const UBTNode* BTNode = GetParentNode(); const UBTCompositeNode* CBTNode = Cast<UBTCompositeNode>(BTNode); Panel->SetVisibility(ESlateVisibility::Visible); if (CBTNode) { int32 ButtonNumber = 0; for (int32 Index = 0; Index != CBTNode->Children.Num(); ++Index) { auto& Child = CBTNode->Children[Index]; UBTComposite_Question* Question = Cast<UBTComposite_Question>(Child.ChildComposite); bool bDecoratorOk = CBTNode->DoDecoratorsAllowExecution(OwnerComp, OwnerComp.GetActiveInstanceIdx(), Index); if(Question) { Question->bCanExecute = false; Question->bSelected = false; } if ( Question && Question->Children.Num() > 0 && Question->GetVisibility(PlayerController) && Question->bVisible && bDecoratorOk ) { Question->bCanExecute = true; UDialogueButton *NewSampleButton = NewObject<UDialogueButton>(this, NAME_None, SampleButton->GetFlags(), SampleButton); UTextBlock *NewSampleTextBlock = NewObject<UTextBlock>(this, NAME_None, SampleTextBlock->GetFlags(), SampleTextBlock); ButtonNumber++; if (bUseGamepad) { NewSampleButton->IsFocusable = true; if (ButtonNumber == 1) { FirstButton = NewSampleButton; } } else { NewSampleButton->IsFocusable = false; } NewSampleTextBlock->SetText(FText::Format(NSLOCTEXT("DialogueSystem", "ButtonText", "{0}"), Question->QuestionThumbnail)); UWidget* Oldtext = NewSampleButton->GetChildAt(0); NewSampleButton->WaitTask = this; NewSampleButton->RemoveChild(Oldtext); NewSampleButton->AddChild(NewSampleTextBlock); Panel->AddChild(NewSampleButton); } } } } // Event Listener UWidget* DialogueEventListener = WidgetTree->FindWidget(FName("DialogueEventListener")); if (DialogueEventListener != nullptr) { UDialogueEventListener* EventListener = Cast<UDialogueEventListener>(DialogueEventListener); if (EventListener) { EventListener->WaitAnswerNode = this; } } } if (bIsUserWidget) { Widget->AddToViewport(); } else { WidgetComp->SetWidget(Widget); WidgetComp->SetVisibility(true); } PlayerController->bShowMouseCursor = !bUseGamepad; FInputModeUIOnly InputModeUIOnly; FInputModeGameAndUI InputModeGameAndUI; if (InputMode == EWidggetInputMode::UIOnly) { PlayerController->SetInputMode(InputModeUIOnly); } else { PlayerController->SetInputMode(InputModeGameAndUI); } if (bUseGamepad && Panel) { FirstButton->SetKeyboardFocus(); } else { if (InputMode == EWidggetInputMode::UIOnly) { InputModeUIOnly.SetWidgetToFocus(Widget->TakeWidget()); } else { InputModeGameAndUI.SetWidgetToFocus(Widget->TakeWidget()); } } } // cinematic if (DialogueCinematicOptions.bPlayMatinee && !DialogueCinematicOptions.Matinee.Equals("None")) { for (TActorIterator<AMatineeActor> It(OwnerActor->GetWorld()); It; ++It) { MatineeActor = *It; if (MatineeActor && MatineeActor->GetName().Equals(DialogueCinematicOptions.Matinee)) { MatineeActor->bLooping = DialogueCinematicOptions.bLoop; MatineeActor->Play(); break; } } } // camera if (DialogueCameraOptions.bUseCamera) { if (!DialogueCameraOptions.CameraToView.IsNone() && !DialogueCameraOptions.PlayerCamera.IsNone()) { FName CameraToViewKeyName = DialogueCameraOptions.CameraToView.SelectedKeyName; BlackboardComp = OwnerComp.GetBlackboardComponent(); UCameraComponent* CameraToView = Cast<UCameraComponent>(BlackboardComp->GetValueAsObject(CameraToViewKeyName)); FName PlayerCameraKeyName = DialogueCameraOptions.PlayerCamera.SelectedKeyName; PlayerCamera = Cast<UCameraComponent>(BlackboardComp->GetValueAsObject(PlayerCameraKeyName)); if (PlayerCamera && CameraToView) { SaveDefaultCameraData(PlayerCamera); if (PlayerCamera == CameraToView) { PlayerCamera->SetWorldLocationAndRotation(DefaultCameraLocation, DefaultCameraRotation); } else { PlayerCamera->SetWorldLocationAndRotation(CameraToView->GetComponentLocation(), CameraToView->GetComponentRotation()); } } } } } return NodeResult; }
void AWeapon::Fire() { UCameraComponent* cameraComp = m_weaponCarrier->GetCameraComponent(); // Shoot a projectile from the gun in the impact point's direction AMorphoProjectile* currentProjectile = FireProjectile(m_weaponOpening->GetComponentLocation(), cameraComp->GetForwardVector()) ; }
// Sets default values AMyObjPawn::AMyObjPawn() { // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; // Set this pawn to be controlled by the lowest-numbered player (このポーンが最小値のプレイヤーで制御されるように設定) AutoPossessPlayer = EAutoReceiveInput::Player0; // ダミーキャラクターを置く RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); // Create a dummy root component we can attach things to.(親子付け可能なダミーのルートコンポーネントを作成) UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera")); // Attach our camera and visible object to our root component. (カメラと可視オブジェクトをルートコンポーネントに親子付け。カメラをオフセットして回転) OurCamera->AttachTo(RootComponent); OurCamera->SetRelativeLocation(FVector(-350.0f, 0.0f, 100.0f)); OurCamera->SetRelativeRotation(FRotator(0.0f, 0.0f, 0.0f)); /** * Create/replace a section for this procedural mesh component. * @param SectionIndex Index of the section to create or replace. * @param Vertices Vertex buffer of all vertex positions to use for this mesh section. * @param Triangles Index buffer indicating which vertices make up each triangle. Length must be a multiple of 3. * @param Normals Optional array of normal vectors for each vertex. If supplied, must be same length as Vertices array. * @param UV0 Optional array of texture co-ordinates for each vertex. If supplied, must be same length as Vertices array. * @param VertexColors Optional array of colors for each vertex. If supplied, must be same length as Vertices array. * @param Tangents Optional array of tangent vector for each vertex. If supplied, must be same length as Vertices array. * @param bCreateCollision Indicates whether collision should be created for this section. This adds significant cost. */ // 動的オブジェクトを置く mProceduralMeshComponent = CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("GeneratedMesh")); TArray<FVector> positions; TArray<FVector> normals; TArray<FVector2D> uvs; TArray<FColor> colors; TArray<FProcMeshTangent> tangents; TArray<int32> indices; ObjectParser(positions, normals, uvs, indices); for (size_t i = 0; i < positions.Num(); i++) { colors.Add(FColor(255, 255, 255, 255)); tangents.Add(FProcMeshTangent(1, 1, 1)); } ConstructorHelpers::FObjectFinder<UMaterial>* pMaterialAsset = new ConstructorHelpers::FObjectFinder<UMaterial>( _T("/Game/InfinityBladeAdversaries/Enemy/Enemy_Bear/Materials/M_Bear_Master.M_Bear_Master") ); if (pMaterialAsset->Succeeded()) { mMaterial = pMaterialAsset->Object; UE_LOG(LogTemp, Warning, TEXT("output : %s"), L"マテリアルロードに成功しました"); } else { UE_LOG(LogTemp, Warning, TEXT("output : %s"), L"マテリアルロードに失敗しました"); } mProceduralMeshComponent->CreateMeshSection(0, positions, indices, normals, uvs, colors, tangents, false); mProceduralMeshComponent->SetMaterial(0, mMaterial); mProceduralMeshComponent->AttachTo(RootComponent); }
EBTNodeResult::Type UBTTask_ShowPhrases::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { EBTNodeResult::Type NodeResult = ShowingNumPhrase <= PhrasesCount ? EBTNodeResult::InProgress : NodeResult = EBTNodeResult::Succeeded; // reset timer handle TimerHandle.Invalidate(); //AudioComponent = NULL; if (!DialogueWidget.IsNone()) { FName WidgetKeyName = DialogueWidget.SelectedKeyName; BlackboardComp = OwnerComp.GetBlackboardComponent(); Widget = Cast<UUserWidget>(BlackboardComp->GetValueAsObject(WidgetKeyName)); WidgetComp = Cast<UWidgetComponent>(BlackboardComp->GetValueAsObject(WidgetKeyName)); OwnerActor = OwnerComp.GetOwner(); if (!Widget && !WidgetComp) { #if WITH_EDITOR FMessageLog("PIE").Error() ->AddToken(FTextToken::Create(LOCTEXT("InvalidWidgetKey", "Invalid key for Dialogue Widget in "))) ->AddToken(FUObjectToken::Create((UObject*)OwnerComp.GetCurrentTree())); #endif return EBTNodeResult::Failed; } if (WidgetComp) { Widget = CreateWidget<UUserWidget>(GetWorld(), WidgetComp->GetWidgetClass()); bIsUserWidget = false; } else { bIsUserWidget = true; } if (Widget && Widget->IsInViewport()) { Widget->RemoveFromParent(); } if (Widget && !Widget->IsInViewport()) { UWidgetTree* WidgetTree = Widget->WidgetTree; UWidget* DialogueQuestionsSlot = WidgetTree->FindWidget(DialogueTextOptions.DialogueQuestionsSlotName); if (DialogueQuestionsSlot != nullptr) { DialogueQuestionsSlot->SetVisibility(ESlateVisibility::Hidden); } // text DialoguePhraseSlot = WidgetTree->FindWidget(DialogueTextOptions.DialoguePhraseSlotName); if (DialoguePhraseSlot != nullptr) { DialoguePhraseSlot->SetVisibility(ESlateVisibility::Visible); UTextBlock* StartPhraseTextBlock = Cast<UTextBlock>(DialoguePhraseSlot); if (StartPhraseTextBlock) { if (DialogueTextOptions.bShowTextPhrases) { PhrasesCount = DialogueTextOptions.Phrases.Num() - 1; // starts from 0 if (ShowingNumPhrase > PhrasesCount) { ShowingNumPhrase = 0; } FText StartPhrase = DialogueTextOptions.Phrases.Num() > 0 ? DialogueTextOptions.Phrases[ShowingNumPhrase].Phrase : FText::GetEmpty(); if (DialogueTextOptions.TextEffect == ETextEffect::NoEffect || DialogueTextOptions.Delay == 0.0f) { StartPhraseTextBlock->SetText(FText::Format(NSLOCTEXT("DialogueSystem", "ShowPhraseText", "{0}"), StartPhrase)); float ShowingTime = DialogueTextOptions.UseGeneralTime ? DialogueTextOptions.GeneralShowingTime : DialogueTextOptions.Phrases[ShowingNumPhrase].ShowingTime; TimerDelegate = FTimerDelegate::CreateUObject(this, &UBTTask_ShowPhrases::ShowNewDialoguePhrase, false); OwnerActor->GetWorldTimerManager().SetTimer(TimerHandle, TimerDelegate, ShowingTime, false); } else { if (DialogueTextOptions.TextEffect == ETextEffect::Typewriter) { CurrentCharNum = 1; StringToDisplay = ""; FullString = StartPhrase.ToString().GetCharArray(); StringToDisplay.AppendChar(FullString[0]); if (StartPhraseTextBlock) { StartPhraseTextBlock->SetText(FText::Format(NSLOCTEXT("DialogueSystem", "ShowPhraseText", "{0}"), FText::FromString(StringToDisplay))); } TimerDelegate = FTimerDelegate::CreateUObject(this, &UBTTask_ShowPhrases::ShowNewChar); OwnerActor->GetWorldTimerManager().SetTimer(TimerHandle, TimerDelegate, DialogueTextOptions.Delay, false); } } // play phrase sound if (DialogueTextOptions.Phrases[ShowingNumPhrase].SoundToPlay) { PhraseAudioComponent = UGameplayStatics::SpawnSound2D(GetWorld(), DialogueTextOptions.Phrases[ShowingNumPhrase].SoundToPlay); } } else { DialoguePhraseSlot->SetVisibility(ESlateVisibility::Hidden); bTextFinished = true; } } } // name DialogueNameSlot = WidgetTree->FindWidget(DialogueNameOptions.DialogueSpeakerNameSlotName); if (DialogueNameSlot != nullptr) { if (DialogueNameOptions.bShowName) { DialogueNameSlot->SetVisibility(ESlateVisibility::Visible); UTextBlock* NameTextBlock = Cast<UTextBlock>(DialogueNameSlot); if (NameTextBlock) { NameTextBlock->SetText(DialogueNameOptions.Name); } } else { DialogueNameSlot->SetVisibility(ESlateVisibility::Hidden); } } // image DialogueImageSlot = WidgetTree->FindWidget(DialogueImageOptions.DialogueSpeakerImageSlotName); if (DialogueImageSlot != nullptr) { if (DialogueImageOptions.bShowImage) { DialogueImageSlot->SetVisibility(ESlateVisibility::Visible); UImage* DialogueImage = Cast<UImage>(DialogueImageSlot); if (DialogueImage) { DialogueImage->SetBrushFromTexture(DialogueImageOptions.Image); } } else { DialogueImageSlot->SetVisibility(ESlateVisibility::Hidden); } } // general sound if (DialogueSoundOptions.bPlaySound) { if (DialogueSoundOptions.SoundToPlay) { GeneralAudioComponent = UGameplayStatics::SpawnSound2D(GetWorld(), DialogueSoundOptions.SoundToPlay); } } // camera if (DialogueCameraOptions.bUseCamera) { if (!DialogueCameraOptions.CameraToView.IsNone() && !DialogueCameraOptions.PlayerCamera.IsNone() && !DialogueCinematicOptions.bPlayMatinee) { FName CameraToViewKeyName = DialogueCameraOptions.CameraToView.SelectedKeyName; BlackboardComp = OwnerComp.GetBlackboardComponent(); UCameraComponent* CameraToView = Cast<UCameraComponent>(BlackboardComp->GetValueAsObject(CameraToViewKeyName)); FName PlayerCameraKeyName = DialogueCameraOptions.PlayerCamera.SelectedKeyName; PlayerCamera = Cast<UCameraComponent>(BlackboardComp->GetValueAsObject(PlayerCameraKeyName)); if (PlayerCamera && CameraToView) { SaveDefaultCameraData(PlayerCamera); if (PlayerCamera == CameraToView) { PlayerCamera->SetWorldLocationAndRotation(DefaultCameraLocation, DefaultCameraRotation); } else { PlayerCamera->SetWorldLocationAndRotation(CameraToView->GetComponentLocation(), CameraToView->GetComponentRotation()); } } } } // cinematic if (DialogueCinematicOptions.bPlayMatinee && !DialogueCinematicOptions.Matinee.Equals("None")) { for (TActorIterator<AMatineeActor> It(OwnerActor->GetWorld()); It; ++It) { MatineeActor = *It; if (MatineeActor && MatineeActor->GetName().Equals(DialogueCinematicOptions.Matinee)) { MatineeActor->bLooping = DialogueCinematicOptions.bLoop; MatineeActor->Play(); break; } } } // character animation if (DialogueCharacterAnimationOptions.bPlayAnimation && !DialogueCharacterAnimationOptions.Mesh.IsNone() && DialogueCharacterAnimationOptions.Animation != nullptr) { FName MeshKeyName = DialogueCharacterAnimationOptions.Mesh.SelectedKeyName; BlackboardComp = OwnerComp.GetBlackboardComponent(); Mesh = Cast<USkeletalMeshComponent>(BlackboardComp->GetValueAsObject(MeshKeyName)); if (Mesh) { UAnimInstance *AnimInst = Mesh->GetAnimInstance(); if (AnimInst) { AnimInst->PlaySlotAnimationAsDynamicMontage(DialogueCharacterAnimationOptions.Animation, DialogueCharacterAnimationOptions.AnimationBlendOptions.SlotNodeName, DialogueCharacterAnimationOptions.AnimationBlendOptions.BlendInTime, DialogueCharacterAnimationOptions.AnimationBlendOptions.BlendOutTime, DialogueCharacterAnimationOptions.AnimationBlendOptions.InPlayRate); } if (DialogueCharacterAnimationOptions.bWaitEndOfAnimation) { UAnimSequenceBase* SequenceBase = DialogueCharacterAnimationOptions.Animation; CharacterAnimationDuration = SequenceBase->SequenceLength / SequenceBase->RateScale; } } bCharacterAnimationStarted = true; } // Event Listener UWidget* DialogueEventListener = WidgetTree->FindWidget(FName("DialogueEventListener")); if (DialogueEventListener != nullptr) { UDialogueEventListener* EventListener = Cast<UDialogueEventListener>(DialogueEventListener); if (EventListener) { EventListener->ShowPhrasesNode = this; } } if (bIsUserWidget) { Widget->AddToViewport(); } else { WidgetComp->SetWidget(Widget); WidgetComp->SetVisibility(true); } PlayerController = Widget->GetOwningPlayer(); if (InputMode == EWidggetInputMode::UIOnly) { FInputModeUIOnly InputModeUIOnly; InputModeUIOnly.SetWidgetToFocus(Widget->TakeWidget()); PlayerController->SetInputMode(InputModeUIOnly); } else { FInputModeGameAndUI InputModeGameAndUI; InputModeGameAndUI.SetWidgetToFocus(Widget->TakeWidget()); PlayerController->SetInputMode(InputModeGameAndUI); } } else { bTextFinished = true; NodeResult = EBTNodeResult::Failed; } } return NodeResult; }