inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템

4장 UABAT_JumpAndWaitForLanding* CreateTask 에 대한 질문

142

hr

작성한 질문수 1

0

선생님 안녕하세요.

C++ 코드로는

UABGA_Jump::ActivateAbility();
UABAT_JumpAndWaitForLanding::CreateTask();
JumpAndWaitForLanding->ReadyForActivation();
UABAT_JumpAndWaitForLanding::Activate();

와 같은 일련의 코드 흐름이 이해가 가는데,

UFUNCTION(BlueprintCallable, Category = "Ability|Tasks", meta = (DisplayName = "JumpAndWaitForLanding", HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "TRUE"))
static UABAT_JumpAndWaitForLanding* CreateTask(UGameplayAbility* OwningAbility);

UABAT_JumpAndWaitForLanding* CreateTask()를 Blueprintcallable로 변경하시면서 블루프린트에서 CreateTask가 호출되도록 변경하셨는데.
JumpAndWaitForLanding->ReadyForActivation(); 함수를 주석 처리하셨는데도 불구하고,
UABAT_JumpAndWaitForLanding::Activate() 함수가 호출되는 이유를 잘 모르겠습니다.

void UGameplayAbility::ActivateAbility()
{
        if (bHasBlueprintActivate)
		K2_ActivateAbility();

개인적인 생각으로는 블루프린트 노드를 사용하게 되면 K2_ActivateAbility()가 호출되는걸로 봐서는 이 함수 내부에서 추가로 AbilityTask의 Activate함수를 호출해주는것 같은데, 함수 내부를 볼 수가 없습니다.
혹시 어떤 원리로 UABAT_JumpAndWaitForLanding::Activate()가 호출되는지 알수있을까요?

감사합니다.

unreal-engine ue-blueprint unreal-engine5 언리얼-c++ gas

답변 2

0

이득우

음.. 저도 내부적인 메커니즘까지 상세히 살펴보기보다, 동작방식에 대해 어느정도 감만 잡은 선에서 마쳤습니다. 사실 더 깊게 들어가면 엔진 구조를 뜯어보는 내용이 되어버려서.. 완전히 엉뚱한 길로 새겠더군요.
강의에서도 설명했지만, 블루프린트 노드의 실행과 C++ 실행의 메커니즘은 다릅니다.
C++은 ReadyForActivation을 명시적으로 호출해주어야 하지만, 블루프린트는 노드를 사용하면 내부적으로 알아서 호출되도록 설계되어 있습니다. 아마 설계적 관점에서 기획자가 사용한다 가정하고, 사용하는데 진입장벽을 낮추려고 만든 것 같습니다.
어떻게 해서 블루프린트가 ReadyForActivation를 자동으로 호출하는지에 대해서는 블루프린트 노드를 만드는 메커니즘과 좀 복잡한 과정을 이해해야하는데, 이를 세부적으로 이해하는게 GAS를 사용하는데 있어 중요한지는 잘 모르겠습니다.
그래도 궁금하시다면 소스코드에서 LatentGameplayTaskCall이라는 노드 설계를 참고하시면 좋을 것 같습니다.
추가로 K2_ActivateAbility 함수 호출은 블루프린트에서 작성한 ActivateAbility 이벤트(함수)를 호출한다고 생각하시면 됩니다.

0

hr

감사합니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. hr님.

UAbilityTask_WaitTargetData 관련하여 궁금증을 가지신 부분에 대해, 강의 질문 게시판에 이미 관련된 답변이 올라온 경우가 있습니다. 이를 통해 관련 내용을 이해하실 수 있을 것입니다.

유사한 질문과 답변 링크

  1. 언리얼 기본 제공 태스크 UAbilityTask_WaitTargetData

    • 질문자가 언리얼 엔진의 기본 제공 태스크들이 Activate() 대신 BeginSpawningActor()와 FinishSpawningActor()를 호출하는 원리에 대해 문의한 내용입니다.
    • 특히, 블루프린트와 C++ 코드 사이의 차이와 블루프린트에서 CreateTask가 호출되는 메커니즘에 대해 설명을 찾을 수 있습니다.
  2. ASC->SpawnedTargetActors 에 추가된 타겟 액터에 관해서 질문있습니다.

    • ActivateAbility와 관련한 게임플레이 어빌리티 시스템 내 함수 호출 과정에 대한 설명이 포함되어 있습니다.

설명

블루프린트에서 CreateTask를 호출하면 자동으로 Activate 함수가 호출되는 원리는 다음과 같습니다.
- 언리얼 엔진의 GameplayAbility 시스템 내의 블루프린트 함수들은 흔히 C++ 내 특정 메서드 호출을 추상화하거나 쉽게 사용할 수 있도록 돕습니다.
- K2_ActivateAbility()는 블루프린트에서 어빌리티가 활성화될 때 호출되는 함수입니다. 이는 내부적으로 어빌리티 태스크의 ReadyForActivation()도 호출하며, 이로 인해 Activate()가 실행됩니다.
- 블루프린트에서 CreateTask를 호출하고 나서, 바로 Activate()가 호출됩니다. 이는 언리얼 엔진이 블루프린트 함수 호출 시 자동으로 ReadyForActivation()을 호출하기 때문입니다.

요약

블루프린트에서 UABAT_JumpAndWaitForLanding의 CreateTask를 호출하면 내부적으로 K2_ActivateAbility()가 불리며, 이는 다시 ReadyForActivation()을 호출하여 결과적으로 C++ 코드 내 Activate() 함수가 실행됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

OnInterruptedCallback()으로 몽타주가 중간에 취소될 경우 CancelAbility를 호출하는게 맞을까요 ?

0

40

1

HasMatchingGameplayTag 역활이 조금 이해가 안갑니다.

0

47

1

캐릭터 스탯 초기 설정 방법 질문

0

89

2

언라얼 공식 홈페이지 튜토리얼 강의에 질문 있습니다

0

87

2

StartAbility, StartInputAbility 둘 다 GiveAbility를 호출해야하나요?

0

77

2

AnimNotify 구현 질문

0

107

2

[6강] ShowDebug에서 Attributes for avater가 변하지 않아요..

0

82

2

4강에서 콤보 공격시 다음 공격을 할 경우 ActivateAbility가 자동으로 발동되는 이유

0

114

2

9강 44:59 부분에서 질문이 있습니다.

0

83

2

8강 24:22 CurrentAttributeSet 질문입니다.

0

69

2

ASC 에서 AttributeSet 함수에 대한 mutable 반환 함수가 없는 이유

0

88

2

SetupGASInputComponent 함수 호출위치가 이해가안갑니다.

0

147

3

[GAS] Player State에 대해 궁금한 점이 있습니다.

0

138

2

AnimNotify를 GA에서 받는방법이 있을까요?

0

88

2

ABP의 skeleton 오류

0

118

1

장판스킬을 만들때 콜리전설정

0

175

2

어빌리티의 쿨다운 GameEffect에 대하여

0

265

2

GAS 구조로 멀티 플레이 게임을 제작할려고 하는데요

0

232

2

5.4버전 기준으로 Remove Gameplay Effect With Tags가 안 보입니다.

0

287

3

8강의 수업 내용들 중 이해가 잘 안가는 부분들이 있습니다.

0

211

2

7강 GE로 NonPlayer의 어트리뷰트셋 값을 초기화시키는 것에 질문이 있습니다.

0

111

2

7강 정리했는데 검토부탁드려요

0

127

1

5강 정리해봤는데 검토부탁드립니다.

0

136

2

4강의 CreateTask 함수 질문입니다,

0

160

2