EDR_Project / IsFightStart

전투 시작 애니메이션이 재생중일때 다른 행동으로 인한 충돌을 막는 BTS입니다.

MyCharacter에서 전투 시작 애니메이션을 재생 할 때 Attack 애니메이션과 겹치는 순간들이 생기기도 했고,

첫 전투 돌입시에만 전투시작 애니메이션이 재생 됐으면 좋겠다 생각을 했습니다.

그러기 위해 블랙보드 변수에 bool값으로 재생이 끝났는지 확인하고 다음 행동을 할 수 있도록 하였습니다.

 

 

BTS_EDR_IsFightStart.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTService.h"
#include "BTS_EDR_IsFightStart.generated.h"

/**
 * 
 */
UCLASS()
class EDR_API UBTS_EDR_IsFightStart : public UBTService
{
	GENERATED_BODY()
	UBTS_EDR_IsFightStart();
protected:
	virtual void TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)override;
	bool bIsFightStartEnd;
};
반응형

BTS_EDR_IsFightStart.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "BTS_EDR_IsFightStart.h"
#include "Enemy_EDR_AIController.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "Mycharacter.h"
UBTS_EDR_IsFightStart::UBTS_EDR_IsFightStart()
{
	bIsFightStartEnd = false;
}
void UBTS_EDR_IsFightStart::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
	Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);
	AEnemy_EDR_AIController* AIController = Cast<AEnemy_EDR_AIController>(OwnerComp.GetOwner());
	if (AIController)
	{
		// 캐스팅
		AMyCharacter* MyCharacter = Cast<AMyCharacter>(AIController->GetPawn());

		if (MyCharacter)
		{

			// 공격애니메이션 재생중인지
			bIsFightStartEnd = MyCharacter->IsFightStarting; 
			if (bIsFightStartEnd)
			{
				//GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, TEXT("ASDFADSF"));
				// 블랙보드 변수에 저장
				OwnerComp.GetBlackboardComponent()->SetValueAsBool(AEnemy_EDR_AIController::FightStartEnd, bIsFightStartEnd);
			}
		}
	}
}

 

MyCharacter를 캐스팅하여 전투 시작 애니메이션이 종료 되었는지 확인하는 변수를 불러와 블랙보드 변수에 추가하였습니다. 

 

비헤이비어트리에 추가

FightStart 라는 이름의 데코레이터를 추가하여 블랙보드 변수인 FightStartEnd가 true일 경우에만 Attack 로직을 실행하게 하였습니다.