虚幻学习笔记19—C++中使用时间轴

一、前言

      在蓝图中可以很容易的创建一个时间轴,如图1.1.1所示为一个新建的时间轴,双击时间轴可以添加不同的轨道,分别有浮点、向量和事件,具体的可以自己去玩玩,这个在虚幻的开发中是非常常用的,最后创建的时间轴要绑定到一个事件中触发。

图1.1.1

在C++代码中也会经常用到时间轴,本案例中将通过时间轴创建一个开关门的效果。

        本系列使用的虚幻5.2.1,VS2022。

二、实现

2.1、创建一个简单的定时器

1、创建一个新的类命名为“MyTimelineActor”,添加头文件然后创建时间轴变量,代码如下:

#include "TimerManager.h"//定时器头文件

	//定时器变量
	FTimerHandle Time;
	void PrintTime();

并创建一个后面要用到的回调打印函数。

2、然后在类的开始事件中使用,代码如下,这样就可以得到一个简单的定时器函数:每隔1秒执行“PrintTime"函数。

void AMyTimelineActor::BeginPlay()
{
	Super::BeginPlay();	

//每个固定秒打印,最后两个参数分别为间隔事件和是否循环
	GetWorld()->GetTimerManager().SetTimer(Time, this, &AMyTimelineActor::PrintTime, 1.0f, true);
}

//实现打印函数
void AMyTimelineActor::PrintTime()
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("Time"));
}

3、清除定时器

        清除的代码如下,可以在任何触发后的函数中执行如下代码,之后上述的定时器即可停止。

	清除时间
	if (Time.IsValid())
	{
		GetWorld()->GetTimerManager().ClearTimer(Time);
	}
2.2、创建时间轴

1、需要添加头文件,通过蓝图的时间轴我们可以明白,时间轴中最重要的是曲线也即图1.1.1中创建的轨道,这里要先定义这个变量,然后再在创建的蓝图中绑定曲线,另外我们还需要创建一个门,所以还需要一个静态网格的变量,最后还有开始和结束的处理函数,完整的代码如下

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyCharacter1.h"
#include "Components//BoxComponent.h"
#include "Components/TimelineComponent.h"
#include "MyTimelineActor.generated.h"

UCLASS()
class CHAPTER2_API AMyTimelineActor : public AActor
{
	GENERATED_BODY()

public:
	// Sets default values for this actor's properties
	AMyTimelineActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:
	// Called every frame
	virtual void Tick(float DeltaTime) override;


	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timeline")
	UCurveFloat* CurveFloat;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timeline")
	UTimelineComponent* Timeline;

	FOnTimelineFloat TimelineDelegate;//一开始的绑定
	FOnTimelineEvent FinishedDelagate;//完成时的绑定

	UFUNCTION()
	void TimelineStart(float valuee);
	UFUNCTION()
	void TimelineFinished();

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timeline")
	USceneComponent* Scene;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timeline")
	UStaticMeshComponent* StaticMesh;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timeline")
	UBoxComponent* Box;
}

2、在CPP文件中先添加网格组件,然后设置开始方法和结束方法的逻辑分别对应开关门,也即旋转门到一定角度,代码如下

void AMyTimelineActor::TimelineStart(float valuee)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, FString::Printf(TEXT("Timeline Play:%f"), valuee));
	//旋转,绕着固定轴插值旋转
	float tempYawRot = FMath::Lerp(0, 90, valuee);
	StaticMesh->SetRelativeRotation(FRotator(0, tempYawRot, 0));
}

void AMyTimelineActor::TimelineFinished()
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("Timeline Finished"));
}

3、在整个类的开始事件中绑定上述两个方法并执行时间轴的运行方法,设置是否循环,代码如下。

void AMyTimelineActor::BeginPlay()
{
	Super::BeginPlay();

	TimelineDelegate.BindUFunction(this, TEXT("TimelineStart"));
	FinishedDelagate.BindUFunction(this, TEXT("TimelineFinished"));
	//设置浮点曲线
	Timeline->AddInterpFloat(CurveFloat, TimelineDelegate);
	Timeline->SetLooping(true);
	Timeline->PlayFromStart();
	Timeline->Play();
	Timeline->SetTimelineFinishedFunc(FinishedDelagate);
}

4、编译成功后创建一个上述类的蓝图“BP_TimelineActor”,然后创建一个浮点曲线”TimelineCurve“,如图2.2.1所示,

图2.2.1

在浮点曲线中添加两个关键帧分别为(0,0)和(1,1),然后将这个新建的”浮点曲线“拖动到”BP_TimelineActor“蓝图中的曲线变量里,如图2.2.2所示

图2.2.2

注:如果没有这个变量运行的时候会导致崩溃。

5、这样得到的效果如图2.2.3所示,门会循环往复的开关,图中每次都是从起始位置重新打开,如

图2.2.3

果要实现关闭的效果要用到方法,这个函数的意思是从结束的地方反着再执行一边。

Timeline->ReverseFromEnd();//从后面往前播放

三、总结

3.1、简单的事件定时器可以绑定执行中的函数,而时间轴可以绑定开始和结束的函数。

3.2、简单定时器需要代码中清除,否则会一直执行,时间轴设置好时间曲线里的时间,在该时间内执行完会自动关闭,除非设置了循环。

3.3、时间轴可以通过反向执行函数实现一些特有的反方向操作,比如关门等。

