最简单的 UE 4 C++ 教程 ——两个相机视图的切换【二十八】

迈不过友情╰ 2022-09-02 03:54 535阅读 0赞

原教程是基于 UE 4.18,我是基于 UE 4.25】

英文原地址

接上一节教程,这是 Epic 的游戏控制摄像机教程的攻略教程。

创建一个名为 CameraDirector 的新角色。然后在头文件中添加三个变量。添加两个从 Actor 类继承而来的摄像机 actor。将 UPROPERTY 设置为 EditAnywhere ,这样我们就可以在编辑器中添加 actor 。这两个摄像机将是用于我们的视图切换的 actor。添加一 float 变量(表示时间),这样我就可以在 cpp 文件中使用它。下面是头文件。

CameraDirector.h

  1. #pragma once
  2. #include "CoreMinimal.h"
  3. #include "GameFramework/Actor.h"
  4. #include "CameraDirector.generated.h"
  5. UCLASS()
  6. class UNREALCPP_API ACameraDirector : public AActor
  7. {
  8. GENERATED_BODY()
  9. public:
  10. // Sets default values for this actor's properties
  11. ACameraDirector();
  12. protected:
  13. // Called when the game starts or when spawned
  14. virtual void BeginPlay() override;
  15. public:
  16. // Called every frame
  17. virtual void Tick(float DeltaTime) override;
  18. // declare variables
  19. UPROPERTY(EditAnywhere)
  20. AActor* CameraOne;
  21. UPROPERTY(EditAnywhere)
  22. AActor* CameraTwo;
  23. float TimeToNextCameraChange;
  24. };

首先,我们想要添加 Kismet/GameplayStatics.h 脚本以允许我们访问玩家控制器。

  1. #include "CameraDirector.h"
  2. // include Kismet/GameplayStatics.h
  3. #include "Kismet/GameplayStatics.h"

这个 actor 的其余逻辑将被添加到 Tick 函数中。声明两个浮点变量。这两个浮动变量将管理相机变化之间的时间,以及平滑混合视图之间的时间量。

  1. void ACameraDirector::Tick(float DeltaTime)
  2. {
  3. Super::Tick(DeltaTime);
  4. const float TimeBetweenCameraChanges = 2.0f;
  5. const float SmoothBlendTime = 0.75f;
  6. }

接下来,从我们在头文件中声明的 float 变量 TimeToNextCameraChange 中减去 DeltaTime

  1. // Called every frame
  2. void ACameraDirector::Tick(float DeltaTime)
  3. {
  4. Super::Tick(DeltaTime);
  5. const float TimeBetweenCameraChanges = 2.0f;
  6. const float SmoothBlendTime = 0.75f;
  7. TimeToNextCameraChange -= DeltaTime;
  8. }

之后,我们想要检查 TimeToNextCameraChange 是否小于或等于 0。如果为 true ,则通过将 TimeBetweenCameraChanges (设置回 2 秒添加到 TimeToNextCameraChange 。通过使用 UGameplayStatics 方法 GetPlayerController 获取 PlayerController 。通过获取 PlayerController ,我们可以设置它的视图目标。我们检查视图目标是否为 CameraOne ,并根据结果适当地切换摄像机。

  • 获取玩家控制器

    APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);

  • 平滑混合地设置摄像机目标

    OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);

  • 直接设置摄像机目标

    OurPlayerController->SetViewTarget(CameraOne);

下面是完整的 cpp 文件

  1. // Called every frame
  2. void ACameraDirector::Tick(float DeltaTime)
  3. {
  4. Super::Tick(DeltaTime);
  5. const float TimeBetweenCameraChanges = 2.0f;
  6. const float SmoothBlendTime = 0.75f;
  7. TimeToNextCameraChange -= DeltaTime;
  8. if (TimeToNextCameraChange <= 0.0f)
  9. {
  10. TimeToNextCameraChange += TimeBetweenCameraChanges;
  11. //Find the actor that handles control for the local player.
  12. APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
  13. if (OurPlayerController)
  14. {
  15. if (CameraTwo && (OurPlayerController->GetViewTarget() == CameraOne))
  16. {
  17. //Blend smoothly to camera two.
  18. OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
  19. }
  20. else if (CameraOne)
  21. {
  22. //Cut instantly to camera one.
  23. OurPlayerController->SetViewTarget(CameraOne);
  24. }
  25. }
  26. }
  27. }

CameraDirector actor拖放到场景中。将两个摄像机(或任何 actor)拖到场景中,并将它们设置为 CameraOneCameraTwo 。现在按下播放键,你就会看到你的视图目标从一个摄像头转到另一个。

20210729193651594.png

20210729192949897.gif

发表评论

表情:
评论列表 (有 0 条评论,535人围观)

还没有评论,来说两句吧...

相关阅读