【虚幻】在UE4使用c++的Timeline和Curve制作动画

2023-10-27

【虚幻】在UE4使用c++的Timeline和Curve制作动画

想用c++在UE4里面写一个动画,Google了一番,大部分都是讲骨骼动画的,后来在文档里面找到了一种不需要骨骼的动画方式,给大家介绍一下。

动画的必备要素

  • 动画曲线
    用于控制动画数值的变化趋势,在UE4中对应Curve概念,即下图中的曲线
    如何创建Curve

  • 动画控制
    用于控制动画的开始、结束以及设置对应的事件处理函数,在UE4中对应Timeline概念。

Curve

UE4中的曲线有三种类型:

  • CurveFloat
    单值变化曲线,编辑器中的纵轴用于描述值的相对大小,横轴用于描述时间。值的大小可以理解为系数,具体使用的时候需要用它乘以需要变化的数值(如x坐标、y坐标、z坐标)。假如值的范围是0.5到1.5,应用到一个物体的缩放属性,那么这个物体将在0.5到1.5倍大小的范围内进行缩放。
    单值曲线

  • CurveVector
    多值变化曲线,相当于三个数值同时变化的单值曲线。

  • CurveLinearColor
    颜色渐变曲线,相当于四个数值同时变化的单值曲线,不过它的四个值分别用来表达色彩的RGBA四个通道,编辑器的上方也会显示出颜色的渐变效果。

Timeline

  • TimeLine
    核心结构体,头文件位于Runtime\Engine\Classes\Components\TimelineComponent.h详细信息可以自行查阅。在此列举几个常用方法:
// 从头开始播放动画
PlayFromStart()
// 设置循环播放
SetLooping()
// 设置播放速率
SetPlayRate()
// 设置动画长度
SetTimelineLength()
// 设置数值曲线
SetFloatCurve()
// 设置数值变化响应函数
SetTimelinePostUpdateFunc()
  • TimelineComponent
    基于Timeline封装的组件类,提供了蓝图调用接口,和Timeline的方法大体相同,下文将使用它实现示例。

调用流程

  1. 给Actor增加CurveTimelineComponent成员属性。
  2. 加载Curve&设置Timeline属性&回调。
  3. 在OnTick中调用TickComponent()

代码示例

// ADog.h

UCLASS()
class Demo_API ADog: public AActor {
protected:
    UPROPERTY()
    UTimelineComponent* MyTimeline;

    UPROPERTY()
    UCurveFloat* FloatCurve;
    
    // 注意这里一应要用UFUNCTION(),因为后面使用了onTimelineFinishedCallback.BindUFunction
    UFUNCTION()
    void TimelineCallback(float val);

public:

    ADog();
};

// ADog.cpp

ADog::ADog()
{
    // 需要在构造函数加载编辑好的数值曲线,一定要确保加载路径正确
    static ConstructorHelpers::FObjectFinder Curve(TEXT("/Game/曲线名称"));
   
    if (Curve.Succeeded()) FloatCurve = Curve.Object;
 }

void ADog::BeginPlay()
{
    Super::BeginPlay();
    
    FOnTimelineFloat onTimelineCallback;

    // 必须要在BeginPlay里面初始化Timeline
    MyTimeline = NewObject<UTimelineComponent>(this, FName("TimelineAnimation"));

    // 设置数值更新回调委托
    onTimelineCallback.BindUFunction(this, FName{ TEXT("TimelineCallback") });
    // 设置数值曲线&数值更新回调函数
    MyTimeline->AddInterpFloat(FloatCurve, onTimelineCallback);

    // 注册组件
    MyTimeline->RegisterComponent();
    
    // 开始播放动画
    MyTimeline->PlayFromStart();
}

void ADog::Tick(float deltaTime)
{
    Super::Tick(deltaTime);
    
    // 下面这行必须调用,否则无法触发下面的TimelineCallback函数,动画也就无从实现了
    MyTimeline->TickComponent(deltaTime, ELevelTick::LEVELTICK_TimeOnly, NULL);
 }

