강의 내용 중 WBP_HpBar의 Parent Class를 설정하는 부분에서, WBP_HpBar의 Parent Class를 ABGASHPBarUserWidget으로 변경하고 있는데, WBP_HpBar 위젯은 ArenaBattleGAS가 아닌 ArenaBattle 모듈쪽에 있는 것으로 보여서 ArenaBattle쪽 위젯이 GAS쪽 클래스를 부모로 가지는 건 모듈 간 의존성 부분에서 좋지 않은 방법이 아닐까? 라는 생각이 들었어요. 해당 부분은 강의 내용처럼 저렇게 설정해도 문제가 없는 것인지, 혹은 더 좋은 방법이 있을지 궁금합니다!
5강을 듣고 수행하면서 마지막 테스트할 때 점프를 하기 위해 스페이스바를 누를 시 점프는 수행되지 않고 hitcheck만 계속해서 수행되는 것 같습니다. 코드와 tag등 똑같이 따라하였는데 무엇이 문제일까요? 위의 사진처럼 스페이스바를 꾹 누른 상태로 돌아다니면 점프 대신에 이렇게 나옵니다
안녕하세요. 저는 무기 아이템 액터가 무기를 휘두르는 몽타주를 재생하는 어빌리티를 멤버 변수로 갖고 있게 하고, 해당 무기를 장착했을 때 무기의 어빌리티를 매개변수로 전달받아 어빌리티를 활성화 하도록 구현하려고 하는데요. 이 경우에 어빌리티를 활성화하고 등록된 어빌리티를 다시 제거해 줄 필요는 없을까요? 같은 무기를 여러번 장착할 수도 있을텐데 ASC에 같은 어빌리티 여러 개가 등록되어 있는게 문제가 될 수도 있지 않나 해서 질문드립니다.
안녕하세요. 블록 태그 관련해서 질문 있습니다.강의에서는 각 어빌리티별로 블록할 태그들을 설정하고 있는데 이런 방식이라면 새로운 태그를 추가할 때마다 기존에 있던 어빌리티들의 블록할 태그에 해당 태그를 일일이 추가해줘야 하잖아요? enum 클래스를 사용해서 state패턴으로 구현하는 방법처럼 더 나은 방식은 없을까요?일반적으로 게임에서는 두 가지 이상의 행위를 동시에 하는 것은 막고 있기 때문에 블록 태그 같은 부정문 방식보다는 state패턴처럼 긍정문 방식이 더 좋을 것 같아 질문합니다.
안녕하세요. 두 가지 질문이 있습니다. 게임플레이 태그도 FName으로 구현되었다면 해시테이블 자료구조로 저장되어 있을 것이라 예측했는데 계층구조를 지원하는 검색기능을 제공한다면 게임플레이태그 컨테이너는 Trie같은 자료구조로 만들어져 있는 건가요? GAS를 사용해서 구현하는 방식이 액터로부터 기능을 분리하는 것인데 기존에 언리얼에서 제공하는 액터컴포넌트와 차이가 있을까요?
교수님 강의를 듣다 보니 private를 써도 되지 않나 싶은 곳에서도 전부 protected를 쓰시는 것을 보고 궁금증이 생겼습니다 예시로 4강에서 JumpAndWaitForLanding 클래스를 만들 때도 이 클래스는 제 생각에 더 파생되지 않을 것 같은데... 생각이 들었지만 protected를 사용하셨습니다 파생 클래스가 없다면 둘이 큰 차이는 없을 것 같다고 생각하지만 protected를 많이 사용하시는 이유와 스토리가 궁금합니다
PossessedBy 함수가 서버에서만 호출되기 때문에 인풋에 관련된 함수를 다시 호출해 주는 것은 이해했는데요, SetupPlayerInputComponent 가 아닌 SetupGASInputComponent를 호출하는 이유가 뭔가요? GAS에 관련된 인풋 함수만 중복 호출 하는 이유가 궁금합니다.
언리얼이 기본제공하는 태스크들이 정말 많아서 좀 둘러보다가 저희가 만든 AT_Trace랑 비슷한 "UAbilityTask_WaitTargetData"라는 게 있어서 좀 살펴봤는데요. Activate()에 있는 구현 내용이 중복되는 BeginSpawningActor() 와 FinishSpawningActor () 함수가 있는데 임의로 블루프린트에서 이 태스크를 실행해보니 Activate()가 실행이 안되고 이 두 함수가 실행되는 걸 봤습니다. 이런 식으로 그냥 실행해봤는데요. 사실 코드에선 어빌리티에서 CreateTarget()을 하고 ReadyForActivation()까지 호출해야 AT의 Activate()가 실행되는데 블루프린트에서는 이 노드 호출만으로 어떻게 AT가 실행까지 되는지도 잘 모르겠습니다. 거기에 UAbilityTask_WaitTargetData 처럼 Activate() 대신에 BeginSpawningActor()/FinishSpawningActor () 가 실행되는 이유도 알고 싶습니다.... 이 두 함수 존재의 설명은 엔진 주석에 나와있어서 어느정도 파악이 됐는데 문제는 코드에서든 블루프린트에서든 호출되는 조건을 잘 모르겠습니다...
AttackHit어빌리티의 스킬 공격 판정 결과 함수에서 스킬 타겟 액터는 HitResult 대신 Actors 에 충돌된 액터들을 넣어서 보내주기 때문에 TargetDataHandle에 대상 액터들이 들어있을 텐데요. 이를 엔진 내부에서 사용하여 한번의 ApplyGameplayEffectSpecToTarget() 호출로 각 대상 액터들에게 모두 Effect를 적용하는 걸로 예상하고 있습니다. 그런데 ASC에서 직접 BP_ApplyGameplayEffectSpecToTarget()을 할 때는 대상 액터가 여러개라면 For문으로 직접 여러번 호출할 수 밖에 없어 보이는데, 혹시 ASC도 Effect를 한번 호출로 여러 타겟에 적용하는 함수가 있나요??
나름대로 제가 알아볼 수 있을 정도만 정리 중인데요. SendGameplayEventToActor()가 어빌리티랑 이벤트 델리게이트를 활성화 할 수 있던데, 만약 이 두 개가 우연히 같은 Tag를 가지고있다면 Send 함수 호출 한번으로 둘이 동시에 실행되는 건가요???
AttributeSet의 각 함수에 대해 의미와 동작 방식, 사용처가 조금 헷갈려서 제가 실험을 좀 해본 후에 정리한 것인데요. 여기서 틀린 정보가 있을지 혹시 알 수 있을까요... 그리고 UAbilitySystemComponent:GetGameplayAttributeValueChangeDelegate(FGameplayAttributeAttribute) 이 델리게이트 같은 경우는 PostGameplayEffectExecute() 다음에 이벤트 발생 되는 건가요??