0. 개요
고블린 주술사가 소환하는 소환수인 악마를 생성한다.
악마는 근접공격과 원거리공격 모두 사용한다.
1. 데몬(Demon)
(1) 데몬 블루프린트 생성
BP_EnemyBase를 부모로 하는 데몬 블루프린트를 생성한다.
스켈레탈 메시를 지정하고 캡슐의 높이를 조정한다.
(2) 데몬 애니메이션 블루프린트 생성
ABP_Enemy를 부모로 하는 데몬의 애니메이션 블루프린트를 생성한다.
이미 존재하는 블렌드 스페이스를 넣는다.
(3) 블루프린트에서 애님 클래스 지정
(4) 무기 소켓 지정
데몬의 근접 공격은 꼬리의 TailSocket을 이용하여 공격한다.
Weapon Tip Socket Name을 TailSocket으로 지정한다.
2. 데몬의 근접 공격
(1) 근접 공격 몽타주 생성
데몬은 공격 몽타주를 좌, 우 두 개의 버전이 있으므로 몽타주를 두 개 만든다.
(2) 모션 워핑 적용
(3) 애님 노티파이를 이용한 이벤트 발동
(4) 꼬리 공격을 위한 Native 게임플레이 태그 생성
(5) 꼬리 공격을 위해 AuraCharacterBase에 소켓 추가
// 공격 소켓
UPROPERTY(EditAnywhere, Category = "Combat")
FName TailSocketName;
FVector AAuraCharacterBase::GetCombatSocketLocation_Implementation(const FGameplayTag& MontageTag)
{
// TO-DO : MontageTag에 따라서 알맞은 소켓 반환하기
const FAuraGameplayTags& GameplayTags = FAuraGameplayTags::Get();
if (MontageTag.MatchesTagExact(GameplayTags.CombatSocket_Weapon) && IsValid(Weapon))
{
return Weapon->GetSocketLocation(WeaponTipSocketName);
}
if (MontageTag.MatchesTagExact(GameplayTags.CombatSocket_LeftHand))
{
return GetMesh()->GetSocketLocation(LeftHandSocketName);
}
if (MontageTag.MatchesTagExact(GameplayTags.CombatSocket_RightHand))
{
return GetMesh()->GetSocketLocation(RightHandSocketName);
}
if (MontageTag.MatchesTagExact(GameplayTags.CombatSocket_Tail))
{
return GetMesh()->GetSocketLocation(TailSocketName);
}
return FVector();
}
이후 BP_Demon에서 소켓을 올바르게 지정해준다.
(6) 피격 사운드 추가
테스트 이후 데몬의 공격이 잘 적중하지 않는다면 애님 노티파이 이벤트를 조절한다.
3. 데몬의 원거리 공격
(1) 루트 모션 활성화
모션 워핑을 사용하기 위해 데몬의 던지기 애니메이션에서 루트 모션을 활성화한다.
(2) 원거리 공격 몽타주 생성
이 데몬은 근접 공격을 사용하는 클래스와 원거리 공격을 사용하는 클래스를 따로 생성하여 사용할 것이다.
원거리 공격의 Event Tag는 Montage.Attack.1을 사용할 것이다.
(3) 형제 클래스 생성
클래스를 새로 생성하여 이름을 다르게 하고 블루프린트에 클래스 디폴트 설정을 변경한다.
클래스를 복제(복사)하여 만들면 AttributeSet을 초기화하는데에 크래시가 발생하니 반드시 새롭게 만들어야 한다.
(3-1) 데몬 스켈레탈 메시 수정
왼손에 소켓을 추가하여 LeftHandSocket으로 이름을 바꾼다.
(3-2) 블루프린트 클래스 디폴트 수정
(4) 버그 수정
이제 테스트를 실행하면 공격이 정상적으로 작동하지 않을 것이다.
이는 Ranger 클래스의 GA_RangedAttack에서 마지막에 호출되는 Spawn Projectile 함수가 무기 소켓의 이름을 가져오기 때문이다.
이제 해당 함수를 소켓 이름을 가져오도록 하고 해당 소켓을 찾아 그 위치에서 소환하도록 함수를 수정할 것이다.
(4-1) AuraProjectileSpell
UFUNCTION(BlueprintCallable, Category="Projectile")
void SpawnProjectile(const FVector& ProjectileTargetLocation, const FGameplayTag& SocketTag);
void UAuraProjectileSpell::SpawnProjectile(const FVector& ProjectileTargetLocation, const FGameplayTag& SocketTag)
{
const bool bIsServer = GetAvatarActorFromActorInfo()->HasAuthority();
if (!bIsServer)
return;
const FVector SocketLocation = ICombatInterface::Execute_GetCombatSocketLocation(
GetAvatarActorFromActorInfo(),
SocketTag);
무기 소켓의 태그를 가져오는 것이 아니라 입력으로 받은 소켓의 태그를 가져오도록 설정한다.
(4-2) GA_RangedAttack
이제 분해된 TaggedMontage의 핀에서 소켓 태그를 가져와 연결한다.
기존에 Get Socket Location으로 가져오던 노드는 삭제한다.
(4-3) GA_Firebolt
Aura 캐릭터가 사용하는 파이어볼트는 Weapon 소켓에서 발사되므로 위와 같이 하드코딩이 가능하다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
17-9. AI 마법 공격 - (4) 주술사 데몬 소환 어빌리티 (0) | 2025.01.08 |
---|---|
17-8. 고블린 주술사 소환수 - (2) 데몬 몬스터 폴리싱 (0) | 2025.01.08 |
17-7. 전투 폴리싱 - (7) 구울 - 사운드 추가, 공격 궤적 그리기 (0) | 2025.01.07 |
17-6. 전투 폴리싱 - (6) 고블린 주술사 - 피격 반응, 사운드 추가 (0) | 2025.01.07 |
17-5. 전투 폴리싱 - (5) 새총 고블린 - 돌 투사체 사운드 추가 및 바닥 콜리전 (0) | 2025.01.07 |