본문 바로가기

공부/이득우의 언리얼 프로그래밍

[Study] Part 4 - 캐릭터의 입력 처리 (3/10)

728x90
반응형

 

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

 

  • 플레이어 캐릭터의 기획
    • 기존 플레이어 캐릭터(ABCharacterPlayer) 클래스를 상속
    • 입력에 따라 정해진 게임플레이 어빌리티가 발동되도록 설정
    • 점프 GA : 스페이스 바를 누르면 점프 어빌리티가 발동
    • 공격 GA : 마우스 왼쪽 클릭시 공격 어빌리티가 발동

 

게임플레이 어빌리티 시스템의 기본 흐름

 

  • 플레이어 캐릭터의 ASC 설정
    • 분수대 액터와 같이 플레이어 캐릭터에 설정하는 것이 가능
    • 하지만 네트웍 멀티플레이를 감안했을 때, 서버에서 클라이언트로 배포되는 액터가 보다 적합
    • 이 때 많이 사용하는 액터가 주기적으로 플레이어 정보를 배포하는 PlayerState 액터임
    • 따라서 OwnerPlayerState로 설정하고, AvatarCharacter로 설정하는 것이 일반적인 방법

 

플레이어 캐릭터의 ASC 설정

 

  • 게임플레이 어빌리티 스펙(Spec)
    • 게임플레이 어빌리티에 대한 정보를 담고 있는 구조체
    • ASC는 직접 어빌리티를 참조하지 않고 스펙 정보만 가지고 있음
    • 스펙은 어빌리티의 현재 상태와 같은 다양한 정보를 가지고 있음
    • ASC로부터 어빌리티를 다루고자 할 경우 스펙에 있는 Handle을 사용해 컨트롤함
    • 핸들 값은 전역으로 설정되어 있으며 스펙 생성시 자동으로 1씩 증가함. 기본값 -1
    • 어빌리티 정보 : 스펙
    • 어빌리티 인스턴스에 대한 레퍼런스 : 스펙 핸들

 

  • GAS어빌리티 시스템 컴포넌트인 ASC가 직접 게임플레이 어빌리티를 관리하지않고, 어빌리티 스펙이라고 하는 중간 매개체를 통해서 관리하도록 설계가 되어 있다.
  • 어빌리티의 정보라던지 현재의 상태는 모두 이 스펙 데이터를 통해 실시간으로 확인할 수 있다.

 

게임플레이 어빌리티 스펙(Spec)

 

  • 어빌리티 시스템 컴포넌트의 입력 처리
    • 게임 어빌리티 스펙에는 입력 값을 설정하는 필드 InputID가 제공됨
    • ASC에 등록된 스펙을 검사해 입력에 매핑된 GA를 찾을 수 있음 : FindAbilitySpecFromInputID
    • 사용자 입력이 들어오면 ASC에서 입력에 관련된 GA를 검색함
    • 해당 GA를 발견하면, 현재 발동 중인지를 판별
      • GA가 발동 중이면 입력이 왔다는 신호를 전달 : AbilitySpecInputPressed
      • GA가 발동하지 않았으면 새롭게 발동시킴 : TryActivateAbility
    • 입력이 떨어지면 동일하게 처리
      • GA에게 입력이 떨어졌다는 신호를 전달 : AbilitySpecInputReleased
  • EnhancedInputComponent의 BindAction함수를 활용하면 범용적인 입력 처리가 가능해짐
  • 게임플레이 어빌리티의 인스턴싱 옵션
    • 상황에 따라 다양한 인스턴스 정책을 지정할 수 있음
    • NonInstanced : 인스턴싱 없이 CDO에서 일괄 처리
      • 굉장히 기본적인 기능을 지정하는데 사용. 가장 가벼움. 어떤 상태를 지정하기에는 쓰기 어려움
    • InstancedPerActor : 액터마다 하나의 어빌리티 인스턴스를 만들어 처리. (Primary Instance - 가장 처음에 만들어진 인스턴스)
      • 가장 무난한 선택
      • 네트웍 리플리케이션까지 고려했을 때 InstancedPerActor가 무난한 선택
    • InstancedPerExecution : 발동시 인스턴스를 생산함
  • 어빌리티 태스크(AT)의 활용
    • 어빌리티 태스크는 줄여서 AT라고 함
    • 게임플레이 어빌리티(GA)의 실행(Activation)은 한 프레임에서 이루어짐
    • 게임플레이 어빌리티(GA)가 시작되면 EndAbility함수가 호출되기까지는 끝나지 않음
    • 애니메이션 재생 같이 시간이 소요되고 상태를 관리해야 하는 어빌리티의 구현 방법
      • 비동기적으로 작업을 수행하고 끝나면 결과를 통보받는 형태로 구현
      • 이를 위해 GAS는 어빌리티 태스크를 제공하고 있음
    • 어빌리티 태스크(AT)의 활용 패턴
      1. 어빌리티 태스크에 작업이 끝나면 브로드캐스팅되는 종료 델리게이트를 선언
      2. GA는 AT를 생성한 후 바로 종료 델리게이트를 구독
      3. GA의 구독 설정이 완료되면 AT를 구동 : AT의 ReadyForActivation 함수 호출
      4. AT의 작업이 끝나면 델리게이트를 구독한 GA의 콜백 함수가 호출
      5. GA의 콜백함수가 호출되면 GA의 EndAbiltiy 함수를 호출해 GA를 종료
    • GA는 필요에 따라 다수의 AT를 사용해 복잡한 액션 로직을 설계할 수 있음

 

~ showdebug abilitysystem

  • 해당 명령어를 통해 현재 GAS 프레임워크의 상태를 실시간으로 보여주는 디버그 창이 활성화 된다.

 

  • GA의 블루프린트 상속 및 게임플레이 태그 설정
    • 꼭 필요한 상황이 아니라면 GAAT는 가급적 자기 역할만 충실하게 구현하는 것이 좋음
    • 게임플레이 태그를 C++에서 설정하는 경우 기획 변경때마다 소스코드 컴파일을 수행해야 함
    • 게임플레이 태그 설정은 블루프린트에서 설정하는 것이 의존성 분리에 도움이 됨
    • 게임플레이 태그 설정 기획
    • 점프 GA의 ActivationOwnedTags에 Character.State.IsJumping 게임플레이 태그 설정
    • 공격 GA의 ActivationOwnedTags에 Character.State.IsAttacking 게임플레이 태그 설정

 

  • GAS 디버깅을 사용해 현재 상황의 확인 가능
728x90