StateComponent 전체 코드
.cpp
AbilityComponent 전체 코드
.h
State & Ability Object 전체 코드
.h https://github.com/LCU97/Cat/tree/main/Source/HumanAndCat/Public/Objects
.cpp https://github.com/LCU97/Cat/tree/main/Source/HumanAndCat/Private/Objects
경험과 결과
주요 클래스 및 함수 설명
1. 경험과 결과
마켓 플레이스에서 CombatFramework 기능 에셋을 보며 만들었다.
에셋을 보면서 다른 사람이 만들어둔 코드를 보며 공부하는게 어려웠던 기억이 있다.
그만큼 처음 보는 함수와 패턴, 언리얼 엔진 사용 방식을 보고 배운것도 많았고 이후에 다른 사람 코드를 볼 때 훨씬 더 쉽게 이해 할 수 있었다. 실제로 팀원들이 만든 몬스터나 인벤토리 클래스들을 봤을 때 훨씬 쉽게 구조 파악이 가능했고 원하는 기능을 추가/변경 할 수 있었다.
PlayerCharacter 를 구현 할 때에도 에셋을 뜯어보고 이해한 상태에서 만들었던터라 프로젝트(게임)에 더 어울리는 기능들을 추가 할 수 있었다.
(실제로는 CombatFramwork 에셋의 State & Ability 와 Targeting 을 사용하였다.)
예 1) Weapon & WeaponComponet 의 변경 및 삭제
예 2) 에셋의 기존 InputSystem 삭제 및 새로운 InputSystem 추가
상태 패턴을 활용한 Player 제작에 성공했고 에셋과는 다르게 구현된 여러 기능들이 생각대로 정상 작동하여 좋은 결과와 배움이 많은 경험이었다.
2. 주요 클래스 및 함수 설명
기존 에셋과 최종 변경 점
1. 입력 시스템 변경
2. 무기 클래스 변경 및 WeaponComponent 추가
3. 상태 변경 제어를 위한 변수 및 함수 추가
동작 방식 :
1.입력이 들어오면 StateComponent 에서 해당 입력에 따른 State 변경 시도
2. State 변경하며 AbilityComponent 가 사용 할 Ability 를 선택 및 실행 시도
3. Ability 실행
State & Ability
StateManagerComponent : State 객체들을 관리하고 State의 변경을 제어하는 컴포넌트
StateObject : 실제 캐릭터의 State 객체
AbilityManagerComponent : Ability 객체들을 관리하고 Ability의 변경을 제어하는 컴포넌트
AbilityObject : State 별로 사용가능 기능을 담는 객체. 실제 몽타주를 가짐.
예) AttackState 가 NormalAttackAbility 와 SpecialAttackAbility 를 사용 가능하다.
1) Character 클래스에 AbilityManagerComponent 를 붙이고
PlayerController 클래스에 StateManagerComponent 를 붙인 이유.
기본적으로 입력을 PlayerController 에서 받도록 만들어 두었다. 이 프로젝트는 유저가 사용하는 캐릭터 2개 있는데 하나는 사람이고 다른 하나는 고양이 이다.
Possess 스위칭을 할 때 InputMappingContext 만 바꿔주면서 Controller 에서 사람이든 고양이든 각자의 입력 처리에 맞게 State 가 변경 될 수 있도록 하기 위해 StateManagerComponent 를 Controller 에 붙였다.
(실제로는 고양이까지 Controller에서 입력처리를 하지는 않았는데 추후 고양이를 만든 팀원과의 회의에서 고양이에게 여러가지 기능을 넣는데 시간적 한계를 느껴 기본 움직임만 구현하게 되었으니 고양이 Class 에서 입력 처리를 끝내자는 의견이 나와 수용했다.)
2) StateManagerComponent & StateObject 의 주요 함수 설명
bool UBaseStateManagerComponent::TryChangeStateOfTag : GameplayTag 매개변수로 특정 State 를 선택해 해당 State 로 상태 변경이 가능한지 확인하고 상태를 변경
void UBaseStateManagerComponent::ConstructStateOfClass 매개변수 TSubclassOf<UBaseStateObject> CreateState 로 StateObject 를 생성하고 초기화
BaseStateObject* UBaseStateManagerComponent::GetStateOfGameplayTag 현재 활성화 되어있는 State 들 중 매개변수 Tag 를 포함하는 StateObject 를 반환
bool UBaseStateObject::CanPerformState 변경될 상태로서 해당 상태로 변경이 가능한지 체크
bool UBaseStateObject::CheckAbilityExecute 사용 할 Ability를 설정
void UBaseStateObject::StartState 해당 State를 시작하고 CurrentState가 자신임을 알림
3) AbilityManagerComponent & StateObject 의 주요 함수 설명
bool UBaseAbilityManagerComponent::TryPerformAbilityOfClass 매개변수
TSubclassOf<UBaseAbilityObject> AbilityObj 를 실행 할 수 있는지 확인하고 실행
void UBaseAbilityManagerComponent::ContructAbilityOfClass 매개변수 TSubclassOf<UBaseAbilityObject>
를 생성하고 초기화
UBaseAbilityObject* UBaseAbilityManagerComponent::GetAbilityOfGameplayTag 현재 활성화 되어있는 Ability들 중 매개변수 Tag 를 포함하는 AbilityObject 를 반환
float UBaseAbilityObject::PlayAbilityMontage 해당 Ability 가 사용 가능한 AnimationMotage 를 실행하고 활성화된 Motage 를 저장
TArray<UAnimMontage*> UBaseAbilityObject::GetAnimMontages WeaponComponent 로 부터 사용 가능한 AnimationMontage 들을 가져옴
bool UBaseAbilityObject::CanActivateAbility 해당 Ability 가 실행 될 수 있는지 확인
void UBaseAbilityObject::StartAbility 해당 Ability 를 시작하고 CurrentAbility 가 자신임을 알림
4) GameplayTag 를 활용한 State & Ability 확인
GameplayTag 를 따로 정의해두었기 때문에 모든 클래스에서 State & Ability 확인을 GameplayTag 로 가능하다.
계층적으로 관리되는 GameplayTag 를 사용해 관리 및 매개변수로 넣을 때에도 편리하게 넣을 수 있다.
'프로젝트 > H.W.H' 카테고리의 다른 글
SkillActor & Weapon (0) | 2024.10.17 |
---|---|
Weapon & WeaponComponent (0) | 2024.10.17 |
Targeting & Camera (2) | 2024.10.16 |
InputSystem 을 활용한 다양한 행동 처리 (0) | 2024.10.16 |