void ADog::TimelineCallback(float Value)
{
    // 函数的入参Value就在单值曲线的纵轴区间变化,上文有提到,我在这里直接拿它做个缩放,你也可以干别的
    auto S = new FVector(Value);
    this->SetActorScale3D(*S);
}

可以从参考链接中找出完整代码。


参考链接


作者:脆皮猪
来源:CSDN
授权:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【虚幻】在UE4使用c++的Timeline和Curve制作动画 的相关文章

  • 快速应用图像的 uibutton 动画

    我想通过依次更改按钮上的两个图像来应用动画效果 我已经应用了以下代码 但无法看到动画效果 我已经正确应用了 IBOutlets var image1 UIImage UIImage named img mic off var image2
  • 带图像的 SVG 进度条

    我正在尝试使用 SVG 创建进度条 弧 我目前的进度条正在工作 它正在使用存储在数据属性中的值移动所需的量 并且看起来相当不错 虽然我试图让图像随着酒吧的弧线移动 图像应从 0 开始 并移动到完成点 例如 50 即位于顶部 div clas
  • iPhone 就像在 Silverlight ListBox 上滚动一样

    我需要一个具有类似 iPhone 功能的 Silverlight 列表框 也就是动画滚动 点击拖动滚动 在鼠标释放事件之后 滚动将根据拖动的 速度 继续进行一段时间 我搜索过 没有找到提供此功能的控件供应商 那么问题是我应该如何构建它 我需
  • 如何在某个点(75%)开始动画?

    我接听这个问题 https stackoverflow com questions 69888696 how to reasonably animate font awesome lock icons 到目前为止我所拥有的 lock cli
  • 如何在 SwiftUI 中为按下时的导航链接设置动画?

    我试图通过在按下 NavigationLink 时提供一些反馈来改进用户体验 我的意思是一个简单的动画 它会增长然后缩小链接以显示它被按下或以任何其他方式提供反馈 这是我正在尝试改进的代码 NavigationLink destinatio
  • 如何在滚动时实现图像淡入效果(如 mashable.com)

    我想知道 mashable com 上图像的淡入效果 请参阅http mashable com 2009 08 14 google android logo remixes http mashable com 2009 08 14 goog
  • Javascript:如何实现异步函数队列(无需库)

    我一直在搜索谷歌和SO 但由于某种原因我很难解决这个问题 只是强调一下 我不想加载像 JQuery 这样的库 因为我不需要它的大部分内容 当我could使用动画库 我已经构建了我自己需要的几个函数 其中一些甚至不是您在库中找到的标准动画 所
  • gnuplot 动画 2D 矢量场

    我正在尝试使用 gnuplot 制作 2D 矢量动画 我想显示一行 即一次显示一个向量 我的数据结构如下 它们x y u v 2 24448 0 270645 1 00 1 00 3 24448 0 270645 0 500 1 20 我可
  • SVG 元素绕圆旋转

    所以我有一个 SVG 元素 大圆圈 和里面的一组元素 我想围绕这个大圆圈旋转这些元素 代码非常简单 但我已经开始担心如何在正确的路径 大圆圈 上设置这个圆圈 graph skils 正如您在下面的链接中看到的 这个小圆圈在大圆圈上旋转不正确
  • 如何在两个动画画布元素之间进行通信?

    我想在两个动画画布元素之间进行通信 我使用 Adob e Animate CC 制作了两个 html5 canvas js 动画 我已将这两个元素放入一个 html 页面中 我可以成功地从这些动画中调用函数 在下面的代码中成功触发了警报 我
  • Qt - 如何在 QGraphicsPixmapItem 中显示 gif(动画)图像

    我正在尝试在 QGraphicsPixmapItem 中使用一张闪烁的图像 显示的图像没有动画效果 下面是原始图像 下面是在 QGraphicsPixmapItem 中使用此图像的 QGraphicsScene 有人能说一下如何实现这一目标
  • SwiftUI withAnimation 完成回调

    我有一个基于某种状态的 swiftUI 动画 withAnimation linear duration 0 1 self someState newState 上述动画完成时是否会触发任何回调 如果有关于如何在 SwiftUI 中使用完成
  • 如何在 Android 中从 JPEG 创建动画 GIF(开发)

    我正在寻找一种简单的方法create本机 Android 应用程序中的动画 GIF 源文件应为 JPEG 来自相机或其他文件 输出应在设备上保存为 GIF 我不想知道如何播放动画或动画 GIF 文件 需要明确的是 我想知道如何将单个图像逐帧
  • 自定义 UITableViewRowAnimation 或持续时间

    我有一个用户可以拖动的应用程序UITableViewCells从一TableView到另一个 我通过在用户触摸的 UITableViewCell 顶部渲染一个 虚拟 单元格来实现此目的 并禁用 真实 单元格 然后我在目标中插入一个新行UIT
  • 如何重新启动/重置 Jquery 动画

    如何在 jquery 中重置动画 例如 CSS block position absolute top 0 left 0 JS block animate left 50 top 50 如果我做 block stop 动画将停止 但我怎样才
  • 如何使用 jQuery 在第二次单击时反转 CSS 动画

    我制作了以下菜单图标 CSS 动画 当我点击它时会触发它 当我使用 jQuery 第二次单击它时 我想使其反向动画 path1 stroke dasharray 33px stroke dashoffset 33px animation l
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 如何正确删除动画集中引用的 Raphael SVG 元素?

    我有一组动画 Raphael SVG 元素 我正在通过用户发起的 ajax 调用添加新元素并删除旧元素 我 set push 新元素 但因为我需要删除的元素通常不是集合中的最后一个元素 所以我使用 element remove 而不是 se
  • 在 Gnuplot 中填充数据曲线下方的几个部分

    我有一组点 数据 定义一条曲线 我想用贝塞尔曲线平滑绘制该曲线 所以我想填充一些 x 值对之间的曲线下方的区域 如果我只有一对 x 值 那么这并不困难 因为我定义了一组新数据并用 fillcu 绘制它 例子 问题是我想在同一个情节中多次这样
  • Air for Android:动画导致我的游戏出现滞后

    我正在为 android 平台制作一款 cs6 air 游戏 当我为游戏制作动画时 我使用 3D 软件搅拌器 在 Blender 中 我制作了一个动画 然后将其渲染为一系列 PNG 图像 并将其导入到 Flash CS6 中 因此 如果我要

