캐릭터가 공격시 플레이어 방향으로 회전하도록 하는 코드입니다.
캐릭터 회전시 너무 끊기는것 같아 관련 코드 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;
}
블랙보드에 저장해둔 Target의 Rotation으로 Character의 Rotation을 변경하는 비헤이비어트리 태스크 입니다.
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;
}
캐릭터 회전 부드럽게 해주는 코드입니다.
'Unreal Engine 5 > EDR_Project' 카테고리의 다른 글
EDR_Project / Character (2) Collision 프리셋 (0) | 2024.10.20 |
---|---|
EDR_Project / AnimInstance (2) Notify (0) | 2024.10.20 |
EDR_Project / Character (1) (4) | 2024.10.17 |
EDR_Project / EDR_Boss_Giant (0) | 2024.10.17 |
EDR_Project / AnimInstance (1) (0) | 2024.10.17 |