赞
踩
- #include "Components/TimelineComponent.h"
- #include"Components/BoxComponent.h"
- UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyCurve")
- UCurveFloat* MyCurveFloat;
- UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyCurve")
- UTimelineComponent* MyTimeline;
- UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyScenceComponent")
- USceneComponent* MyScene;
- UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyScenceComponent")
- UStaticMeshComponent* MyDoorMesh;
- UPROPERTY(EditAnywhere,BlueprintReadWrite,Category = "MyScenceComponent")
- UBoxComponent* MyBox;
-
- FOnTimelineFloat TimelineDelegate;
- FOnTimelineEvent TimelineFinishedDelegate;
- UFUNCTION()
- void TimelineStart(float value);
- UFUNCTION()
- void TimelineFinished();
- UFUNCTION()
- void BeginOverlapFunction( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
- UFUNCTION()
- void EndOverlapFunction( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
再上篇的基础上,添加了StaticMeshComponent, UBoxComponent。和碰撞的三个函数。
构造函数中将组件的父子级关系设置好,静态加载Drremesh,再设置碰撞大小。
- // Sets default values
- AMyTimeLineActor::AMyTimeLineActor()
- {
- // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
- PrimaryActorTick.bCanEverTick = true;
- MyTimeline = CreateDefaultSubobject<UTimelineComponent>(TEXT("MyTimeLineComponent"));
- MyScene = CreateDefaultSubobject<USceneComponent>(TEXT("MySenceComponet"));
- MyBox = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBoxComponent"));
- MyDoorMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyStaticMeshComponet"));
- static ConstructorHelpers::FObjectFinder<UStaticMesh>TmpStaticMesh(TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Architecture/Wall_400x400.Wall_400x400'"));
- if (TmpStaticMesh.Succeeded())
- {
- MyDoorMesh->SetStaticMesh(TmpStaticMesh.Object);
- }
- //MyScene->SetupAttachment(RootComponent);
- RootComponent = MyScene;
- MyDoorMesh->SetupAttachment(MyScene);
-
- MyBox->SetupAttachment(MyScene);
- MyBox->SetBoxExtent(FVector(200,100,100));
- MyBox->SetRelativeLocation(FVector(200,0,0));
- }
将TimeLine进行代理绑定,将碰撞进行代理绑定。
- void AMyTimeLineActor::BeginPlay()
- {
- Super::BeginPlay();
- TimelineDelegate.BindUFunction(this,TEXT("TimelineStart")); //dailiyoucanshu
- TimelineFinishedDelegate.BindUFunction(this,TEXT("TimelineFinished"));
- MyTimeline->AddInterpFloat(MyCurveFloat,TimelineDelegate);
- MyTimeline->SetLooping(false);
- //MyTimeline->PlayFromStart();
- //MyTimeline->Play();
- MyTimeline->SetTimelineFinishedFunc(TimelineFinishedDelegate); //
-
- MyBox->OnComponentBeginOverlap.AddDynamic(this, &AMyTimeLineActor::BeginOverlapFunction);
- MyBox->OnComponentEndOverlap.AddDynamic(this, &AMyTimeLineActor::EndOverlapFunction);
- }
设置时间轴持续调用的,TimelineStart(float value)。其中value是 对应Time的曲线value。这里持续开门。开到90°
- void AMyTimeLineActor::TimelineStart(float value)
- {
- GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,FString::Printf(TEXT("Timelineplay %f"),value));
- float YawRotation = FMath::Lerp(0,90,value);
- MyDoorMesh->SetRelativeRotation(FRotator(0,YawRotation,0));
- }
-
- void AMyTimeLineActor::TimelineFinished()
- {
- GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Red,TEXT("TimelineFinshed"));
-
- }
判断是否是MyCharacter,再进行开门动画播放。离开时,倒过来播放
- void AMyTimeLineActor::BeginOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
- {
- AMyCharacter* TmpCharacter = Cast<AMyCharacter>(OtherActor);
- if (TmpCharacter)
- {
- MyTimeline->PlayFromStart();
- }
- }
-
- void AMyTimeLineActor::EndOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
- {
- AMyCharacter* TmpCharacter = Cast<AMyCharacter>(OtherActor);
- if (TmpCharacter)
- {
- MyTimeline->ReverseFromEnd();
- }
- //GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("TimelineFinshed"));
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。