* 태그를 부여해주는 GE 만들기
- 태그추가 해주시고
struct FAuraGameplayTags
{
public:
..
FGameplayTag Effects_HitReact;
GameplayTags.Effects_HitReact = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Effects.HitReact"),
FString("Effects.HitReact")
);
Hit가 된대상의 태그가 HitReact로 바뀔거임
* 적클래스에서 태그의 변화를 구독하기
- 콜백 함수추가
void AAuraEnemy::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
}
- 태그가 변경되면 실행될 콜백 함수 등록
void AAuraEnemy::BeginPlay()
{
//해당 태그가 new or remove 되면 콜백함수실행
AbilitySystemComponent->RegisterGameplayTagEvent(FAuraGameplayTags::Get().Effects_HitReact, EGameplayTagEventType::NewOrRemoved).AddUObject(
this,
&AAuraEnemy::HitReactTagChanged
);
- 콜백함수 구현
void AAuraEnemy::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
bHitReacting = NewCount>0; //맞는불이 있는지
GetCharacterMovement()->MaxWalkSpeed = bHitReacting?0.f:BaseWalkSpeed; //맞는중에는 못움지기게
}
* 타격시 애니메이션 구현
- 몽타주 getter interface 만들고
base에서 구현
class AURA_API ICombatInterface
{
GENERATED_BODY()
UFUNCTION(BlueprintNativeEvent) //버츄어쓰면 BP에서 못봄 -> native쓰고 base에서 _imp붙여서 cpp에서 구현
UAnimMontage* GetHitReactMontage();
- base에서 getter만 만들어주면됨
구현(의존성주입)은 bp에서 할거임
UPROPERTY(EditAnywhere, Category = "Combat")
TObjectPtr<UAnimMontage> HitReactMontage;
UAnimMontage* AAuraCharacterBase::GetHitReactMontage_Implementation()
{
return HitReactMontage;
}
- GA 에서 하는일
: 오너(고블린)에게 GE 적용(태그추가)하고
아바타액터(고블린)을 CI로 캐스팅하고, 몽타주를 얻고 재생함
* next : 끝난후 효과GE 제거
* 피해가 치명적이아닌경우 -> hitReaction 재생
- 적이 위의 능력을 가지고있어야함
- 적이 hitReaction 능력을 갖고있는지 확인후 실행하면됨
- 캐릭터인포에서 능력들을 갖도록 함. 이후 적에서 사용하면 될듯?
class AURA_API UCharacterClassInfo : public UDataAsset
{
...
UPROPERTY(EditDefaultsOnly, Category="Common Class Defaults")
TArray<TSubclassOf<UGameplayAbility>> CommonAbilities;
- 능력부여 어케함?
- 함수구현 : 능력들배열을 얻어와서 giveability하는 함수임
//시작 능력을 주는함수
void UAuraAbilitySystemLibrary::GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC)
{
//게임모드를 얻어오고
AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
if(AuraGameMode==nullptr) return;
//게임모드에있는 클래스정보들에 대해
UCharacterClassInfo* CharacterClassInfo = AuraGameMode->CharacterClassInfo;
//그안에있는 능력들에대해 giveAbility 하면됨
for(auto AbilityClass : CharacterClassInfo->CommonAbilities)
{
FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
ASC->GiveAbility(AbilitySpec);
}
}
- 적클래스에서 위의 함수 호출 // 적이가지고있는 능력들 부여
void AAuraEnemy::BeginPlay()
{
...
UAuraAbilitySystemLibrary::GiveStartupAbilities(this,AbilitySystemComponent);
- AS에서 적이사망이 아닌경우, 태그확인후 히트리액션 재생
void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
...
if(Data.EvaluatedData.Attribute==GetIncomingDamageAttribute())
{
const float LocalIncomingDamage = GetIncomingDamage();
SetIncomingDamage(0.f);
if(LocalIncomingDamage > 0.f)
{
const float NewHealth = GetHealth() - LocalIncomingDamage;
SetHealth(FMath::Clamp(NewHealth,0.f,GetMaxHealth())); //음수인경우 조정하고 체력깍기
const bool bFatal = NewHealth<=0.f; //사망에이를만한 피해인지
//사망이아닌경우 히트리액션을 재생
if(!bFatal)
{
//HitReactTag일때만 능력활성화
FGameplayTagContainer TagContainer;
TagContainer.AddTag(FAuraGameplayTags::Get().Effects_HitReact);
Props.TargetASC->TryActivateAbilitiesByTag(TagContainer);
}
- 끝난후 GE 효과제거, 능력끝내기
'UE5 > Damage' 카테고리의 다른 글
[UE5] 맞은적 머리위에 데미지 뜨도록 구현 (0) | 2024.06.23 |
---|---|
[UE5] 적 죽을때 용해효과 구현 (0) | 2024.06.23 |
[UE5] 적 죽음 구현 (0) | 2024.06.23 |
[UE5] json으로 레벨별 데미지 구현 (0) | 2024.06.23 |
[UE5] 데미지계산용 Meta 속성추가 // 데미지 계산하는 방법 (0) | 2024.06.22 |