1. 程式人生 > 實用技巧 >UE4c++4來回移動加上倒計時後恢復原來顏色

UE4c++4來回移動加上倒計時後恢復原來顏色

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