随机推荐

  • C++获取当前时间 (std::chrono)

    在C 11之前要获取当前时间 大多数情况下要使用C语言的time库 include
  • vue.config.js文件配置devServer和devServer.proxy多个代理地址

    如何在vue config js文件配置属性devServer和devServer proxy配置多个代理地址 如下所示 比如 封装请求方法格式 可以略过 module exports outputDir dist 打包后输出文件名称 以及
  • vue-amap 定位和逆解码

    1 安装 npm install vue amap save 2 main js引入 import VueAMap from vue amap Vue use VueAMap VueAMap initAMapApiLoader key ke
  • 向量与矩阵的相乘

    向量与矩阵的相乘 2016年07月31日 10 00 55 阅读数 2253 在学习计算机图形学的时候 最常遇到的就是矩阵的乘法了 下面我们就简单的介绍下 使用程序如何编写两个矩阵的相乘呢 其实这个问题 大一的孩子都会写的 不是很难的 但是
  • 【文本信息处理】网络文本访问和处理+分词

    一 网络文本访问和处理 1 re findall 返回string中所有与pattern匹配的全部字符串 返回形式为数组 def findall pattern string flags 0 Return a list of all non
  • unity 实现Android端视频在UI上播放

    之前unity实现在RawImage上播放视频主要是通过movieTexture 而现在这个方法已经被抛弃 采用VideoPlayer来实现 实现的原理是将VideoPlayerd的视频渲染到UGUI的RawImage上 private V
  • 【C++拾遗之八】#pragmaonce与#ifndef的用法总结

    宏定义 一 两种宏定义的功能 二 两种宏定义的用法 三 两种宏定义的区别 一 两种宏定义的功能 ifndef 和 pragma once都是C C 中的两种宏定义 它们的作用是为了避免同一个头文件被多次包含 include note 只能保
  • Nginx入门笔记

    目录 Nginx 快速入门 1 启动 停止和重新加载 Nginx 配置 2 配置文件的结构 3 提供静态内容服务 静态网站 4 设置简单的代理服务器 5 设置 FastCGI 代理 Nginx 进程和运行时控制 1 主进程和工作进程 2 控
  • idea 配置(下载) golang 环境 GOROOT、GOPATH

    windows 10 平台 golang镜像下载地址 https gomirrors org 选择稳定版的windows amd64 msi或者zip zip 解压到目录即可 msi 打开直接安装 配置环境变量 高版本有的会自己配置环境变量
  • [定向爬虫] 网络爬虫实例2-淘宝定向爬虫

    import requests import re import time 获取html页面 def getHTMLText url try r requests get url timeout 30 r raise for status
  • 【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.stop()

    MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器 与常规Python相比 MicroPython解释器体积小 仅100KB左右 通过编译成二进制Executable文件运行 执行效率较高 它使用
  • 一文了解电商大促系统的高可用保障思路

    本文面向受众可以是运营 可以是产品 也可以是研发 测试人员 作者希望通过如下思路 知历史 gt 清家底 gt 明目标 gt 定战略 gt 做战术 gt 促成长 帮助大家能够了解电商大促系统的高可用保障 减少哪些高深莫测的黑话和高大尚的论调
  • 【linux】linux中fork()详解(实例讲解)

    目录 linux中fork 函数详解 从一道面试题谈linux下fork的运行机制 linux中fork 函数详解 原文 linux中fork 函数详解 原创 实例讲解 jason314的博客 CSDN博客 fork 函数 一 fork入门
  • Conda 创建和删除虚拟环境

    1 检验当前conda的版本 conda V 2 conda常用的命令 查看已有的虚拟环境 conda env list 创建虚拟环境和删除虚拟环境 anaconda命令创建python版本为x x 名字为env name的虚拟环境 env
  • 微信小程序授权获取头像昵称的最新形式——头像昵称填写

    微信小程序授权用户信息 不知道有没有人像我一样 从wx getUserInfo到wx getUserProfile再到头像昵称填写获取用户头像昵称全部尝试了一遍 怪就怪自己一开始没仔细看官方文档 没注意到小程序的官方公告 不多说了 整理一下
  • LCD图片显示、触摸屏、音乐播放、缩放图片和播放视频

    一 GEC6818开发板的LCD 1 LCD 1 原理 LCD屏幕是由一个个像素组成的 横向像素个数和纵向像素个数是LCD的一个重要指标 称为像素分辨率 当前举例开发板的分辨率是 800X480 LCD显示从屏幕左上角的像素开始 直到右下角
  • C0223 [2015普及组-B]扫雷游戏-C语言写

    题目描述 扫雷游戏是一款十分经典的单机小游戏 在n行m列的雷区中有一些格子含有地雷 称之为地雷格 其他格子不含地雷 称之为非地雷格 玩家翻开一个非地雷格时 该格将会出现一个数字 提示周围格子中有多少个是地雷格 游戏的目标是在不翻出任何地雷格
  • wget命令详解,断点续传

    1 支持断点下传功能 2 同时支持FTP和HTTP下载方式 3 支持代理服务器 4 设置方便简单 5 程序小 完全免费 wget虽然功能强大 但是使用起来还是比较简单的 基本的语法是 wget 参数列表 URL 下面就结合具体的例子来说明一
  • CSDN新星计划/原力计划来喽,对此你有何期待

    文章目录 写在前面 新星计划 独自开 原力计划 横穿全年的计划 写在最后 写在前面 哈喽 大家好 我是几何心凉 这是一份全新的专栏 得到CSDN王总的授权 来对于我们每周四的绿萝时间 直达CSDN 直播内容进行总结概括 让大家能够省去看直播
  • 【虚幻】在UE4使用c++的Timeline和Curve制作动画

    文章目录 虚幻 在UE4使用c 的Timeline和Curve制作动画 动画的必备要素 Curve Timeline 调用流程 代码示例 虚幻 在UE4使用c 的Timeline和Curve制作动画 想用c 在UE4里面写一个动画 Goog