득이공간

[게임플레이 어빌리티 시스템] 2장. 게임플레이 어빌리티 시스템 캐릭터 제작 기초 본문

GP/UE5

[게임플레이 어빌리티 시스템] 2장. 게임플레이 어빌리티 시스템 캐릭터 제작 기초

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

📌 목차 - 2장. 게임플레이 어빌리티 시스템 캐릭터 제작 기초

2-1. 캐릭터의 입력 처리

2-2. 캐릭터 콤보 공격의 구현

2-3. 공격 판정 시스템의 구현


📌 2-1. 캐릭터의 입력 처리

1. 플레이어 캐릭터의 GAS 설정 방법의 학습
1-1. 오너액터와 아바타액터 개념의 이해
1-2. 플레이어 스테이트에서 ASC를 설정하는 이유를 이해하기
2. 게임플레이 어빌리티 스펙의 이해
3. GAS에 관련된 입력을 범용적으로 처리하는 방식의 학습
4. GA의 다양한 인스턴싱 옵션의 확인
5. GA에서 AT를 사용하는 C++ 프로그래밍 패턴의 학습
6. GAS의 디버깅 방법

 

  • 플레이어 캐릭터의 기획
    • 기존 플레이어 캐릭터(ABCharacterPlayer) 클래스를 상속
    • 입력에 따라 정해진 게임플레이 어빌리티가 발동되도록 설정
    • 점프 GA: 스페이스 바를 누르면 점프 어빌리티가 발동
    • 공격 GA: 마우스 왼쪽 클릭시 공격 어빌리티가 발동
  • 이번 강의에서 다룰 핵심 구성 요소
    • 어빌리티 시스템 컴포넌트 (ASC): 어빌리티 시스템 컴포넌트
    • 게임플레이 태그 (Tag): 게임플레이 태그, 게임플레이 태그 컨테이너
    • 게임플레이 어빌리티 (GA): 게임플레이 어빌리티, 어빌리티 태스크
  • 플레이어 캐릭터의 ASC 설정
    • 분수대 액터와 같이 플레이어 캐릭터에 설정하는 것이 가능
    • 하지만 네트웍 멀티플레이를 감안했을 때, 서버에서 클라이언트로 배포되는 액터가 보다 적합
    • 이 때 많이 사용하는 액터가 주기적으로 플레이어 정보를 배포하는 PlayerState 액터임
    • 따라서 Owner를 PlayerState로 설정하고, Avatar를 Character로 설정하는 것이 일반적인 방법
  • 게임플레이 어빌리티 스펙(Spec)
    • 게임플레이 어빌리티에 대한 정보를 담고 있는 구조체
    • ASC는 직접 어빌리티를 참조하지 않고 스펙 정보만 가지고 있음
    • 스펙은 어빌리티의 현재 상태와 같은 다양한 정보를 가지고 있음
    • ASC로부터 어빌리티를 다루고자 할 경우 스펙에 있는 Handle을 사용해 컨트롤함
    • 핸들 값은 전역으로 설정되어 있으며 스펙 생성시 자동으로 1씩 증가함. 기본값 -1
    • 어빌리티 정보: 스펙
    • 어빌리티 인스턴스에 대한 레퍼런스: 스펙 핸들
  • 어빌리티 시스템 컴포넌트의 입력 처리
    • 게임 어빌리티 스펙에는 입력 값을 설정하는 필드 InputID가 제공됨
    • ASC에 등록된 스펙을 검사해 입력에 매핑된 GA를 찾을 수 있음: FindAbilitySpecFromInputID
    • 사용자 입력이 들어오면 ASC에서 입력에 관련된 GA를 검색함
    • 해당 GA를 발견하면, 현재 발동 중인지를 판별
      • GA가 발동 중이면 입력이 왔다는 신호를 전달: AbilitySpecInputPressed
      • GA가 발동하지 않았으면 새롭게 발동시킴: TryActivateAbility
    • 입력이 떨어지면 동일하게 처리
      • GA에게 입력이 떨어졌다는 신호를 전달: AbilitySpecInputReleased
    • EnhancedInputComponent의 BindAction 함수를 활용하면 범용적인 입력 처리가 가능해짐
  • 게임플레이 어빌리티의 인스턴싱 옵션
    • 상황에 따라 다양한 인스턴스 정책을 지정할 수 있음
    • NonInstanced: 인스턴싱 없이 CDO에서 일괄 처리
    • InstancedPerActor: 액터마다 하나의 어빌리티 인스턴스를 만들어서 처리 (Primary Instance)
    • InstancedPerExecution: 발동시 인스턴스를 생산함
    • 네트웍 리플리케이션까지 고려했을 때 InstancedPerActor가 무난한 선택지임
  • 어빌리티 태스크(AT)의 활용
    • 게임플레이 어빌리티(GA)의 실행(Activation)은 한 프레임에서 이루어짐
    • 게임플레이 어빌리티(GA)가 시작되면 EndAbility 함수가 호출되기까지는 끝나지 않음
    • 애니메이션 재생 같이 시간이 소요되고 상태를 관리해야 하는 어빌리티의 구현 방법
      • 비동기적으로 작업을 수행하고 끝나면 결과를 통보받는 형태로 구현
      • 이를 위해 GAS는 어빌리티 태스크를 제공하고 있음
    • 어빌리티 태스크(AT)의 활용 패턴
      1. 어빌리티 태스크에 작업이 끝나면 브로드캐스팅되는 종료 델리게이트를 선언함
      2. GA는 AT를 생성한 후 바로 종료 델리게이트를 구독함
      3. GA의 구독 설정이 완료되면 AT를 구동: AT의 ReadyForActivation 함수 호출
      4. AT의 작업이 끝나면 델리게이트를 구독한 GA의 콜백 함수가 호출됨
      5. GA의 콜백함수가 호출되면 GA의 EndAbility 함수를 호출해 GA를 종료
    • GA는 필요에 따라 다수의 AT를 사용해 복잡한 액션 로직을 설계할 수 있음
  • GA의 블루프린트 상속 및 게임플레이 태그 설정
    • 꼭 필요한 상황이 아니라면 GA와 AT는 가급적 자기 역할만 충실하게 구현하는 것이 좋음
    • 게임플레이 태그를 C++에서 설정하는 경우 기획 변경때마다 소스코드 컴파일을 수행해야 함
    • 게임플레이 태그 설정은 블루프린트에서 설정하는 것이 의존성 분리에 도움이 됨
    • 게임플레이 태그 설정 기획
    • 점프 GA의 ActivationOwnedTags에 Character.State.IsJumping 게임플레이 태그 설정
    • 공격 GA의 ActivationOwnedTags에 Character.State.IsAttacking 게임플레이 태그 설정
    • GAS 디버깅을 사용해 현재 상황의 확인 가능

