.h
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/Actor.h"
#include "CameraDirector.generated.h"
UCLASS()
class HOWTO_AUTOCAMERA_API ACameraDirector : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACameraDirector();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
UPROPERTY(EditAnywhere)
AActor* CameraOne;
UPROPERTY(EditAnywhere)
AActor* CameraTwo;
float TimeToNextCameraChange;
};
.cpp
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#include "HowTo_AutoCamera.h"
#include "CameraDirector.h"
#include "Kismet/GameplayStatics.h"
// Sets default values
ACameraDirector::ACameraDirector()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void ACameraDirector::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void ACameraDirector::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
const float TimeBetweenCameraChanges = 2.0f;//间隔几秒开始进行相机切换
const float SmoothBlendTime = 0.75f;//相机切换所需的时间
TimeToNextCameraChange -= DeltaTime;//判断当前电脑的性能延迟
if (TimeToNextCameraChange <= 0.0f)//若延迟过高
{
TimeToNextCameraChange += TimeBetweenCameraChanges;//则加上一个相机切换时间
//Find the actor that handles control for the local player.
APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);//创建一个用于切换相机视角的玩家控制器
if (OurPlayerController)//若玩家控制器创建成功
{
if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr))//若要切相机去CameraOne,并且当前控制的相机不为CameraOne,且CameraOne是存在的,不为空的。
{
//Cut instantly to camera one.
OurPlayerController->SetViewTarget(CameraOne);//若满足以上条件则且相机至CameraOne
}
else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))//同理
{
//Blend smoothly to camera two.
OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);//且相机过度事件为SmoothBlendTime
}
}
}
}



