Gameplay Ability System - osy9611/ProjectPT GitHub Wiki

Gameplay Ability System

์ด ๋ฌธ์„œ๋Š” Gameplay Ability System (GAS)์„ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ด๋‹ค. PTGameAbility๋ฅผ ์ƒ์†ํ•œ ๊ฐœ๋ณ„ ํด๋ž˜์Šค๋Š” ์ œ์™ธํ•˜๊ณ , ์ „์ฒด์ ์ธ ๊ตฌ์กฐ์™€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ–ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฌผ

Attack
Attack GIF
Skill
Skill GIF

PTAbilitySystemComponent

  • ์ž…๋ ฅ ์ด๋ฒคํŠธ ๊ฐ์ง€ ๋ฐ Ability ์‹คํ–‰
    • ํ”Œ๋ ˆ์ด์–ด์˜ ์ž…๋ ฅ์ด ๊ฐ์ง€๋˜๋ฉด AbilitySpecInputPressed ๋˜๋Š” AbilitySpecInputReleased ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

    • InvokeReplicatedEvent๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น Ability๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

    • GameplayTag๋ฅผ ํ™œ์šฉํ•ด ํŠน์ • Ability๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

    • ์ฃผ์š” ์ฝ”๋“œ

      void UPTAbilitySystemComponent::AbilitySpecInputPressed(FGameplayAbilitySpec& Spec)
      {
          Super::AbilitySpecInputPressed(Spec);
      
          if (Spec.IsActive())
              InvokeReplicatedEvent(EAbilityGenericReplicatedEvent::InputPressed, 
                                    Spec.Handle, 
                                    Spec.ActivationInfo.GetActivationPredictionKey());
      }
      
      void UPTAbilitySystemComponent::AbilitySpecInputReleased(FGameplayAbilitySpec& Spec)
      {
          Super::AbilitySpecInputReleased(Spec);
      
          if (Spec.IsActive())
              InvokeReplicatedEvent(EAbilityGenericReplicatedEvent::InputReleased, Spec.Handle, Spec.ActivationInfo.GetActivationPredictionKey());
      }

PTAttributeSet

  • ์บ๋ฆญํ„ฐ & AI ๋Šฅ๋ ฅ์น˜๋ฅผ ๊ด€๋ฆฌ

    • TCharacter_AttributeSet โ†’ ํ”Œ๋ ˆ์ด์–ด์˜ ์ฒด๋ ฅ, ์Šคํ‚ฌ ์ •๋ณด ๊ด€๋ฆฌ

    • PTAI_AttributeSet โ†’ AI ๋ชฌ์Šคํ„ฐ์˜ ์ฒด๋ ฅ, ์Šคํ‚ฌ ์ •๋ณด ๊ด€๋ฆฌ

      ํด๋ž˜์Šค๋ช… ์—ญํ• 
      PTCharacter_AttributeSet ํ”Œ๋ ˆ์ด์–ด์˜ ์ฑ„๋ ฅ, ์Šคํ‚ฌ ์ •๋ณด ๊ด€๋ฆฌ
      PTAI_AttributeSet AI ๋ชฌ์Šคํ„ฐ์˜ ์ฒด๋ ฅ, ์Šคํ‚ฌ ์ •๋ณด ๊ด€๋ฆฌ
      PostGameplayEffectExecute ๋Šฅ๋ ฅ์น˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ UI ๋ฐ AI ์ƒํƒœ ์—…๋ฐ์ดํŠธ
      InitAttributeSet ์บ๋ฆญํ„ฐ/๋ชฌ์Šคํ„ฐ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ์ดˆ๊ธฐ ๋Šฅ๋ ฅ์น˜ ๋กœ๋“œ
  • ์˜ˆ์ œ ์ฝ”๋“œ - ์ฒด๋ ฅ ๋ณ€๊ฒฝ ์‹œ UI ์—…๋ฐ์ดํŠธ

    void UPTCharacter_AttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
    {
        Super::PostGameplayEffectExecute(Data);
    
        if (Data.EvaluatedData.Attribute == GetHealthAttribute())
        {
            const FPTGameplayTags& GameplayTags = FPTGameplayTags::Get();
            UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this);
    
            float HealthRatio = GetHealth() / GetMaxHealth();
            FUIHPMessage UIHealthMessage;
            UIHealthMessage.HealthAmount = HealthRatio;
    
            MessageSubsystem.BroadcastMessage(GameplayTags.UI_Event_Health, UIHealthMessage);
        }
    }
  • ์ถ”๊ฐ€ ์„ค๋ช…

    • PostGameplayEffectExecute๋Š” GAS์—์„œ ๋Šฅ๋ ฅ์น˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
    • ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ”Œ๋ ˆ์ด์–ด ์ฒด๋ ฅ์ด ๋ณ€ํ•˜๋ฉด UI์— ๋ฐ˜์˜๋˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

UPTGameplayAbility

  • Ability ์‹คํ–‰ ์‹œ ์บ๋ฆญํ„ฐ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

    • GetPTCharacterFromActorInfo() โ†’ ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

    • GetPTAICharacterFromActorInfo() โ†’ AI ์บ๋ฆญํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

    • ์˜ˆ์ œ ์ฝ”๋“œ

      APTCharacter* UPTGameplayAbility::GetPTCharacterFromActorInfo()
      {
          return CurrentActorInfo ? Cast<APTCharacter>(CurrentActorInfo->AvatarActor.Get()) : nullptr;
      }
  • Gameplay Ability ์‹คํ–‰ ์‹œ ์นด๋ฉ”๋ผ ๋ชจ๋“œ ๋ณ€๊ฒฝ

    • SetCameraMode๋กœ ์นด๋ฉ”๋ผ ๋ชจ๋“œ ์ ์šฉ โ†’ Ability ์‹คํ–‰ ํ›„ ClearCameraMode๋กœ ์›๋ž˜ ์ƒํƒœ ๋ณต๊ท€

    • ์˜ˆ์ œ ์ฝ”๋“œ

      void UPTGameplayAbility::SetCameraMode(TSubclassOf<UPTCameraMode> CameraMode, bool UseFovOffset)
      {
          if (UPTHeroComponent* HeroComponent = GetPTHeroComponentFromActorInfo())
          {
              HeroComponent->SetAbilityCameraMode(CameraMode, CurrentSpecHandle, UseFovOffset);
              ActiveCameraMode = CameraMode;
          }
      }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