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

【虚幻】在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
授权:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值