UE4c++4來回移動加上倒計時後恢復原來顏色
阿新 • • 發佈:2020-11-23
//h裡面的程式碼 #pragma once #include "CoreMinimal.h" #include "Engine/StaticMeshActor.h" #include "TargetStaticMeshActor.generated.h" /** * */ UCLASS() class LEAMCPP_API ATargetStaticMeshActor : public AStaticMeshActor { GENERATED_BODY() UFUNCTION() void NotifyHitCallBack();//Tick呼叫的函式 UFUNCTION()void TickCallBack();//Tick呼叫的函式 FVector Direction; public: //一下兩個函式是被擊中顏色交替變化 UPROPERTY(EditDefaultsOnly, Category = "TargetSetting") UMaterialInterface* TargetRed; UPROPERTY(EditDefaultsOnly, Category = "TargetSetting") UMaterialInterface* TBlue; UPROPERTY(EditDefaultsOnly, Category= "TargetSetting") UMaterialInterface* Tyuan;//倒計時後恢復的顏色 ATargetStaticMeshActor(); virtual void NotifyHit(class UPrimitiveComponent* MyComp, AActor* Other, class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse,const FHitResult& Hit) override; virtual void Tick(float DeltaSeconds) override;//重寫Tick方法 };
//CPP裡面的程式碼 // Fill out your copyright notice in the Description page of Project Settings. #include "TargetStaticMeshActor.h" #include "Engine/Engine.h" #include "LeamCppProjectile.h" #include "Kismet/KismetSystemLibrary.h" #include "Engine/LatentActionManager.h" #include "GameFramework/Actor.h" #include "Kismet/KismetMathLibrary.h" void ATargetStaticMeshActor::NotifyHitCallBack()//倒計時後自動切換顏色 { class UStaticMeshComponent* staticMesh = GetStaticMeshComponent(); staticMesh->SetMaterial(0, Tyuan); } ATargetStaticMeshActor::ATargetStaticMeshActor() { PrimaryActorTick.bCanEverTick = true;//Tick是否被啟用 Direction = FVector(0, -10, 0);//向量初始 化 } static bool Ifc=true; void ATargetStaticMeshActor::NotifyHit(class UPrimitiveComponent* MyComp, AActor* Other, class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) { Super::NotifyHit(MyComp, Other, OtherComp, bSelfMoved, HitLocation, HitNormal, NormalImpulse, Hit); if (Other == nullptr) return; ALeamCppProjectile* projectile = Cast<ALeamCppProjectile>(Other); if (projectile != nullptr) { class UStaticMeshComponent* staticMesh = GetStaticMeshComponent(); FLatentActionInfo LatentInfo; LatentInfo.Linkage = 0; LatentInfo.CallbackTarget = this;//作用物件 LatentInfo.ExecutionFunction = "NotifyHitCallBack";//繫結函式名稱 LatentInfo.UUID = __LINE__;//行號為ID UKismetSystemLibrary::Delay(GetWorld(),0.5f,LatentInfo);//第一個引數是事件位置預設寫GetWorld就行,第二個引數是倒計時時間,第三個為FLatentActionInfo變數 if (Ifc) { staticMesh->SetMaterial(0, TargetRed); Ifc = false; } else { staticMesh->SetMaterial(0, TBlue); Ifc = true; } if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, TEXT("ALeamCppProjectile")); } } else { if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, TEXT("NotALeamCppProjectile")); } } if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, TEXT("NotifyHit")); } } void ATargetStaticMeshActor::TickCallBack() { Direction *= -1;//倒計時結束後轉向 } void ATargetStaticMeshActor::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); AddActorLocalOffset(UKismetMathLibrary::Normal(Direction) * DeltaSeconds * 200);//設定本地座標位移,引數是向量歸一化 FLatentActionInfo LatentInfo; LatentInfo.Linkage = 0; LatentInfo.CallbackTarget = this; LatentInfo.ExecutionFunction = "TickCallBack"; LatentInfo.UUID = __LINE__; UKismetSystemLibrary::Delay(GetWorld(), 3.0f, LatentInfo); }