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

举报
ShaderJoy 发表于 2021/11/18 23:35:12 2021/11/18
【摘要】 原教程是基于 UE 4.18,我是基于 UE 4.25】 英文原地址 接上一节教程,这是 Epic 的游戏控制摄像机教程的攻略教程。 创建一个名为 CameraDirector 的新角色。然后在头文件中添加三个变量。添加两个从 Actor 类继承而来的摄像机 actor。将 UPROPERTY 设置为 EditAny...

原教程是基于 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 。现在按下播放键,你就会看到你的视图目标从一个摄像头转到另一个。

 

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/119218576

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。