📌 2-2. 캐릭터 콤보 공격의 구현

1. GA에서 콤보 공격을 구현
2. 상태를 가지는 점프 GA의 제작
3. 점프 GA를 위한 새로운 AT의 생성
4. GA와 AT 사이의 통신 메커니즘 이해하기
5. 블루프린트에서 AT를 사용하기 위한 매크로 설정

 

  • 캐릭터 콤보 공격 구현을 위한 기획
    • 공격 시작 후 유효 시간 내에 추가 공격 입력을 넣으면, 다음 공격 모션을 발동한다.
    • 콤보 공격에 대한 정보는 ABComboActionData에서 불러들임
    • AT를 발동하고 입력 점검 타이머도 함께 발동
    • 입력 점검 타이머가 발동되면 다음 공격 입력이 있는지 검사함
    • 다음 공격 입력이 있으면 다음 공격 모션을 발동하고 다시 입력 점검 타이머를 발동
  • 이번 강의에서 다룰 핵심 구성 요소
    • 어빌리티 시스템 컴포넌트 (ASC): 어빌리티 시스템 컴포넌트
    • 게임플레이 태그 (Tag): 게임플레이 태그, 게임플레이 태그 컨테이너
    • 게임플레이 어빌리티 (GA): 게임플레이 어빌리티, 어빌리티 태스크
  • 어빌리티 태스크(AT)의 제작 규칙
    • AT는 UAbility Task 클래스를 상속받아 제작한다.
    • AT 인스턴스를 생성해 반환하는 static 함수를 선언해 구현한다.
    • AT가 종료되면 GA에 알려줄 델리게이트를 선언한다.
    • 시작과 종료 처리를 위해 Activate와 OnDestroy 함수를 재정의(Override)해 구현한다.
    • 일정 시간이 지난 후 AT를 종료하고자 한다면, 활성화시 SetWaitingOnAvatar 함수를 호출해 Waiting 상태로 설정한다.
    • 만일 Tick을 활성화하고 싶다면 bTickingTask 값을 true로 설정한다.
    • AT가 종료되면 델리게이트를 브로드캐스팅한다.
  • 블루프린트에서 호출을 위한 제작 규칙
    • static 함수에 UFUNCTION(BlueprintCallable)을 지정한다.
    • 콜백을 위한 델리게이트는 Dynamic Delegate로 선언한다.
    • AT의 델리게이트에 UPROPERTY(BlueprintAssignable)을 지정한다.

