언리얼 엔진5 Advanced - 게임플레이 어빌리티 시스템 시작

타입·2025년 4월 11일
0

언리얼 강의

목록 보기
39/47

분수대 액터의 기획

3초마다 회전과 정지를 무한 반복하면서 동작하는 분수대

회전기능은 RotatingMovement 컴포넌트를 사용

  • 세가지 구현 방법의 비교
    1. 액터에 해당 기능을 구현
    2. 게임플레이 어빌리티 시스템으로 구현
    3. 게임플레이 어빌리티 시스템에 게임플레이 태그를 부여해 구현

게임플레이 어빌리티 시스템의 기본 사용

어빌리티 시스템 컴포넌트 (Ability System Component: ASC)

게임플레이 어빌리티 시스템을 관리하는 핵심 컴포넌트

게임플레이 어빌리티 및 다양한 작업을 처리하는 중앙 처리 장치

액터에 단 하나만 부착할 수 있음

액터는 부착된 ASC를 통해 게임플레이 어빌리티를 발동시킬 수 있음

ASC를 부착한 액터 사이에 GAS 시스템의 상호작용이 가능해짐

게임플레이 어빌리티 (Gameplay Ability: GA)

ASC에 등록되어 발생시킬 수 있는 액션 명령
공격, 마법, 특수 공격 등
간단한 액션 뿐만 아니라 상황에 따른 복잡한 액션 수행 가능

  • GA의 발동 과정
    • ASC에 어빌리티를 등록: ASC의 GiveAbility() 함수에 발동할 GA의 타입을 전달
      발동할 GA 타입 정보를 게임플레이 어빌리티 스펙(GameplayAbilitySpec)이라고 함
    • ASC에게 어빌리티를 발동하라고 명령: ASC의 TryActivateAbility() 함수에 발동할 GA의 타입을 전달
      ASC에 등록된 타입이면 GA의 인스턴스가 생성됨
    • 발동된 GA에는 발동한 액터와 실행 정보가 기록됨
      • SpecHandle: 발동된 어빌리티에 대한 핸들
      • ActorInfo: 어빌리티의 소유자와 아바타 정보
      • ActivationInfo: 발동 방식에 대한 정보
  • GA의 주요 함수
    • CanActivateAbility(): 어빌리티가 발동될 수 있는지 파악
    • ActivateAbility(): 어빌리티가 발동될 때 호출
    • CancelAbility(): 어빌리티가 취소될 때 호출
    • EndAbility(): 스스로 어빌리티를 마무리할 때 호출

GameplayAbility.h

/** Abilities define custom gameplay logic that can be activated by players or external game logic */
UCLASS(Blueprintable)
class GAMEPLAYABILITIES_API UGameplayAbility : public UObject, public IGameplayTaskOwnerInterface
{
	...

	// ----------------------------------------------------------------------------------------------------------------
	//
	//	The important functions:
	//	
	//		CanActivateAbility()	- const function to see if ability is activatable. Callable by UI etc
	//
	//		TryActivateAbility()	- Attempts to activate the ability. Calls CanActivateAbility(). Input events can call this directly.
	//								- Also handles instancing-per-execution logic and replication/prediction calls.
	//		
	//		CallActivateAbility()	- Protected, non virtual function. Does some boilerplate 'pre activate' stuff, then calls ActivateAbility()
	//
	//		ActivateAbility()		- What the abilities *does*. This is what child classes want to override.
	//	
	//		CommitAbility()			- Commits reources/cooldowns etc. ActivateAbility() must call this!
	//		
	//		CancelAbility()			- Interrupts the ability (from an outside source).
	//
	//		EndAbility()			- The ability has ended. This is intended to be called by the ability to end itself.
	//	
	// ----------------------------------------------------------------------------------------------------------------
    
    ...
};

게임플레이 태그의 활용

게임플레이 태그

FName으로 관리되는 경량의 표식 데이터
액터나 컴포넌트에 지정했던 태그와 다른 데이터

