티스토리 뷰

Health and Mana

이제 AttributeSet에 몇 가지 Attribute를 추가해줄 차례이다.

우선적으로 Public 섹션에 생성자를 선언하고 생성해줄 것이다.

 

그리고 RPG 캐릭터의 기본 속성으로 Health(체력)을 추가할 것이다.

 FGameplayAttributeData을 사용하는데, 이는 GAS에서 Attribute 값을 저장하는 타입이다.

GamplayEffect 계산, Attribute 수정, AbilitySystem 이벤트와 같은 GAS 기능과 연결되어 일반적인 float 값 대신 사용한다.

 

우리는 멀티플레이 게임이기 때문에 Attribute는 Replication 되어야 한다.
하지만 값만 복제되면 클라이언트 코드에서는 Attribute가 언제 변경되었는지 알 수 없다.
이를 해결하기 위해 RepNotify 기능을 사용한다.
RepNotify를 사용하려면 변수에 ReplicatedUsing = 함수이름을 지정하여 복제 시 호출될 함수를 명시한다.
이 단계에서는 해당 함수가 아직 존재하지 않을 수 있으며, 이후 단계에서 실제 RepNotify 함수를 구현한다.

참고 코드 형태 : ReplicatedUsing = OnRep_Health

 

이제 RepNotify에서는 인수를 0으로 받거나 하나 받을 수 있으며, 인수를 받는 경우 Replicated 변수 타입이어야 한다.

우선 RepNotify 함수는 이전 값을 받을 수 있기에 복제되기 전 값을 의미하는 OldHealth를 이름으로 사용할 것이다.

<참고 흐름>
Health = 100 → 70
        ↓
클라이언트로 복제
        ↓
클라이언트 Health = 70
        ↓
OnRep_Health(...) 호출

→ 함수 내부에서는 Health = 70 상태
→ 이전 값은 자동으로 OldHealth로 전달

 

하지만 현 상태에서는 해당 값이 복사될 우려가 있기에 참조를 사용하고, 또 값 수정을 막기 위해 const를 붙여서 읽기만 가능하다는 것을 명시해줄 것이다.

 

함수 내부에서는 GAMEPLAYATTRIBUTE_REPNOTIFY 매크로가 필요하다.

단순 Replication만 하면 ASC에서는 값이 바뀐 것을 모르기 때문에, 이를 GAS에 알리기 위한 역할로 사용된다.

AttributeSet, Attribue, 이전 Attribue 값을 인자로 받는다.

 

언리얼에서는 Replcation 동작을 위해 어떤 변수들을 네트워크로 보낼 것인지 알아야 한다.

이를 위해 Repication 변수 목록을 등록할 함수가 필요하다.

 

그리고 함수 내부에서는 DOREPLIFETIME 매크로를 사용한다.

이 매크로를 통해서 어떤 AS와 Attribute를 추가시켜줄 지 설정할 수 있다.

이외에도 어쩐 조건에서 Replicat 할지, 언제 RepNotift를 호출할 지에 대한 설정도 해당 매크로에서 할 수 있다.

강의에서는 조건 없이 항상 Replication이 되도록 하였다.

 

Attribute Health 값은 블루프린트에서 오직 읽는 값에 해당하기에 이를 명시해주고, 카테고리도 추가해주었다.

 

Health를 생성할 때, 일반적으로 최대 Health 값도 생성하기에 같은 방식으로 생성해주자.

 

그리고 흔히 RPG 게임의 MP로 사용되는 Mana도 같은 방식으로 만들어 줄 것이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함