EDR_Project 에서 사용될 보스를 만들기 위해서 MyCharacter의 새로운 자손 클래스를 만들었으나 오류가 계속 발생하여 임시 방편으로 기존에 만들어두었던 Giant에 덮어씌웠습니다.
이 보스는 창을 사용하는 컨샙으로 Knight 보스와는 차별점을 두었습니다.
기본적인 로직은 동일합니다.
EDR_Boss_Giant.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "MyCharacter.h"
#include "GameFramework/Character.h"
#include "EDR_Boss_Giant.generated.h"
/**
*
*/
UCLASS()
class EDR_API AEDR_Boss_Giant : public AMyCharacter
{
GENERATED_BODY()
public:
AEDR_Boss_Giant();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
private:
};
EDR_Boss_Giant.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "EDR_Boss_Giant.h"
#include "EDR_Enemy_WeaponSpear.h"
AEDR_Boss_Giant::AEDR_Boss_Giant()
{
DetectRange = 2000.0f;
IsBoss = true;
// hp 재정의
hp = 10.0f;
AttackDamage = 40.0f;
AttackRange = 450.0f;
AttackRadius = 200.0f;
SkillDamage = 40.0f;
SkillRange = 400.0f;
SkillRadius = 200.0f;
// 속도
TargetSpeed = 0.0f;
Acceleration = 10.0f;
RotationSpeed = 1.0f;
Deceleration = 280.0f;
StopDistance = 200.0f;
MaxWalkSpeed = 400.0f;
//GetCharacterMovement()->MaxWalkSpeed = 200.0f;
// 캐릭터 메시랑 캡슐콜리전
RootComponent = GetCapsuleComponent();
GetMesh()->SetupAttachment(GetCapsuleComponent());
GetCapsuleComponent()->SetCapsuleHalfHeight(80.0f);
GetCapsuleComponent()->SetCapsuleRadius(34.0f);
GetMesh()->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -80.0f), FRotator(0.0f, -90.0f, 0.0f));
// 메시 받아오기
static ConstructorHelpers::FObjectFinder<USkeletalMesh>MODEL(TEXT("/Game/BLACKSUN_BOSSBUNDLE1/Characters/A_Sanpet/SK_SanpetPreRig.SK_SanpetPreRig"));
if (MODEL.Succeeded())
{
GetMesh()->SetSkeletalMesh(MODEL.Object);
}
// 크기 1.6배 키우기
SetActorScale3D(FVector(1.6f, 1.6f, 1.6f));
// 애니메이션 관련
// 전투 시작 애니메이션
static ConstructorHelpers::FObjectFinder<UAnimMontage> FIGHTSTART_MONTAGE(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossDodgeB_Montage.BossDodgeB_Montage"));
if (FIGHTSTART_MONTAGE.Succeeded())
{
FightStartMontage = FIGHTSTART_MONTAGE.Object;
}
// 공격
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE1(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossAirSlashAttack_Montage.BossAirSlashAttack_Montage"));
if (ATTACK_MONTAGE1.Succeeded())
{
AttackMontage.Add(ATTACK_MONTAGE1.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE2(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossJumpingAttack_Montage.BossJumpingAttack_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE2.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE3(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossAirSlashAttackCombo_Montage.BossAirSlashAttackCombo_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE3.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE4(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossSpearComboAttack_Montage.BossSpearComboAttack_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE4.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE5(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossTurningAttackSingle_Montage.BossTurningAttackSingle_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE5.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE6(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossTurningAttack1_Montage.BossTurningAttack1_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE6.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE7(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossDodgeAttack_Montage.BossDodgeAttack_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE7.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE8(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossSpinAttack_Montage.BossSpinAttack_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE8.Object);
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE9(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossSpearStab_Montage.BossSpearStab_Montage"));
{
AttackMontage.Add(ATTACK_MONTAGE9.Object);
}
// 스킬 애니메이션 몽타주 저장
static ConstructorHelpers::FObjectFinder<UAnimMontage> SKILL_MONTAGE(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/Attack/BossLongComboAttack_Montage.BossLongComboAttack_Montage"));
if (SKILL_MONTAGE.Succeeded())
{
SkillMontage = SKILL_MONTAGE.Object;
}
// 사망 애니메이션 몽타주 저장
static ConstructorHelpers::FObjectFinder<UAnimMontage>DEATHANIM(TEXT("/Game/GJ/Animation/Enemy_Anim/GiantEnemy/BossDeath_Montage.BossDeath_Montage"));
if (DEATHANIM.Succeeded())
{
DeathMontage = DEATHANIM.Object;
}
// 사운드 관련
// 공격 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>ATTACKSOUNDCUE1(TEXT("/Game/Voices_Of_Battle_FURIOUS_P1/Cue/03_Low_Pitch/Low_Furious_VOB_P2_1_Cue.Low_Furious_VOB_P2_1_Cue"));
if (ATTACKSOUNDCUE1.Succeeded())
{
AttackSoundCue.Add(ATTACKSOUNDCUE1.Object);
}
// 공격 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>ATTACKSOUNDCUE2(TEXT("/Game/Voices_Of_Battle_FURIOUS_P1/Cue/03_Low_Pitch/Low_Furious_VOB_P2_54_Cue.Low_Furious_VOB_P2_54_Cue"));
if (ATTACKSOUNDCUE2.Succeeded())
{
AttackSoundCue.Add(ATTACKSOUNDCUE2.Object);
}
// 공격 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>ATTACKSOUNDCUE3(TEXT("/Game/Voices_Of_Battle_FURIOUS_P1/Cue/03_Low_Pitch/Low_Furious_VOB_P2_2_Cue.Low_Furious_VOB_P2_2_Cue"));
if (ATTACKSOUNDCUE3.Succeeded())
{
AttackSoundCue.Add(ATTACKSOUNDCUE3.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);
}
// 공격 미스시 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>MISSSOUNDCUE1(TEXT("/Game/Sword_Fighting_SFX/Cues/Sword_Hit_1_Cue.Sword_Hit_1_Cue"));
if (MISSSOUNDCUE1.Succeeded())
{
MissSoundCue.Add(MISSSOUNDCUE1.Object);
} // 공격 미스시 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>MISSSOUNDCUE2(TEXT("/Game/Sword_Fighting_SFX/Cues/Sword_Hit_1_Cue.Sword_Hit_2_Cue"));
if (MISSSOUNDCUE2.Succeeded())
{
MissSoundCue.Add(MISSSOUNDCUE2.Object);
} // 공격 미스시 사운드 저장
static ConstructorHelpers::FObjectFinder<USoundCue>MISSSOUNDCUE3(TEXT("/Game/Sword_Fighting_SFX/Cues/Sword_Hit_1_Cue.Sword_Hit_5_Cue"));
if (MISSSOUNDCUE3.Succeeded())
{
MissSoundCue.Add(MISSSOUNDCUE3.Object);
}
}
void AEDR_Boss_Giant::BeginPlay()
{
Super::BeginPlay();
// 게임 실행시 캐릭터 손에 무기 장착
FName WeaponSocket(TEXT("hand_rSpear"));
CurrentWeapon = (GetWorld()->SpawnActor<AEDR_Enemy_WeaponSpear>(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)); // 무기이동
}
}
BP_EDR_Boss_Giant
피격시 이펙트 및 사운드 로직
실행 화면
'Unreal Engine 5 > EDR_Project' 카테고리의 다른 글
EDR_Project / EDR_Enemy_WeaponSpear (0) | 2024.12.12 |
---|---|
EDR_Project / SWeaponAxe (0) | 2024.12.12 |
EDR_Project / Character (12) (1) | 2024.12.12 |
EDR_Project / EDR_Boss_Knight (4) 피격 사운드 출력 수정 (0) | 2024.12.02 |
EDR_Project / EDR_Enemy_Skeleton (2) | 2024.12.02 |