프로젝트 설정에서 별도로 게임플레이 태그를 생성하고 관리할 수 있음
결과는 DefaultGameplayTags.ini 파일에 저장됨

계층 구조로 구성되어 있어 체계적인 관리 가능
Actor.Action.Rotate: 행동에 대한 태그
Actor.State.IsRotating: 상태에 대한 태그

게임플레이 태그들의 저장소: GameplayTagContainer

  • 계층 구조를 지원하는 검색 기능 제공
    HasTagExact(): 컨테이너에 A.1 태그가 있는 상황에서 A로 찾으면 false
    HasAny(): 컨테이터에 A.1 태그가 있는 상황에서 A와 B로 찾으면 true
    HasAnyExact(): 컨테이터에 A.1 태그가 있는 상황에서 A와 B로 찾으면 false
    HasAll(): 컨테이터에 A.1 태그와 B.1 태그가 있는 상황에서 A와 B로 찾으면 true
    HasAllExact(): 컨테이터에 A.1 태그와 B.1 태그가 있는 상황에서 A와 B로 찾으면 false

게임플레이 어빌리티 시스템과 독립적으로 사용 가능

게임플레이 어빌리티와 게임플레이 태그

  • 게임플레이 어빌리티에 부착한 태그
    어빌리티에 지정한 태그 (AbilityTags 태그 컨테이너) - 해당 GA를 대표하는 태그가 됨 (태그로 이 어빌리티 발동 가능)

  • 게임플레이 어빌리티에 대해 다양한 실행 조건의 설정
    태그로 어빌리티 취소 - CancelAbilitiesWithTag
    태그로 어빌리티 차단 - BlockAbilitiesWithTag
    어빌리티 실행 시 태그 설정 - ActivationOwnedTags (원하는 태그를 넣으면 해당 어빌리티가 활성화 되는 중에 ASC에 활성화되어 어떤 상태인지 파악 가능)
    태그가 있어야만 어빌리티 실행 - ActivationRequiredTags
    태그가 있으면 어빌리티 실행 차단 - ActivationBlockedTags
    시전자가 태그가 있어야 어빌리티 실행 - SourceRequiredTags
    시전자에 태그가 있으면 어빌리티 차단 - SourceBlockedTags
    시전 대상에 태그가 있어야 어빌리티 실행 - TargetRequiredTags
    시전 대상에 태그가 있으면 어빌리티 차단 - TargetBlockedTags

블루프린트와 조합하여 특정 게임플레이 어빌리티에 대한 의존성을 없애고 게임플레이 태그를 중심으로 게임 로직을 전개 가능

태그를 활용한 프로젝트 결과 정리

  • 게임플레이 태그 추가
    프로젝트 세팅 - GameplayTags - 게임플레이 태그 목록

소스 선택 후 추가할 게임플레이 태그의 이름을 작성하면 완료

"Visual Studio 프로젝트 새로고침"으로 uproject를 통해 "Generate Visual Studio project files"를 하지 않고도 프로젝트 새로고침이 가능했습니다..

실습코드

https://github.com/dnjfs/ArenaBattle_GAS/commit/30b74a86077ae4d7f090b569d2cc882ade3b7f97

  • 액터에 직접 회전 구현
    (익숙한 방법으로 빠르게 구현, 새로운 액터 기능이 추가됨)
    URotatingMovementComponent를 직접 제어

  • 게임플레이 어빌리티로 회전 구현
    (C++만 사용해 모든 기능 구현 가능, 액터로부터 기능 분리)
    ABGA_Rotate 어빌리티 클래스 구현
    어빌리티에 회전을 구현하고 해당 어빌리티를 활성화하여 액터를 제어

  • 게임플레이 태그로 회전 구현
    (의존성 없는 설계가 가능, 어빌리티 교체 가능)
    게임플레이 태그 추가
    StartAbilities로 ABGA_Rotate 세팅
    태그로 어빌리티 실행 제어

profile
주니어 언리얼 프로그래머

0개의 댓글