본문 바로가기

카테고리 없음

2025 - 03 - 05 TIL

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()
};