득이공간

[게임플레이 어빌리티 시스템] 3장. 어트리뷰트와 게임플레이 이펙트의 이해 본문

GP/UE5

[게임플레이 어빌리티 시스템] 3장. 어트리뷰트와 게임플레이 이펙트의 이해

쟁득 2024. 7. 19. 10:27
해당 게시물은 이득우 교수님의 '게임플레이 어빌리티 시스템' 강의를 수강하며
학습한 내용을 개인적으로 정리한 글입니다.

📌 목차 - 3장. 어트리뷰트와 게임플레이 이펙트의 이해

3-1. 캐릭터 어트리뷰트 설정

3-2. 게임플레이 이펙트의 활용

3-3. 어트리뷰트와 UI 연동


📌 3-1. 캐릭터 어트리뷰트 설정

1. GAS NPC 제작과 캐릭터에 어트리뷰트를 부여하는 방법의 이해
2. ASC에서 어트리뷰트 세트를 초기화하는 과정의 학습
3. NPC의 어트리뷰트와 태그 값을 확인할 수 있는 디버그 시스템의 추가 설정
4. ASC와 매크로를 사용해 어트리뷰트 값을 가져오고, 변경하는 기능의 구현
5. 변경되는 어트리뷰트 값의 검증 방법 학습

 

  • 캐릭터 어트리뷰트 설정 기획
    • 캐릭터에 설정할 어트리뷰트 목록
    • 기본 어트리뷰트
      • 체력 (Health)
      • 일반 공격 길이 (AttackRange)
      • 일반 공격 반경 (AttackRadius)
      • 일반 공격력 (AttackRate)
    • 최대값 어트리뷰트
      • 최대 체력 (MaxHealth)
      • 최대 일반 공격 길이 (MaxAttackRange)
      • 최대 일반 공격 반경 (MaxAttackRadius)
      • 최대 일반 공격력 (MaxAttackRate)
  • 이번 강의에서 진행할 핵심 컴포넌트
    • 어빌리티 시스템 컴포넌트 (ASC): 어빌리티 시스템 컴포넌트
    • 어트리뷰트 (Attribute): 게임플레이 어트리뷰트 데이터, 어트리뷰트 세트
  • 어트리뷰트 세트 (Attribute Set)
    • 단일 어트리뷰트 데이터인 GameplayAttributeData의 묶음
    • GameplayAttributeData는 하나의 값이 아닌 두 가지 값으로 구성되어 있음
      • BaseValue: 기본 값. 영구히 적용되는 고정 스탯 값을 관리하는데 사용
      • CurrentValue: 변동 값. 버프(Buff) 등으로 임시적으로 변동된 값을 관리하는데 사용
    • 어트리뷰트 세트의 주요 함수
      • PreAttributeChange: 어트리뷰트 변경 전에 호출
      • PostAttributeChange: 어트리뷰트 변경 후에 호출
      • PreGameplayEffectExecute: 게임플레이 이펙트 적용 전에 호출
      • PostGameplayEffectExecute: 게임플레이 이펙트 적용 후에 호출
    • 어트리뷰트 세트 접근자 매크로
      • 많이 수행되는 기능에 대해 매크로를 만들어 제공함
    • ASC는 초기화될 때 같은 액터에 있는 UAttributeSet 타입 객체를 찾아서 등록함

📌 3-2. 게임플레이 이펙트의 활용

