EDR_Project / Character

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

etc-image-0

 

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