📌 2-3. 공격 판정 시스템의 구현

1. 게임플레이 이벤트를 활용한 GA의 발동 구현
2. 물리 판정 작업을 위한 AT의 작업
3. 물리 공격 판정 및 결과를 반환하는 TA의 구현
4. AT와 TA 사이의 실행 흐름 이해하기

 

  • 공격 판정을 위한 신규 기능 기획
    • 애니메이션 몽타주의 노티파이를 활용해 원하는 타이밍에 공격을 판정하는 기능 추가
    • 애니메이션 노티파이가 발동되면 판정을 위한 GA를 트리거해 발동
    • 새로운 GA가 발동되면 공격 판정을 위한 AT를 실행
    • GAS에서 제공하는 타깃액터를 활용해 물리 공격 판정을 수행
    • 판정 결과를 시각적으로 확인할 수 있도록 드로우 디버그 기능 제공
  • 이번 강의에서 다룰 핵심 구성 요소
    • 어빌리티 시스템 컴포넌트 (ASC): 어빌리티 시스템 컴포넌트
    • 게임플레이 태그 (Tag): 게임플레이 태그, 게임플레이 태그 컨테이너
    • 게임플레이 어빌리티 (GA): 게임플레이 어빌리티, 어빌리티 태스크, 게임플레이 이벤트
  • 게임플레이 어빌리티 타깃 액터
    • 게임플레이 어빌리티에서 대상에 대한 판정(주로 물리 판정)을 구현할 때 사용하는 특수한 액터
    • 줄여서 TA라고 함
    • AGameplayAbilityTargetActor 클래스를 상속받아서 구현
    • 왜 타깃 액터(TA)가 필요한가?
      • 타깃을 설정하는 다양한 방법이 있음
      • Trace를 사용해 즉각적으로 타깃을 검출하는 방법
      • 사용자의 최종 확인을 한번 더 거치는 방법이 있음 (ex. 원거리 범위 공격)
      • 공격 범위 확인을 위한 추가 시각화 (시각화를 수행하는 액터를 월드레티클(WorldReticle)이라고 함)
    • 주요 함수
      • StartTargeting: 타깃팅 시작
      • ConfirmTargetingAndContinue: 타깃팅을 확정하고 이후 남은 프로세스를 진행
      • ConfirmTargeting: 태스크 진행 없이 타깃팅만 확정
      • CancelTargeting: 타깃팅을 취소
  • 게임플레이 어빌리티 타깃 데이터
    • 타깃 액터에서 판정한 결과를 담은 데이터
    • 다음의 속성을 가지고 있음
      • Trace 히트 결과 (HitResult)
      • 판정된 다수의 액터 포인터
      • 시작 지점
      • 끝 지점
    • 타깃 데이터를 여러 개 묶어 전송하는 것이 일반적인데 이를 타깃 데이터 핸들이라고 함