0.개요
오늘은 어제 갑작스럽게 만든 총기 코드를 상속받게 하여서 여러 총기를 만드려한다.
(객체에 기능 추가는 UObject보다 UComponent를 사용 할것!!!!) - 중간 수정
UObject
캐릭터에서 총 발사에 사용될 함수만 넣어보고 싶어서
AActor가 아닌
UObject를 사용해봤다.
플레이어 컨트롤러 , 캐릭터 등에서 코드를 추가 하면 관리하는 사람의 코드와의 충돌이 생길 것 같아서
사용 시켜줄 코드만 따로 분리시켜봤다.
일단 코드를 다 작성하여서 필요는없지만 UComponent라는 클래스객체가 존재했었다.
TakeDamage & UGameplayStatics::ApplyDamage()
#include "Kismet/GameplayStatics.h" // 필요
피격 함수를 언리얼에서 제공해주고 있다.
피격시는 TakeDamage
공격 함수는 UGameplayStatics::ApplyDamage() 를 사용한다.
static void ApplyDamage(
AActor* DamagedActor,
float BaseDamage,
AController* EventInstigator,
AActor* DamageCauser,
TSubclassOf<UDamageType> DamageTypeClass
);
함수에 담긴 매개변수들이다.
DamagedActor | AActor* | 대미지를 받을 액터 (예: 플레이어, NPC) |
BaseDamage | float | 기본 대미지 값 |
EventInstigator | AController* | 공격을 유발한 플레이어 또는 AI 컨트롤러 |
DamageCauser | AActor* | 대미지를 유발한 액터 (예: 총알, 폭발물, 좀비 등) |
DamageTypeClass | TSubclassOf <UDamageType> |
대미지 유형 (예: UDamageType_Poison) |
사용 예시
UGameplayStatics::ApplyDamage(
HitActor, // 공격받는 액터 (플레이어)
10.0f, // 기본 대미지 값
GetController(), // 좀비의 컨트롤러 (공격자)
this, // 대미지를 가한 액터 (좀비)
UDamageType::StaticClass() // 기본 대미지 타입
);
피격 함수
virtual float TakeDamage(
float DamageAmount,
FDamageEvent const& DamageEvent,
AController* EventInstigator,
AActor* DamageCauser
);
DamageAmount | float | 받은 대미지 값 |
DamageEvent | FDamageEvent const& | 대미지 이벤트 정보 (대미지 타입 포함) |
EventInstigator | AController* | 공격을 유발한 컨트롤러 (예: 좀비 AI, 플레이어 컨트롤러) |
DamageCauser | AActor* | 대미지를 가한 액터 (예: 총알, 폭발물, 좀비 등) |
대미지 타입 경우 gpt에 물어본 결과 대미지 타입을 실제로 만들 수 있다고 한다.
float AMyCharacter::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
// 체력 감소
Health -= DamageAmount;
UE_LOG(LogTemp, Warning, TEXT("Player took %f damage! Current Health: %f"), DamageAmount, Health);
// 대미지 타입 확인
const UDamageType* DamageType = DamageEvent.DamageTypeClass->GetDefaultObject<UDamageType>();
if (DamageType->IsA(UDamageType_Poison::StaticClass()))
{
UE_LOG(LogTemp, Warning, TEXT("Poison damage received!"));
// 추가적인 독 대미지 효과 적용 가능
}
// 체력이 0 이하라면 사망 처리
if (Health <= 0)
{
Die();
}
return DamageAmount;
}
이렇게 하면 데미지 타입 하나가 생긴다고 한다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/DamageType.h"
#include "DamageType_Poison.generated.h"
UCLASS()
class YOURGAME_API UDamageType_Poison : public UDamageType
{
GENERATED_BODY()
};