초보 코린이의 성장 일지

UE4 Behavior, AI Equip 본문

언리얼

UE4 Behavior, AI Equip

코오린이 2023. 8. 3. 15:45

Enemy가 Sowrd를 뽑는 동작시 Hit가되면 무기가 뽑히지 않는 상태로 끝나버리게 된다. 이걸 예외처리를 따로 해줌으로써 해결해 볼 것이다.

 

 

 

 

#include "Components/CMovementComponent.h"
#include "Global.h"
#include "AIController.h"
#include "GameFramework/Character.h"
#include "GameFramework/CharacterMovementComponent.h"

void UCMovementComponent::Move()
{
	bCanMove = true;

}

void UCMovementComponent::Stop()
{
	bCanMove = false;

	AAIController* controller = OwnerCharacter->GetController<AAIController>();
	CheckNull(controller);

	controller->StopMovement();
}

1. Inline로 만들어 놨던 Move, Stop를 아래로 일반함수로 내려준다.

2. 무기를 뽑을때 Stop를 시켜준다.


 

1. 조건체크를 위해 BeginEquip를 Get함수로 가져와준다.


#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTTaskNode.h"
#include "Components/CWeaponComponent.h"
#include "CBTTaskNode_Equip.generated.h"

UCLASS()
class U2212_06_API UCBTTaskNode_Equip : public UBTTaskNode
{
	GENERATED_BODY()

private:
	UPROPERTY(EditAnywhere, Category = "Type")
		EWeaponType Type; // 장착시킬 무기 타입

public:
	UCBTTaskNode_Equip();

protected:
	EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;
	// 무기를 장착하는건 Tick에서 하게된다.
	void TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) override;
	EBTNodeResult::Type AbortTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory);

};

 

#include "BehaviorTree/CBTTaskNode_Equip.h"
#include "Global.h"
#include "Characters/CEnemy_AI.h"
#include "Characters/CAIController.h"
#include "Components/CStateComponent.h"
#include "Components/CStatusComponent.h"
#include "Weapons/CEquipment.h"

UCBTTaskNode_Equip::UCBTTaskNode_Equip()
{
	NodeName = "Equip";

	bNotifyTick = true;
}

EBTNodeResult::Type UCBTTaskNode_Equip::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
	Super::ExecuteTask(OwnerComp, NodeMemory);

	ACAIController* controller = Cast<ACAIController>(OwnerComp.GetOwner());
	ACEnemy_AI* ai = Cast<ACEnemy_AI>(controller->GetPawn());

	UCWeaponComponent* weapon = CHelpers::GetComponent<UCWeaponComponent>(ai);
	CheckNullResult(weapon, EBTNodeResult::Failed); // 무기가 없다면 실행 x

	// 현재 장착하고있는 무기와, 장착할 무기가 같다면 이미 성공이므로,
	if (Type == weapon->GetWeaponType()) 
		return EBTNodeResult::Succeeded;

	controller->StopMovement();
	switch (Type)
	{
		case EWeaponType::Sword: weapon->SetSwordMode(); break;
	}

	return EBTNodeResult::InProgress; // 조건이 성공했다면, 대기

}

void UCBTTaskNode_Equip::TickTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
	Super::TickTask(OwnerComp, NodeMemory, DeltaSeconds);

	ACAIController* controller = Cast<ACAIController>(OwnerComp.GetOwner());
	ACEnemy_AI* ai = Cast<ACEnemy_AI>(controller->GetPawn());

	UCWeaponComponent* weapon = CHelpers::GetComponent<UCWeaponComponent>(ai);
	const bool* bEquipped = weapon->GetEquipment()->GetEquipped(); // 장착이 완료 되었는지,

	UCStateComponent* state = CHelpers::GetComponent<UCStateComponent>(ai);
	if (state->IsIdleMode() && *bEquipped) // 무기 장착이 아닌 상태, 장착이 완료되었다면,
	{
		// 끝내기
		FinishLatentTask(OwnerComp, EBTNodeResult::Succeeded);

		return;
	}

}

EBTNodeResult::Type UCBTTaskNode_Equip::AbortTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
	Super::AbortTask(OwnerComp, NodeMemory);

	ACAIController* controller = Cast<ACAIController>(OwnerComp.GetOwner());
	ACEnemy_AI* ai = Cast<ACEnemy_AI>(controller->GetPawn());

	UCWeaponComponent* weapon = CHelpers::GetComponent<UCWeaponComponent>(ai);
	if (weapon == nullptr) // weapon이 없다면
	{
		// weapon이 없으면 동작을 할 수가 없으므로, 중단으로 끝내버리기
		FinishLatentAbort(OwnerComp);

		return EBTNodeResult::Failed; // 이 조건은 실패조건이므로, Failed
	}

	bool bBeginEquip = weapon->GetEquipment()->GetBeginEquip();
	if (bBeginEquip == false) // 아직 Begin에 들어가지 않았다면,
		weapon->GetEquipment()->Begin_Equip();

	weapon->GetEquipment()->End_Equip(); // 조건이 ture라면 Begin 상태이므로 End만 해준다.

	return EBTNodeResult::Aborted; // Abort가 되면 다른 처리를 하고 끝낼 것이다.

}

1.Task에 부모로 올라가서 AbortTask를 오바리이딩해서 사용할 것이다.

2. 무기를 장착했는지 우선적으로 한번 판단해준다.

3. Equip조건을 체크해주고 동작을 끝낼지 판단해준다.


Enemy가 무기를 장착하려는 모션이 나올때 Hit가 처리되면 위에 예외처리를 통해서 바로 무기가 장착된 상태로 Player에게 공격을 바로 할수 있도록 Behavior이 흘러가는걸 확인할 수 있다.

 

https://www.youtube.com/watch?v=jfzGuW4b0WY 

 

'언리얼' 카테고리의 다른 글

UE4 Behavior, AI Range, EQS  (0) 2023.08.08
UE4 Behavior, AI Abort, Range  (0) 2023.08.07
UE4 Behavior, AI Hitted  (0) 2023.07.31
UE4 Behavior, AI Action  (2) 2023.07.27
UE4 Behavior, AI Equip  (0) 2023.07.26
Comments