UE4_C++_001

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);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值