UE 学习笔记(三)在 C++ 中使用 Timeline

UE 学习笔记(三)在 C++ 中使用 Timeline

示例:利用Timeline制作箱子打开动画

思路:参考蓝图中使用 Timeline 的步骤

ps: 主要用来保存自己学习记录以便回顾,和给有一定基础的人看,纯小白可能一脸懵。

首先来回顾一下蓝图中如何使用Timeline

  1. 创建Timeline节点

在这里插入图片描述

  1. 双击进入,点击Track —— Add Float Track

在这里插入图片描述

  1. 设置关键帧

在这里插入图片描述

  1. 设置曲线,横轴是Time,纵轴是Value,例如示例我想在1s内让箱子盖打开110°,曲线设置如下。(在key处右键点击auto,即可设置曲线平滑)

在这里插入图片描述

  1. 注意,默认Timeline长度为5,即箱子1s钟后打开后,还有4s的timeline在运行,所以我们要将Timeline的长度设置为最后一帧。

在这里插入图片描述

  1. 至此就在蓝图中添加设置好了Timeline

在 C++ 中使用Timeline

​ C++中可以使用类 FTimeline 来实现。也可以在C++中给Actor挂在组件UTimelineComponent。

只展示与Timeline相关的部分代码!

Chest.h

public:
	FTimeline MyTimeline; // 声明FTimeline对象

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	UCurveFloat* Curver; // 声明曲线对象 (**)
public:
	UFUNCTION()
	void OnTimelineTick(float Output);	// Timeline 更新时调用

	UFUNCTION()
	void OnTimelineEndEvent(float Output); // Timeline 完成最后一帧后调用

注意上述代码的注释 (**) 处,这一步就是要在 Chest 的蓝图中,添加一个曲线,曲线用处呢就是 蓝图设置Timeline的步骤4,就是告诉Timeline在一个时间点,其值为多少

  • 创建 Curve 蓝图过程

    1. 内容浏览器中,右键选择

    在这里插入图片描述

    1. 设置步骤类似于蓝图的Timeline节点,设置曲线类似

      在这里插入图片描述

Curve蓝图创建好以后,继续写Chest的实现部分

Chest.cpp

void AChest::BeginPlay()
{
    
    
	Super::BeginPlay();
    
	if (Curver)  // 判断 曲线对象 是否存在 
	{
    
    
        /**
        	就像在蓝图中创建Timeline曲线一样,我们点击了 add Float Track, 所以我们曲线类型为float,所以我们使用float的曲线更新 delegate
        	FOnTimelineFloat 声明一个对象 OnTimelineFloatEvent
        	
        	Timeline结束最后一帧后的事件,我们使用 delegate:FOnTimelineEvent 声明对象 OnTimelineFinishedEvent
        **/
		FOnTimelineFloat OnTimelineFloatEvent;
		FOnTimelineEvent OnTimelineFinishedEvent;
		
        // 两个 delegates 分别 绑定要执行的函数,参数 this 指代在本对象中, TEXT("") 指的是 函数名
		OnTimelineFloatEvent.BindUFunction(this, TEXT("OnTimelineTick"));
		OnTimelineFinishedEvent.BindUFunction(this, TEXT("OnTimelineEndEvent"));
        // 这一步暂时不知道怎么解释,就是Timeline添加曲线,和开始时所执行的函数
		MyTimeline.AddInterpFloat(Curver, OnTimelineFloatEvent);
        // 如同蓝图设置Timeline一样,设置Timeline的长度为最后一帧
		MyTimeline.SetTimelineLength(ETimelineLengthMode::TL_LastKeyFrame);
        // 设置Timeline结束后执行的函数
		MyTimeline.SetTimelineFinishedFunc(OnTimelineFinishedEvent);
	}
}

void AChest::Tick(float DeltaTime)
{
    
    
	Super::Tick(DeltaTime);
    /*
    	注意:这里就是FTimeline 和 UTimelineComoponent 在使用上的一个区别,FTimeline需要在Tick中设置TickTimeline为DeltaTime,否则运行不会有效果
    	而 UTimelineComponent 在其本身 TickComponent() 中,调用了 TickTimeline,所以无需这一步。
    */
	MyTimeline.TickTimeline(DeltaTime); 
}

void AChest::OnTimelineTick(float Output)
{
    
    
	// ...... do something on Timeline update
}

void AChest::OnTimelineEndEvent()
{
    
    
	// ..... do something on Timeline Finished
}

ps. FTimeline 和 UTimelineComponent 还有一个在使用上需要注意的点就是

// 如果使用 UTimelineComponent 则需要在添加Timeline的Actor的构造函数中创建该Component
// .h:
UTimelineComponent* MyTimeline;
// .cpp:
MyTimeline = CreateDefaultSubobject<UTimelineComponent>(TEXT("Timeline"));

最后:在Chest 这个 Actor 的蓝图面板的默认设置里,要选择你之前创建好的曲线蓝图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Vonem/article/details/127073434