0. 개요

GA_MeleeAttack 게임플레이 어빌리티를 소켓이 없는 몬스터도 사용할 수 있도록 확장할 것이다.

 

 

1. TaggedMontage - 태그된 몽타주 구조체

(1) 몽타주에 대한 Native 태그 생성

구울 몬스터에 경우 애니메이션이 왼손 공격, 오른손 공격 두 개를 가진다.

이에 따른 태그를 생성한다.

	// 몽타주
	FGameplayTag Montage_Attack_Weapon;
	FGameplayTag Montage_Attack_RightHand;
	FGameplayTag Montage_Attack_LeftHand;
	// 몽타주
	GameplayTags.Montage_Attack_LeftHand = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Montage.Attack.LeftHand"),
		FString("LeftHand")
	);

	GameplayTags.Montage_Attack_RightHand = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Montage.Attack.RightHand"),
		FString("RightHand")
	);

	GameplayTags.Montage_Attack_Weapon = UGameplayTagsManager::Get().AddNativeGameplayTag(
		FName("Montage.Attack.Weapon"),
		FString("Weapon")
	);

 

 

(2) CombatInterface 전투 인터페이스에 몽타주와 태그 연결

이제 구조체를 만들어 몽타주와 태그를 연결하게 할 것이다.

#pragma once

#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "GameplayTagContainer.h"
#include "CombatInterface.generated.h"

USTRUCT(BlueprintType)
struct FTaggedMontage
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	UAnimMontage* Montage = nullptr;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FGameplayTag MontageTag;
};

 

 

(3) AuraCharacterBase에서 공격 몽타주에 대한 배열 저장

	// 몽타주와 태그
	UPROPERTY(EditAnywhere, category="Combat")
	TArray<FTaggedMontage> AttackMontages;

 

 

(3-1) 전투 인터페이스에서 블루프린트 Native 이벤트 함수 구현

	UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
	TArray<FTaggedMontage> GetAttackMontages();
};

 

 

(3-2) AuraCharacterBase에서 GetAttackMontages 오버라이드

	/** 전투 인터페이스 **/
	virtual UAnimMontage* GetHitReactMontage_Implementation() override;
	virtual void Die() override;
	virtual FVector GetCombatSocketLocation_Implementation() override;
	virtual bool IsDead_Implementation() const override;
	virtual AActor* GetAvatar_Implementation() override;
	virtual TArray<FTaggedMontage> GetAttackMontages_Implementation() override;
	/**여기까지 전투 인터페이스**/
TArray<FTaggedMontage> AAuraCharacterBase::GetAttackMontages_Implementation()
{
	return AttackMontages;
}

 

 

2. 블루프린트

(1) 공격 몽타주 배열에 몽타주 추가하기

공격 몽타주와 몽타주 태그를 부여한다.

 

 

(2) 여러개의 몽타주 중 랜덤한 하나를 선택하기

인덱스 0부터 크기-1 까지의 수 중 하나를 뽑아 가져온다.

가져온 몽타주를 재생하고 태그를 이벤트로 넘긴다.

 

 

(3) 몽타주 애님 노티파이 수정

노티파이에서 호출할 이벤트 태그를 Montage.Attack.Weapon으로 변경한다.

 

 

 

3. 소켓 위치 Getter 함수 수정하기

(1) CombatInterface 전투 인터페이서의 GetCombatSocketLocation 함수 수정하기

이제 게임플레이 태그에 따라서 소켓의 위치를 가져올 것이다.

	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
	void UpdateFacingTarget(const FVector& Target);

 

 

(1-2) AuraProjectileSpell에서 호출한 GetCombatSocketLocation 함수 수정

void UAuraProjectileSpell::SpawnProjectile(const FVector& ProjectileTargetLocation)
{
	const bool bIsServer = GetAvatarActorFromActorInfo()->HasAuthority();
	if (!bIsServer)
		return;
		
	const FVector SocketLocation = ICombatInterface::Execute_GetCombatSocketLocation(
		GetAvatarActorFromActorInfo(),
		FAuraGameplayTags::Get().Montage_Attack_Weapon);

 

 

(1-3) AuraCharacterBase에서 새로운 소켓 추가

virtual FVector GetCombatSocketLocation_Implementation(const FGameplayTag& MontageTag) override;

 

	// 주문 발동 체크용 소켓
	UPROPERTY(EditAnywhere, Category = "Combat")
	FName WeaponTipSocketName;

	// 공격 소켓
	UPROPERTY(EditAnywhere, Category = "Combat")
	FName LeftHandSocketName;

	// 공격 소켓
	UPROPERTY(EditAnywhere, Category = "Combat")
	FName RightHandSocketName;
FVector AAuraCharacterBase::GetCombatSocketLocation_Implementation(const FGameplayTag& MontageTag)
{
	// TO-DO : MontageTag에 따라서 알맞은 소켓 반환하기
	const FAuraGameplayTags& GameplayTags = FAuraGameplayTags::Get();
	if (MontageTag.MatchesTagExact(GameplayTags.Montage_Attack_Weapon) && IsValid(Weapon))
	{
		return Weapon->GetSocketLocation(WeaponTipSocketName);
	}
	if (MontageTag.MatchesTagExact(GameplayTags.Montage_Attack_LeftHand))
	{
		return GetMesh()->GetSocketLocation(LeftHandSocketName);
	}
	if (MontageTag.MatchesTagExact(GameplayTags.Montage_Attack_RightHand))
	{
		return GetMesh()->GetSocketLocation(RightHandSocketName);
	}
	return FVector();
}

 

 

(2) GA_MeleeAttack에서 수정된 GetCombatSocketLocation 함수에 핀 연결하기

 

 

4. 구울 몬스터의 스켈레탈 메시에 소켓 추가

왼손과 오른손에 대해 공격을 위한 소켓을 추가한다.

위치도 조정한다.