#include "DrawDebugHelpers.h"
- 디버그 드로잉 기능을 가진 헤더
void AMyCharacter::PostInitializeComponents()
{
Super::PostInitializeComponents();
CAnim = Cast<UCAnimInstance>(GetMesh()->GetAnimInstance());
if (NULL == CAnim) return;
CAnim->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
CAnim->OnNextAttackCheck.AddLambda([this]()->void {
CanNextCombo = false;
if (IsComboInputOn)
{
AttackStartComboState();
CAnim->JumpToAttackMontageSection(CurrentCombo);
}
});
CAnim->OnAttackHitCheck.AddUObject(this, &AMyCharacter::AttackCheck);
}
void AMyCharacter::AttackCheck()
{
FHitResult HitResult;
FCollisionQueryParams Params(NAME_None, false, this);
bool bResult = GetWorld()->SweepSingleByChannel(
HitResult,
GetActorLocation(),
GetActorLocation() + GetActorForwardVector() * AttackRange,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel2,
FCollisionShape::MakeSphere(AttackRadius),
Params
);
#if ENABLE_DRAW_DEBUG
FVector TraceVec = GetActorForwardVector() * AttackRange;
FVector Center = GetActorLocation() + TraceVec * 0.5f;
float HalfHeight = AttackRange * 0.5f + AttackRadius;
FQuat CapsuleRot = FRotationMatrix::MakeFromZ(TraceVec).ToQuat();
FColor DrawColor = bResult ? FColor::Green : FColor::Red;
float DebugLifeTime = 5.0f;
DrawDebugCapsule(
GetWorld(),
Center,
HalfHeight,
AttackRadius,
CapsuleRot,
DrawColor,
false,
DebugLifeTime
);
#endif
if (bResult)
{
if (HitResult.Actor.IsValid())
{
CLog::Print(*HitResult.Actor->GetName(), 0, 1.0f);
}
}
}
- 공격 판정 범위를 나타내준다. 델리게이트에 추가하여 작동시켜준다.
대미지 프레임워크
- 액터 클래스 AActor는 TakeDamege라는 함수가 있는데 이를 사용하여 액터에 대미지를 전달할 수 있다.
- DamageAmount : 전달할 대미지의 세기
- DamageEvent : 대미지 종류
- EventInstigator : 공격 명령을 내린 가해자
- DamageCauser : 대미지 전달을 위해 사용한 도구
- 여기서 가해자는 폰이 아닌 플레이어 컨트롤러이다.
무기 장착
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CWeapon.generated.h"
UCLASS()
class TEST_API ACWeapon : public AActor
{
GENERATED_BODY()
public:
ACWeapon();
protected:
virtual void BeginPlay() override;
public:
UPROPERTY(VisibleAnywhere, Category = "Weapon")
class USkeletalMeshComponent* Weapon;
};
#include "CWeapon.h"
ACWeapon::ACWeapon()
{
Weapon = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("WEAPON"));
RootComponent = Weapon;
static ConstructorHelpers::FObjectFinder<USkeletalMesh> SK_WEAPON(TEXT("SkeletalMesh'/Game/InfinityBladeWeapons/Weapons/Blade/Swords/Blade_BlackKnight/SK_Blade_BlackKnight.SK_Blade_BlackKnight'"));
if (SK_WEAPON.Succeeded())
{
Weapon->SetSkeletalMesh(SK_WEAPON.Object);
}
Weapon->SetCollisionProfileName(TEXT("NoCollision"));
}
void ACWeapon::BeginPlay()
{
Super::BeginPlay();
}
//MyCharcter.cpp
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
FName WeaponSocket(TEXT("hand_rSocket"));
auto CurrWeapon = GetWorld()->SpawnActor<ACWeapon>(FVector::ZeroVector, FRotator::ZeroRotator);
if (NULL != CurrWeapon)
{
CurrWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponSocket);
}
}
- SpawnActor를 통해 무기Actor를 스폰해준다.
- 스폰한 변수인 CurrWeapon을 AttachToComponent를 통해서 해당 소켓에 넣어준다.
UPROPERTY(VisibleAnywhere, Category = Box)
TSubclassOf<class CWeapon> WeaponItemClass;
- 특정 클래스와 상속받은 클래스들로 목록을 한정하도록 TSubclassof 라는 키워드를 제공한다.
- 다이내믹 델리게이트에는 UFUNCTION 함수를 사용해야한다.
- SetVisibility : 해당 컴포넌트의 시각적인 기능을 아예 없애는 함수이다.
- SetHiddenInGame : 에디터 레벨 작업을 할 때는 보여주되, 게임플레이 중에는 사라진다.
'Game Programming > Unreal' 카테고리의 다른 글
[Unreal] 이득우의 언리얼 C++ 게임개발의 정석 9 (0) | 2022.03.17 |
---|---|
[Unreal] 이득우의 언리얼 C++ 게임개발의 정석 8 (0) | 2022.03.16 |
[Unreal] 이득우의 언리얼 C++ 게임개발의 정석 6 (0) | 2022.03.11 |
[Unreal] 이득우의 언리얼 C++ 게임개발의 정석 5 (0) | 2022.03.11 |
[Unreal] 이득우의 언리얼 C++ 게임개발의 정석 4 (0) | 2022.02.28 |