3.4、    UCurveFloat* CurveFloat;是一个变量,定义了后一定要在后续的蓝图中绑定曲线蓝图,否则会直接崩溃。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260280.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习使用echarts图表中formatter的用法,格式化数字金额,控制x轴、y轴展示长度

学习使用echarts图表中formatter的用法,格式化数字金额,控制x轴、y轴展示长度 控制金额长度两位小数,并去除多余.00效果图 控制文字长度完整代码 控制金额长度 series: [{name: ,type: bar,sort: none,label: { //饼图图形上的文本…

【开源软件】最好的开源软件-2023-第四名 vaadin

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

【游戏篇】Scratch之饥饿的鱼

【作品展示】饥饿的鱼 操作:点击小绿旗,按下键盘方向或者利用鼠标移动,躲避大鱼的同时还要想办法吃到小鱼。

【C++高阶(八)】单例模式特殊类的设计

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 单例模式 1. 前言2. 设计一个不能被拷贝/继承的…

外贸业务员该如何写好一份有质感的年终总结?内附外贸大神例文

庄子云:人生天地之间,若白驹之过隙,忽然而已... 2023年注定是不平凡的一年,临近年终,你可能听到最多的关键词就是外贸有点难做。不管是因为什么,客观来说2023年的外贸之路确实不太平坦,最近胡塞…

4. 行为模式 - 中介者模式

亦称: 调解人、控制器、Intermediary、Controller、Mediator 意图 中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建…

Catboost算法助力乳腺癌预测:Shap值解析关键预测因素

一、引言 乳腺癌是一种常见的恶性肿瘤,对女性健康和生命造成严重威胁。乳腺癌的预测和治疗是当前研究的热点和难点。传统的预测方法主要基于临床病理学特征,但准确率有待提高。随着机器学习技术的发展,数据驱动的预测方法逐渐受到关注。Catbo…

由浅入深,一文读懂网络知识文集。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

【SpringMVC】SpringMVC的请求与响应

文章目录 0. Tomcat环境的配置1. PostMan工具介绍创建WorkSpace建立新的请求 2. 请求映射路径案例结构与代码案例结构案例代码 案例存在问题解决方案方法方法升级版——配置请求路径前缀注解总结 3. Get请求与Post请求案例结构与案例代码案例结构案例代码 Get请求Post请求接收中…

熔断,降级,限流

文章目录 熔断概念为什么需要熔断熔断器模型熔断策略 降级概念熔断和降级的关系熔断降级限时降级限流降级 参考文章 熔断和降级都是自我保护的一种机制,但二者又有所不同。 熔断 概念 “熔断”一词早期来自股票市场。熔断[Circuit Breaker]也叫自动停盘机制&#…

Gradle 简单入门

Gradle简单介绍: Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。面向Java应用…

【GoLang】哪些大公司正在使用Go语言

你见过哪些令你膛目结舌的代码技巧? 文章目录 你见过哪些令你膛目结舌的代码技巧?前言:哪些大公司正在使用Go语言谷歌(Google):脸书(Facebook):亚马逊(Amazon…

TikTok手工艺新潮流:小视频中的手作乐趣

随着短视频平台的兴起,TikTok以其独特的创意和活力,成为了全球用户分享生活、展示才华的热门平台之一。本文将深入探讨TikTok上涌现的手工艺潮流,揭示小视频中的手作乐趣如何成为一种全新的艺术表达方式。 TikTok手工艺的独特之处 TikTok提供…

实验一传统的结构化的软件工程方法、实验二面向对象的软件工程、实验三软件测试

背景: 实验一 传统的结构化的软件工程方法 1实验目的 了解传统的软件工程方法的基本原理,掌握软件生命周期的全过程依次划分为需求分析、总体设计、详细设计、编码、测试、维护等几个重要阶段。每个阶段所要完成的任务以及提交的文档。 2实验内容 …

32 在Vue3中如何同时定义多个插槽

概述 当你想要给外部预留多个位置的时候,具名插槽就非常有用了。 比如,我们定义一个卡片,让别人使用的时候,标题可以自定义,内容也可以自定义,这个时候就需要两个插槽。 基本用法 我们创建src/componen…

行业前景咋样?大厂找我用C++抓取化工产品数据并分析

最近又来活了,天天忙到半夜,但是想想收益还是再坚持坚持。是这么一回事,兄弟所在的化工公司最近想看看某些行业数据,看看市面的同类型产品销量收益等情况是否满足预期效果,也就找到我让我给用爬虫写一个采集并分析的报…

基于Java SSM框架实现教学质量评价评教系统项目【项目源码+论文说明】

基于java的SSM框架实现教学质量评价评教系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,教学质量评价系统当然也不能排除在外。教学质量评价系统是以实际运用为…

机器学习 | 密度聚类和层次聚类

密度聚类和层次聚类 密度聚类 背景知识 如果 S 中任两点的连线内的点都在集合 S 内,那么集合 S称为凸集。反之,为非凸集。 DBSCAN 算法介绍 与划分和层次聚类方法不同,DBSCAN(Density-Based Spatial Clustering of Applications with Noi…

【模式识别】解锁降维奥秘:深度剖析PCA人脸识别技术

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《模式之谜 | 数据奇迹解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1 初识模式识…

MySQL基本操作 DDL DML DQL三大操作介绍

DDL 数据(结构)定义 创建表DML 数据操作 增删改DQL 查询语句 DDL 数据(结构)定义 创建表 创建 删除数据 注释 --空格内容 创建数据库 CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8]eg:CREATE DATABASE IF NOT EXISTS school CHARSET utf8如果对应school不存在,…