1. 인스턴트 게임플레이 이펙트를 사용한 체력 감소 기능의 구현
2. 데이터 태그를 활용하는 등 다양한 방법으로 체력 감소 기능을 구현
3. 대미지 메타 어트리뷰트를 활용한 체력 감소 기능의 구현
4. 레벨과 커브테이블을 활용한 보정된 대미지 구현
5. 캐릭터 레벨에 따른 초기 어트리뷰트 설정기능의 구현

 

  • 이번 강의에서 구현할 신규 기능 기획
    • 콤보 공격 히트시 뒤로 갈 수록 전달하는 대미지가 증가하도록 설정
    • 레벨에 따라 스폰된 캐릭터가 다른 체력 값을 가지도록 설정
  • 이번 강의에서 진행할 핵심 컴포넌트
    • 어빌리티 시스템 컴포넌트 (ASC): 어빌리티 시스템 컴포넌트
    • 게임플레이 이펙트 (GE): 게임플레이 이펙트
    • 어트리뷰트 (Attribute): 게임플레이 어트리뷰트 데이터, 어트리뷰트 세트
  • 게임플레이 이펙트 (Gameplay Effect)
    • GAS는 게임에 영향을 주는 객체를 별도로 분리해서 관리함
    • 게임에 영향을 준다는 것은 대부분 게임 데이터를 변경한다는 것을 의미함
    • 따라서 대부분 게임플레이 이펙트와 어트리뷰트는 함께 동작하도록 구성되어 있음
    • GAS 시스템에서 가장 많은 기능을 제공하는 클래스
    • 세 가지 타입 중 하나를 선택할 수 있음
      • Instant: 어트리뷰트에 즉각적으로 적용되는 게임플레이 이펙트. 한 프레임에 실행됨
      • Duration: 지정한 시간 동안 동작하는 게임플레이 이펙트
      • Infinite: 명시적으로 종료하지 않으면 계속 동작하는 게임플레이 이펙트
    • 이 외에도 정말 다양하게 많은 옵션을 제공함
  • 게임플레이 이펙트 모디파이어 (Modifier)
    • GE에서 어트리뷰트의 변경 방법을 지정한 설정을 모디파이어라고 함
    • 모디파이어의 사용 방법
      • 적용할 어트리뷰트의 지정
      • 적용 방식의 설정: 더하기, 곱하기, 나누기, 덮어쓰기
    • 모디파이어의 계산 방법
      • ScalableFloat: 실수 (데이터 테이블과 연동 가능)
      • AttributeBased: 특정 어트리뷰트에 기반
      • CustomCalculationClass: 계산을 담당하는 전용 클래스의 활용
      • SetByCaller: 데이터 태그를 활용한 데이터 전달
    • 모디파이어 없이 자체 계산 로직을 만드는 것도 가능 (GameplayEffectExecutionCalculation)
    • C++로 설정하기에는 문법이 복잡해서, 블루프린트로 제작하는 것을 권장
  • 메타(Meta) 어트리뷰트
    • 어트리뷰트의 설정을 위해 사전에 미리 설정하는 임시 어트리뷰트
    • ex) 체력을 바로 깎지 않고, 대미지를 통해 체력을 감소하도록 설정
      • 체력은 일반 어트리뷰트, 대미지는 메타 어트리뷰트
    • 대미지를 사용하는 경우 기획 추가에 유연한 대처가 가능
      • 무적 기능의 추가 (대미지를 0으로 처리)
      • 실드 기능의 추가 (실드 값을 토대로 실드 값만큼 대미지를 처리)
      • 콤보 진행시 공격력 보정 기능 추가 (콤보 증가시 대미지를 보정하도록 구현)
    • 메타 어트리뷰트는 적용 후 바로 0으로 값을 초기화하도록 설정
    • 메타 어트리뷰트는 리플리케이션에서 제외시키는 것이 일반적
  • 레벨과 커브 테이블
    • 게임플레이 이펙트에는 추가적으로 레벨 정보를 지정할 수 있음
    • 게임플레이 이펙트에 저장된 레벨 정보를 사용해 데이터 테이블에서 특정 값을 가져올 수 있음
    • ScalableFloat 모디파이어 타입에서 이를 사용하는 것이 가능
    • 이를 활용해 다양한 기능을 구현하는 것이 가능
      • 콤보 추가시 증가하는 요율을 반영해 최종 대미지를 계산
      • 현재 캐릭터 레벨에 따른 초기 스탯 적용
    • 커브테이블은 언리얼 에디터를 통해 쉽게 제작 가능
  • 게임플레이 이펙트의 생성 과정
    • 게임플레이 이펙트 컨텍스트와 게임플레이 이펙트 스펙을 통해 생성할 수 있음
    • 게임플레이 이펙트 컨텍스트: GE에서 계산에 필요한 데이터를 담은 객체
      • 가해자 (Instigator)
      • 가해수단 (Causer)
      • 판정 정보 (HitResult) 등등
    • 게임플레이 이펙트 스펙: GE에 관련된 정보를 담고 있는 객체
      • 레벨, 모디파이어 및 각종 태그에 대한 정보
      • 게임플레이 이펙트 컨텍스트 핸들
    • ASC는 각 데이터를 핸들 객체를 통해 간접적으로 관리함
    • 따라서 이펙트 컨텍스트 핸들을 만든 후, 이펙트 스펙 핸들을 생성하는 순서로 진행되어야 함

📌 3-3. 어트리뷰트와 UI 연동

1. 어트리뷰트와 직접 연동하는 캐릭터 UI 시스템의 구현
2. 죽는 상태의 구현과 게임플레이 태그의 수동 설정
3. 일정 기간동안 무적이 되는 이펙트의 구현과 무적 상태일 때의 어트리뷰트 처리
4. 명중할 수록 최대 4단계까지 공격 반경이 늘어나는 중첩 이펙트의 구현

 

  • 이번 강의에서 구현할 신규 기능 기획
    • 현재 체력 퍼센티지를 표시해주는 체력바 UI의 추가
    • 체력이 떨어지면 죽는 기능의 구현
    • 발동 기간동안 들어오는 대미지를 모두 무효화하는 무적 버프의 구현
    • 공격 명중 시 공격 반경이 넓어지는, 최대 4단계까지 중첩되는 버프의 구현
  • 이번 강의에서 진행할 핵심 컴포넌트
    • 어빌리티 시스템 컴포넌트 (ASC): 어빌리티 시스템 컴포넌트
    • 게임플레이 태그 (Tag): 게임플레이 태그, 게임플레이 태그 컨테이너
    • 게임플레이 이펙트 (GE): 게임플레이 이펙트
    • 어트리뷰트 (Attribute): 게임플레이 어트리뷰트 데이터, 어트리뷰트 세트
  • 기간형 게임플레이 이펙트
    • 인스턴트 타입이 아닌 게임플레이 이펙트
      • Duration: 지정한 시간 동안 동작하는 게임플레이 이펙트
      • Infinite: 명시적으로 종료하지 않으면 계속 동작하는 게임플레이 이펙트
    • 인스턴트 타입은 한 프레임에 종료되기 때문에, 상태를 가질 수 없음
    • 기간형 게임플레이 이펙트는 유효 기간동안 태그와 같은 상태를 가질 수 있음
    • 기간형 게임플레이 이펙트는 중첩(Stack)이 가능하도록 설정이 가능함
    • 모디파이어를 설정하지 않아도 다양하게 활용 가능함
    • 인스턴트는 Base 값을 변경하지만 기간형은 Current 값을 변경하고 원래대로 돌려놓음
    • 기간형 게임 이펙트만 잘 활용하면, 다양한 종류의 스킬, 버프 효과를 코딩 없이 구현하는 것이 가능