Advertisement

UE C++学习笔记: 时间轴组件Timeline

阅读量:

变量声明

复制代码
    //包含必要头文件
    #include "Components/TimelineComponent.h"
    
    //声明变量:浮点数曲线
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="MyTime")
    UCurveFloat* MyCurveFloat;
    //声明变量:时间轴组件
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="MyTime")
    UTimelineComponent* MyTimelineComponent;
    
    
      
      
      
      
      
      
      
      
      
    

事件声明

声明委托变量、及即将用于绑定的函数

复制代码
    //这个委托格式是Timeline组件中定义的。表示由 Float触发的事
    FOnTimelineFloat TimelinePlay_Delegate;  
    //这个是 Finish结束时触发的事
    FOnTimelineEvent TimelineFinished_Delegate;  
    
    //声明两个和上面委托入参一致的函数,用于绑定
    UFUNCTION()  
    void FunHua_TimelinePlay(float Output);  
    UFUNCTION()  
    void FunHua_TimelineFinished();
    
    
      
      
      
      
      
      
      
      
      
      
    

函数的实现如下:

复制代码
    void AMyTimelineActor::FunHua_TimelinePlay(float Output)
    {
    //让Mesh组件随着float输出0~1混合的位置进行上下移动
    	FVector TempVector = FMath::Lerp(FVector(0, 0, 0), FVector(0, 0, 300), Output);
    	MyStaticMesh->SetRelativeLocation(TempVector);
    	//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red,TEXT("TImeLine开始"));
    }
    
    void AMyTimelineActor::FunHua_TimelineFinished()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red,TEXT("TImeLine结束"));
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
    

事件绑定

构造函数中创建组件

复制代码
    MyTimelineComponent = CreateDefaultSubobject<UTimelineComponent>(TEXT("MyTimelineComponent"));
    
    
      
    

BeginPlay中进行时间轴事件的绑定

复制代码
    //对定义的委托变量Play_Delegate绑定函数
    TimelinePlay_Delegate.BindUFunction(this,TEXT("FunHua_TimelinePlay"));
    //对定义的委托变量Finish_Delegate绑定函数	
    TimelineFinished_Delegate.BindUFunction(this,TEXT("FunHua_TimelineFinished"));
    
    //添加Float曲线。传参是(Float曲线,Play的委托)
    MyTimelineComponent->AddInterpFloat(MyCurveFloat, TimelinePlay_Delegate);
    
    //将定义的委托变量Finish_Delegate设置为时间轴Finish时的事件,传参数是Delegate  
    MyTimelineComponent->SetTimelineFinishedFunc(TimelineFinished_Delegate);  
    
    //设置速率
    MyTimelineComponent->SetPlayRate(5.f);
    //设置循环
    MyTimelineComponent->SetLooping(false);
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

到这里,事件就算绑完了。
可以通过手动调用时间轴的Play、Reverse函数来调用到定义的两个函数。

复制代码
    MyTimelineComponent->PlayFromStart();
    MyTimelineComponent->Reverse();
    
    
      
      
    

拓展:由触发盒调用Timeline

.h中增加Box及Overlap委托

复制代码
    //组件声明
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="MyTime")
    UBoxComponent* MyBoxCollision;
    //定义函数。用于绑定:BeginOverlap
    UFUNCTION()
    void FunHua_BeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep,const FHitResult& SweepResult);
    //定义函数。用于绑定:EndOverlap
    UFUNCTION()
    void FunHua_EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
    
    
    
      
      
      
      
      
      
      
      
      
      
    

.cpp中实现函数及绑定到委托

复制代码
    //构造函数
    //初始化MyBoxCollison
    MyBoxCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBoxCollision"));
    MyBoxCollision->SetupAttachment(RootComponent);
    MyBoxCollision->SetBoxExtent(FVector(200, 100, 100));
    MyBoxCollision->SetRelativeLocation(FVector(300.f, 0.f, 100.f));
    
    //绑定Overlap触发事件
    MyBoxCollision->OnComponentBeginOverlap.AddDynamic(this, &AMyTimelineActor::FunHua_BeginOverlap);
    MyBoxCollision->OnComponentEndOverlap.AddDynamic(this, &AMyTimelineActor::FunHua_EndOverlap);
    
    //函数实现
    //BeginOverlap
    void AMyTimelineActor::FunHua_BeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep,const FHitResult& SweepResult)
    {
    	AMyCharacter* TempCharacter = Cast<AMyCharacter>(OtherActor);
    	if (TempCharacter)
    	{//调用时间轴的Play
    		MyTimelineComponent->PlayFromStart();
    	}
    }
    //EndOverlap
    void AMyTimelineActor::FunHua_EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
    {
    	AMyCharacter* TempCharacter = Cast<AMyCharacter>(OtherActor);
    	if (TempCharacter)
    	{//调用时间轴的Reverse
    		MyTimelineComponent->Reverse();
    	}
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

蓝图中操作

需要创建一个Float曲线,并对Timeline上的曲线进行赋值。
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~