EnemyCharacter에 사용될 소스입니다.
아직 기본 골자만 짜두었기 때문에 추후 연속공격이나 회피 함수 등 추가할 예정입니다.
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();
UPROPERTY(BlueprintReadWrite)
float AttackDamage;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// 데미지 받기
virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser) override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UPROPERTY(BluePrintReadWrite)
float hp = 100.0f;
UPROPERTY(BluePrintReadWrite)
bool Death = false;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
UFUNCTION(BlueprintPure, category = "Player")
float GetHp(){return hp;}
UFUNCTION(BlueprintCallable, category = "Player")
void UpdateHP(float NewHP);
UFUNCTION(BlueprintCallable, category = "Player")
void IsDeath();
virtual void PostInitializeComponents() override;
// 공격 함수
void Attack();
FOnAttackEndDelegate OnAttackEnd;
UFUNCTION()
void OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted);
private:
// 애니메이션 재생을 위해 공격중인지 확인
UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = Attack, Meta = (AllowPrivateAccess = true))
bool IsAttacking;
// 애니메이션 인스턴트 객체
UPROPERTY()
class UAnim_EDR_AnimInstance* EDRAnim;
};
반응형
MyCharacter.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyCharacter.h"
#include "Anim_EDR_AnimInstance.h"
// Sets default values
AMyCharacter::AMyCharacter()
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
IsAttacking = false;
}
// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
// 데미지 받는 함수
float AMyCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
UpdateHP(-DamageAmount);
if (hp <= 0)
{
hp = 0;
IsDeath();
}
return Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
}
void AMyCharacter::IsDeath()
{
Death = true;
}
// 데미지 받았을때 hp 업데이트
void AMyCharacter::UpdateHP(float NewHP)
{
hp += NewHP;
GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, FString::Printf(TEXT("UpdateHP() - %s HP : %f"), *GetName(), hp));
}
// 공격 시에 호출되는 함수
void AMyCharacter::Attack()
{
if (IsAttacking)
{
GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, TEXT("is attacking true"));
return;
}
EDRAnim = Cast<UAnim_EDR_AnimInstance>(GetMesh()->GetAnimInstance());
if (nullptr == EDRAnim)
{
return;
}
// 애니메이션 몽타주 실행
EDRAnim->PlayAttackMontage();
IsAttacking = true;
}
// 연속 공격 추후 제작
void AMyCharacter::PostInitializeComponents()
{
Super::PostInitializeComponents();
EDRAnim = Cast<UAnim_EDR_AnimInstance>(GetMesh()->GetAnimInstance());
if (nullptr == EDRAnim)
{
return;
}
EDRAnim->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
}
// 공격 애니메이션 끝
void AMyCharacter::OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted)
{
if (!IsAttacking)
{
return;
}
IsAttacking = false;
GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, TEXT("end play"));
OnAttackEnd.Broadcast();
}
앞으로 다양한 적 캐릭터를 만들 때 사용 될 기본 캐릭터 코드입니다.
플레이어의 공격을 받는 처리를 TakeDamage 함수를 통해 처리하였습니다.
Death 변수와 IsDeath를 통해 캐릭터 사망처리를 합니다.
Attack 함수는 애니메이션 인스턴트내의 저장되어있는 공격 애니메이션을 실행하도록 호출합니다.
GJ_BP_MyCharacter

MyCharacter의 자식 블루프린트 클래스입니다.
'Unreal Engine 5 > EDR_Project' 카테고리의 다른 글
EDR_Project / CanAttack (0) | 2024.10.17 |
---|---|
EDR_Project / Detect (0) | 2024.10.17 |
EDR_Project / Patrol (0) | 2024.10.17 |
EDR_Project / BehaviorTree, BlackBoard (0) | 2024.10.17 |
EDR_Project / AIController (0) | 2024.10.17 |