Actor
-
打开C++的项目模板,在文件中新建C++类
-
UPROPERTY(EditAnywhere)——这是一种宏
用此修饰想要暴露在编辑器以便随时编辑的变量(显示在面板上)
UPROPERTY(EditAnywhere) AActor* CameraOne; UPROPERTY(EditAnywhere) AActor* CameraTwo;
UPROPERTY 宏使得变量对 虚幻引擎 可见。这样,当我们启动游戏或在将来的工作会话中重新载入关卡或项目时,这些变量中设置的值将不会被重置。我们还添加了 EditAnywhere 关键字,这允许我们在 虚幻编辑器 中设置摄像机1(CameraOne)和摄像机2(CameraTwo)。
-
CreateDefaultSubobject()
该函数是个模板函数,用于创建组件或子对象,然后返回指向新建组件内存区域的指针。
注意:
此函数只能在无参构造器中使用而不能在BeginPlay等函数中使用!
参数中的TEXT或者FName参数在同一个Actor中不能重复!
Tick function
-
如果我们不使用Tick function,我们可以将PrimaryActorTick.bCanEverTick设置成False
-
//获取当前Actor的位置 FVector Newlocation = GetActorLocation(); //这个值将在-1与1之间浮动 float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - DMath::Sin(RunningTime)) //z轴上下移动(幅度最大1*20) NewLocation.Z += DeltaHeight*20.0f; //将游戏运行时间记录下来 RunningTime += DeltaTime; //移动Actor到新的位置上 SetActorLocation(NewLocation);
-
时间增量(DeltaTime,重要概念)---------->结论(超链接)
Update(Unity) \ Tick(UE4)执行了1次,
transform.Translate(0, 0, 1/60 \* 10)
执行一次,物体移动了1/6米Update1秒内执行了60次,就是
transform.Translate(0, 0, Time.deltaTime \* 10)
乘以60次; 相当于 =(每帧时间1/60 * 速度 * 60)=10米Update1秒内执行了N次,就是
transform.Translate(0, 0, Time.deltaTime \* 10)
乘以N次; 相当于 =(每帧时间1/N * 速度 * N)=10米
Making a game
- UFUNCTION——UE4 C++使用UFUNCTION(函数)声明UFunction时指定函数相对于引擎和编辑器的各个方面的行为方式.
Cameras
- CameraDirector.h
#pragma once
#include "GameFramework/Actor.h"
#include "CameraDirector.generated.h"
UCLASS()
class HOWTO_AUTOCAMERA_API ACameraDirector : public AActor
{
GENERATED_BODY()
public:
// 为此Actor的属性设置默认值
ACameraDirector();
protected:
// 当游戏开始或生成时调用
virtual void BeginPlay() override;
public:
// 每一帧调用
virtual void Tick( float DeltaSeconds ) override;
UPROPERTY(EditAnywhere)
AActor* CameraOne;
UPROPERTY(EditAnywhere)
AActor* CameraTwo;
float TimeToNextCameraChange;
};
- CameraDirector.cpp
#include "HowTo_AutoCamera.h"
#include "CameraDirector.h"
#include "Kismet/GameplayStatics.h"
// 设置默认值
ACameraDirector::ACameraDirector()
{
// 将此Actor设置为每一帧调用Tick()。如果不需要,可以关闭此选项来提高性能。
PrimaryActorTick.bCanEverTick = true;
}
// 当游戏开始或生成时调用
void ACameraDirector::BeginPlay()
{
Super::BeginPlay();
}
// 每一帧调用
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;
//查找处理本地玩家控制的Actor。
APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0);
if (OurPlayerController)
{
if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr))
{
//立即切换到摄像机1。
OurPlayerController->SetViewTarget(CameraOne);
}
else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr))
{
//平滑地混合到摄像机2。
OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime);
}
}
}