728x90
반응형
- 정리
- 캐릭터의 입력 처리
- 플레이어 캐릭터의 GAS 설정 방법의 학습
- 오너액터와 아바타액터 개념의 이해
- 플레이어 스테이트에서 ASC를 설정하는 이유를 이해하기
- 게임플레이 어빌리티 스펙의 이해
- GAS에 관련된 입력을 범용적으로 처리하는 방식의 학습
- GA의 다양한 인스턴싱 옵션의 확인
- GA에서 AT를 사용하는 C++ 프로그래밍 패턴의 학습
- GAS의 디버깅 방법
- 플레이어 캐릭터의 GAS 설정 방법의 학습
- 캐릭터의 입력 처리
- 플레이어 캐릭터의 기획
- 기존 플레이어 캐릭터(ABCharacterPlayer) 클래스를 상속
- 입력에 따라 정해진 게임플레이 어빌리티가 발동되도록 설정
- 점프 GA : 스페이스 바를 누르면 점프 어빌리티가 발동
- 공격 GA : 마우스 왼쪽 클릭시 공격 어빌리티가 발동
- 플레이어 캐릭터의 ASC 설정
- 분수대 액터와 같이 플레이어 캐릭터에 설정하는 것이 가능
- 하지만 네트웍 멀티플레이를 감안했을 때, 서버에서 클라이언트로 배포되는 액터가 보다 적합
- 이 때 많이 사용하는 액터가 주기적으로 플레이어 정보를 배포하는 PlayerState 액터임
- 따라서 Owner를 PlayerState로 설정하고, Avatar를 Character로 설정하는 것이 일반적인 방법
- 게임플레이 어빌리티 스펙(Spec)
- 게임플레이 어빌리티에 대한 정보를 담고 있는 구조체
- ASC는 직접 어빌리티를 참조하지 않고 스펙 정보만 가지고 있음
- 스펙은 어빌리티의 현재 상태와 같은 다양한 정보를 가지고 있음
- ASC로부터 어빌리티를 다루고자 할 경우 스펙에 있는 Handle을 사용해 컨트롤함
- 핸들 값은 전역으로 설정되어 있으며 스펙 생성시 자동으로 1씩 증가함. 기본값 -1
- 어빌리티 정보 : 스펙
- 어빌리티 인스턴스에 대한 레퍼런스 : 스펙 핸들
- GAS는 어빌리티 시스템 컴포넌트인 ASC가 직접 게임플레이 어빌리티를 관리하지않고, 어빌리티 스펙이라고 하는 중간 매개체를 통해서 관리하도록 설계가 되어 있다.
- 어빌리티의 정보라던지 현재의 상태는 모두 이 스펙 데이터를 통해 실시간으로 확인할 수 있다.
- 어빌리티 시스템 컴포넌트의 입력 처리
- 게임 어빌리티 스펙에는 입력 값을 설정하는 필드 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)의 활용 패턴
- 어빌리티 태스크에 작업이 끝나면 브로드캐스팅되는 종료 델리게이트를 선언함
- GA는 AT를 생성한 후 바로 종료 델리게이트를 구독함
- GA의 구독 설정이 완료되면 AT를 구동 : AT의 ReadyForActivation 함수 호출
- AT의 작업이 끝나면 델리게이트를 구독한 GA의 콜백 함수가 호출됨
- GA의 콜백함수가 호출되면 GA의 EndAbiltiy 함수를 호출해 GA를 종료
- GA는 필요에 따라 다수의 AT를 사용해 복잡한 액션 로직을 설계할 수 있음
- 해당 명령어를 통해 현재 GAS 프레임워크의 상태를 실시간으로 보여주는 디버그 창이 활성화 된다.
- GA의 블루프린트 상속 및 게임플레이 태그 설정
- 꼭 필요한 상황이 아니라면 GA와 AT는 가급적 자기 역할만 충실하게 구현하는 것이 좋음
- 게임플레이 태그를 C++에서 설정하는 경우 기획 변경때마다 소스코드 컴파일을 수행해야 함
- 게임플레이 태그 설정은 블루프린트에서 설정하는 것이 의존성 분리에 도움이 됨
- 게임플레이 태그 설정 기획
- 점프 GA의 ActivationOwnedTags에 Character.State.IsJumping 게임플레이 태그 설정
- 공격 GA의 ActivationOwnedTags에 Character.State.IsAttacking 게임플레이 태그 설정
- GAS 디버깅을 사용해 현재 상황의 확인 가능
728x90
'공부 > 이득우의 언리얼 프로그래밍' 카테고리의 다른 글
[Study] Part 4 - 게임플레이 어빌리티 시스템의 시작 (2/10) (0) | 2024.11.12 |
---|---|
[Study] Part 4 - 언리얼 게임플레이 어빌리티 시스템 개요 (1/10) (1) | 2024.11.11 |
[Study] Part 3 - 게임의 완성 (15/15) (3) | 2024.11.10 |
[Study] Part 3 - 게임플로우 다듬기 (14/15) (0) | 2024.11.09 |
[Study] Part 3 - 캐릭터 무브먼트의 확장 (13/15) (2) | 2024.09.10 |