24.11.11 EDR_Boss_Knight의 추가 사항 입니다.
기사 보스캐릭터에게 AIController를 적용하였습니다.
앞서 제작한 애니메이션 블루프린트도 적용 하였습니다.
공격, 스킬, 사망 애니메이션을 추가하였고, 히트시 사운드 출력까지 추가 하였습니다.
연속공격 애니메이션 노티파이
AttackHitCheck 노티파이를 추가하여 연속공격에서 데미지가 들어가야 하는 타이밍을 지정해주었습니다.
EDR_Boss_Knight.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "MyCharacter.h"
#include "EDR_Enemy_Weapon.h"
#include "EDR_Boss_Knight.generated.h"
/**
*
*/
UCLASS()
class EDR_API AEDR_Boss_Knight : public AMyCharacter
{
GENERATED_BODY()
AEDR_Boss_Knight();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
};
반응형
EDR_Boss_Knight.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "EDR_Boss_Knight.h"
#include "EDR_Enemy_Weapon.h"
#include "GameFramework/CharacterMovementComponent.h"
AEDR_Boss_Knight::AEDR_Boss_Knight()
{
// hp 재정의
hp = 100.0f;
AttackDamage = 40.0f;
AttackRange = 400.0f;
AttackRadius = 200.0f;
SkillDamage = 40.0f;
SkillRange = 400.0f;
SkillRadius = 200.0f;
GetCharacterMovement()->MaxWalkSpeed = 200.0f;
// 캐릭터 메시랑 캡슐콜리전
RootComponent = GetCapsuleComponent();
GetMesh()->SetupAttachment(GetCapsuleComponent());
GetCapsuleComponent()->SetCapsuleHalfHeight(88.0f);
GetCapsuleComponent()->SetCapsuleRadius(34.0f);
GetMesh()->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -88.0f), FRotator(0.0f, -90.0f, 0.0f));
// 메시 받아오기
static ConstructorHelpers::FObjectFinder<USkeletalMesh>MODEL(TEXT("/Game/BLACKSUN_BOSSBUNDLE1/Characters/Thral/SK_ThrallRigged.SK_ThrallRigged"));
if (MODEL.Succeeded())
{
GetMesh()->SetSkeletalMesh(MODEL.Object);
}
// 크기 1.6배 키우기
SetActorScale3D(FVector(1.6f, 1.6f, 1.6f));
// 애니메이션 관련
// 공격
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE1(TEXT("/Game/GJ/Animation/Enemy_Anim/KnighEnemy/Attack/Boss_Attack_Uppercut_InP_Montage.Boss_Attack_Uppercut_InP_Montage"));
if (ATTACK_MONTAGE1.Succeeded())
{
AttackMontage.Add(ATTACK_MONTAGE1.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE2(TEXT("/Game/GJ/Animation/Enemy_Anim/KnighEnemy/Attack/Boss_Attack_Swing_InP_Montage.Boss_Attack_Swing_InP_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE2.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE3(TEXT("/Game/GJ/Animation/Enemy_Anim/KnighEnemy/Attack/Boss_Attack_HandAndSwordSwing_InP_Montage.Boss_Attack_HandAndSwordSwing_InP_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE3.Object);
}
// 스킬 애니메이션 몽타주 저장
static ConstructorHelpers::FObjectFinder<UAnimMontage> SKILL_MONTAGE(TEXT("/Game/GJ/Animation/Enemy_Anim/KnighEnemy/Attack/Boss_Attack_ChargedCombo_InP_Montage.Boss_Attack_ChargedCombo_InP_Montage"));
if (SKILL_MONTAGE.Succeeded())
{
SkillMontage = SKILL_MONTAGE.Object;
}
// 사망 애니메이션 몽타주 저장
static ConstructorHelpers::FObjectFinder<UAnimMontage>DEATHANIM(TEXT("/Game/GJ/Animation/Enemy_Anim/KnighEnemy/GiantGolemIdleDeath01_Montage.GiantGolemIdleDeath01_Montage"));
if (DEATHANIM.Succeeded())
{
DeathMontage = DEATHANIM.Object;
}
// 사운드 관련
// 공격 히트시 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>HITSOUNDCUE1(TEXT("/Game/Sword_Fighting_SFX/Cues/Blunt_Weapon_Hits_Flesh_3_Cue.Blunt_Weapon_Hits_Flesh_3_Cue"));
if (HITSOUNDCUE1.Succeeded())
{
HitSoundCue.Add(HITSOUNDCUE1.Object);
} // 공격 히트시 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>HITSOUNDCUE2(TEXT("/Game/Sword_Fighting_SFX/Cues/Blunt_Weapon_Hits_Flesh_1_Cue.Blunt_Weapon_Hits_Flesh_1_Cue"));
if (HITSOUNDCUE2.Succeeded())
{
HitSoundCue.Add(HITSOUNDCUE2.Object);
} // 공격 히트시 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>HITSOUNDCUE3(TEXT("/Game/Sword_Fighting_SFX/Cues/Blunt_Weapon_Hits_Flesh_5_Cue.Blunt_Weapon_Hits_Flesh_5_Cue"));
if (HITSOUNDCUE3.Succeeded())
{
HitSoundCue.Add(HITSOUNDCUE1.Object);
}
}
void AEDR_Boss_Knight::BeginPlay()
{
Super::BeginPlay();
// 게임 실행시 캐릭터 손에 무기 장착
FName WeaponSocket(TEXT("hand_rSocket"));
CurrentWeapon = GetWorld()->SpawnActor<AEDR_Enemy_Weapon>(FVector::ZeroVector, FRotator::ZeroRotator);
if (nullptr != CurrentWeapon)
{
CurrentWeapon->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponSocket);
//CurrentWeapon->SetActorRelativeRotation(FRotator(0.0f, 0.0f, 180.0f)); // 180도 회전
CurrentWeapon->SetActorRelativeLocation(FVector(0.0f, 0.0f, -10.0f)); // 무기이동
// 무기 크기 키우기
CurrentWeapon->SetActorScale3D(FVector(2.0f));
}
}
기본 값 ( 공격, 스킬, 범위, hp ) 등을 초기화 해주었습니다.
주의할 점
애니메이션이나 사운드의 들어가는 몽타주나 큐의 경로를 변경하면 언리얼 에디터에서 바로 적용 되지 않을때가 있습니다.
그럴때는 자손 블루프린트로 들어가서 직접 컴파일 해주거나 값을 기본값으로 돌려주면 해결 할 수있습니다.
실행 화면
'Unreal Engine 5 > EDR_Project' 카테고리의 다른 글
EDR_Project / Detect (2) 전투 시작 애니메이션 재생 함수 호출 (0) | 2024.11.18 |
---|---|
EDR_Project / Character (9) 전투 시작 애니메이션, 걷는 속도 천천히 증가, miss 사운드 (0) | 2024.11.18 |
EDR_Project / Character (8) HitSound (4) | 2024.11.11 |
EDR_Project / EDR_Boss_Knight (0) | 2024.10.28 |
EDR_Proejct / Character (7) Weapon (0) | 2024.10.28 |