//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); }