언리얼엔진/언리얼 C++

GameplayAbilitySystem - Attribute

season97 2024. 10. 30. 11:42

 개인적인 공부를 위해 포스팅 하는 글입니다.


# AbilitySystemComponent

ㆍ 얘는 매니저 클래스 느낌으로 사용하면 된다.

ㆍ 즉 저번 포스팅은 스킬 매니저 오늘은 스탯 매니저를 만든다고 생각하면된다.

 

 

▶ Attribute 

ㆍ 스텟에 관련된걸 관리하는거라 생각하면 된다,  (직역 : 속성, 특성, 특질) 

# 사용하는 이유?

ㆍ 지금은 Character 클래스에서 스텟을 관리해주고 있다.

ㆍ rpg에선 스텟의 종류도 엄청 많겠다.... 또한 아이템으로 인해 스텟도 주기적으로 변하고 버프가 있을수도 있고... 무언가 처리할 코드가 많아진다. 

ㆍ Character클래스에서 다른 기능과 함께 하나로 관리해주는 구조보단, Attribute를 이용해 따로 관리해 주는게 유지보수 측면에서 편리하겠다.

 

#클래스 생성

ㆍ 베이스 클래스의 상속을 받아 만들어주고..

#아래 파생클래스를 만들어 주는 구조로 작성 가능하다.

플레이어의 스텟인가? 적의 스텟인가? NPC인가? 이런식으로 나눠서 설계가 가능

ㆍ 공용적인 스텟 부분은 묶어두고 아래 상속구조로 설계하면 되겠다.

→ 지금은 테스트용 실습 프로젝트라 세부적으로 정의할건 없으니 구조만 짜두고 AttributeSet 클래스에서 관리하자

 


#  AttributeSet 클래스 넓게 보면 이렇다.

 

#하나씩 분석해보자

ㆍ 헤더를 가져오고 매크로를 정의한다. 타고 들어가보면 겟셋,인잇 등 객체지향에 필요한 프로퍼티 코드들이 정의되어있다

ㆍ 게임에서 필요할만한 스텟에 관련된걸 지금 한번 정의해 봤다.

ㆍ FGameplayAttributeData는 그냥 타고들어가서 보면 flaot인걸 볼 수 있다.

ㆍ 접근제어 지시지가 private기 때문에 뒤에 meta =  (AllowPrivateAccess = "true")를 해줬다.

ㆍ 이 키워드 붙혀줘야 BP에서 오류가 안난다.이거싫으면 접근제어지시자 protected로 하자

 

 

ㆍ 매크로들과 만든 스텟을 바인드해주는 부분이다.

ㆍ 전처리기 매크로로 인해 get set 이런거 안만들어도 다 처리가 된다.

 


# 플레이어와 몬스터에 연동하기

 

Character 클래스에서 AttributeSet불러오기

ㆍ Player는 PlayerState에서 스텟을 관리하니 거기서 해주면 되겠고, 몬스터는 바로 하면되겠다.

 

1. 몬스터

 

 

2. PlayerState

→ Player로 연동해야 되니

ㆍ 이렇게 연동하면 된다.

 


# 이제 캐릭터에서 스텟 관리하는 부분을 치워주고 그에 맞는 오류들도 해결해 보자

ㆍ 겟셋 직접 만들지 않아도 돼서 매우 편리하다.

ㆍ 이거 설정 꼐속 지혼자 바뀔때가 있는데,, 이런거 싫으면 Gamemode 클래스에서 코드로 박아두자.