inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

6강 : 캐릭터 어트리뷰트 설정

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

83

제정민

작성한 질문수 8

0

안녕하세요.

 

UABGA_AttackHitCheck::OnTraceResultCallback 구현에서 질문 드릴 게 있습니다.

 

UABCharacterAttributeSet* TargetAttribute = const_cast<UABCharacterAttributeSet*>(TargetASC->GetSet<UABCharacterAttributeSet>());

 

게임 로직 만들면서 AttributeSet 의 값을 변경해야 할 경우가 많을 것 같은데요. ASC 에서 변경가능한 AttributeSet 의 참조나 mutable 포인터를 반환하는 함수를 구현하지 않은 이유가 있나요?
const_cast 로 억지로 const 를 벗겨내는 게 자연스럽게 느껴지진 않아서요.

 

다른 곳에서 값을 변경하게 코드를 작성해야 하는 디자인 측면이 있는 건지, 경험적인 정책 측면이 있는 건지 궁금해서 질문 드렸습니다.

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

답변 2

1

이득우

안녕하세요. 답신이 늦었습니다.
해당코드는 저도 작성하면서 고민이 되었던 부분인데,
우선 원칙적으로 Attrribute는 Gameplay Effect에 의해서만 변경되도록 설계되었습니다. 다시말하면 Attribute 값은 Attribute 클래스 내에서 변경하는 것이 원칙인거죠.
그래서 에픽은 모든 get 함수에 대해 const로 지정한 것으로 보여지는데, 초기화시에는 어쩔 수 없이 델리게이트때문에 클래스 인스턴스를 수정해야 하니 이를 위해 mutable로 풀었다정도로 이해해주시면 될 것 같아요. 사실 해당 코드는 에픽 공식 Lyra 샘플에서 사용한 방법을 차용했습니다. 소스코드를 건드리는게 아닌 이상 딱히 다른 방법이 없더군요.
재미있는건 블루프린트에서는 C++의 const 한정자가 먹지 않아서.. 오히려 깔끔하게 쓸 수 있습니다. Ability System Component에서 GetAttribute 노드로 가져와서 그냥 바인딩 걸면 됩니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 제정민님!

ASC(Ability System Component)에서 AttributeSet에 대한 변경 가능한 포인터나 참조를 반환하는 함수를 제공하지 않는 이유는 여러 측면에서 고려될 수 있습니다.

  1. 안정성: AttributeSet의 멤버를 직접 변경하는 것보다, 시스템의 다른 부분에서 정의된 방식으로 변경하는 것이 안전합니다. 이는 시스템의 일관성을 보장하고, 의도치 않은 변화를 방지할 수 있습니다.

  2. 디자인 패턴: 이러한 접근 방식은 상태를 변경할 수 있는 부분을 제한하여 코드의 예측 가능성과 유지보수성을 높이는 디자인 패턴을 따릅니다. 이를 통해, AttributeSet을 변경할 때 발생할 수 있는 복잡한 상황을 줄일 수 있습니다.

  3. 캡슐화: AttributeSet의 내부 상태를 캡슐화함으로써, 외부에서 값이 임의로 변경되는 것을 막고, 변경이 필요한 경우에만 명시적으로 정의된 인터페이스를 통해 이루어지도록 합니다. 이는 보안 측면에서도 유리합니다.

위의 이유들 때문에 const_cast를 사용하여 억지로 const를 제거하는 대신, 공식적인 인터페이스를 통해 AttributeSet의 값을 변경하는 것이 권장됩니다.

그 밖에 다른 관련된 내용은 다음의 게시물을 참조해 보실 수 있습니다:

  • AttributeSet 함수 정리: AttributeSet의 각 함수에 대한 의미와 동작 방식을 정리한 게시물로, 사용 사례가 잘 설명되어 있습니다.

만약 추가적인 질문이 있으시다면, 언제든지 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

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

0

36

1

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

0

42

1

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

0

84

2

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

0

80

2

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

0

73

2

AnimNotify 구현 질문

0

101

2

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

0

76

2

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

0

111

2

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

0

77

2

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

0

63

2

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

0

144

3

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

0

130

2

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

0

83

2

ABP의 skeleton 오류

0

113

1

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

0

170

2

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

0

255

2

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

0

224

2

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

0

281

3

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

0

206

2

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

0

107

2

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

0

121

1

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

0

128

2

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

0

153

2

2강에서 TimerAction함수 질문입니다.

0

116

2