EDR_Project / TurnToTarget, 회전 부드럽게

캐릭터가 공격시 플레이어 방향으로 회전하도록 하는 코드입니다.

캐릭터 회전시 너무 끊기는것 같아 관련 코드 MyCharacter에 추가하였습니다.

 

BTT_EDR_TurnToTarget.h

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

#pragma once

#include "CoreMinimal.h"
#include "BehaviorTree/BTTaskNode.h"
#include "BTT_EDR_TurnToTarget.generated.h"

/**
 *
 */
UCLASS()
class EDR_API UBTT_EDR_TurnToTarget : public UBTTaskNode
{
	GENERATED_BODY()

public:
	UBTT_EDR_TurnToTarget();
	virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)override;

};

 

반응형

 

BTT_EDR_TurnToTarget.cpp

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

#include "BTT_EDR_TurnToTarget.h"
#include "Enemy_EDR_AIController.h"
#include "MyCharacter.h"
#include "EDR/YS/EDRCharacter.h"
#include "BehaviorTree/BlackboardComponent.h"


UBTT_EDR_TurnToTarget::UBTT_EDR_TurnToTarget()
{
	NodeName = TEXT("Turn");
}

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

	// MyCharacter 캐스팅
	auto MyCharacter = Cast<AMyCharacter>(OwnerComp.GetAIOwner()->GetPawn());
	if (nullptr == MyCharacter)
	{
		return EBTNodeResult::Failed;
	}

	// target 캐스팅
	auto Target = Cast<AMyCharacter>(OwnerComp.GetBlackboardComponent()->GetValueAsObject(AEnemy_EDR_AIController::TargetKey));
	if (nullptr == Target)
	{
		return EBTNodeResult::Failed;
	}

	// target과 mycharacter의 차이 벡터값
	FVector LookVecter = Target->GetActorLocation() - MyCharacter->GetActorLocation();


	// 로케이션 변경
	LookVecter.Z = 0.0f;
	FRotator TargetRot = FRotationMatrix::MakeFromX(LookVecter).Rotator();
	MyCharacter->SetActorRotation(FMath::RInterpTo(MyCharacter->GetActorRotation(), TargetRot, GetWorld()->GetDeltaSeconds(), 10.0f));
	
	return EBTNodeResult::Succeeded;
}

 

블랙보드에 저장해둔 TargetRotation으로 CharacterRotation을 변경하는 비헤이비어트리 태스크 입니다.

 

 

Enemy_EDR_BehaviorTree

비헤이비어트리에 적용한모습

 

 

 

MyCharacter.h

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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"

// 공격 애니메이션이 끝났는지 확인
DECLARE_MULTICAST_DELEGATE(FOnAttackEndDelegate);

UCLASS()
class EDR_API AMyCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties

	AMyCharacter();
	virtual void PossessedBy(AController* NewController)override;

 

 

MyCharacter.cpp

void AMyCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	
	// 캐릭터 회전 부드럽게
	bUseControllerRotationYaw = false;
	GetCharacterMovement()->bUseControllerDesiredRotation = false;
	GetCharacterMovement()->bOrientRotationToMovement = true;
	GetCharacterMovement()->RotationRate = FRotator(0.0f, 480.0f, 0.0f);
	GetCharacterMovement()->MaxWalkSpeed = 300.0f;
}

 

캐릭터 회전 부드럽게 해주는 코드입니다.