티스토리 뷰
Attributes
지금까지 우리는 ASC(Ability System Component)와 AS(Attribute Set)을 추가하고 설정했다.
또한 ASC 초기화 시 OwnerActor와 AvatarActor를 설정하여 ASC가 누가 소유자인지 알 수 있도록 설정했다.
이제 Attributes와 관련하여 좀 더 자세히 알아볼 것이다.
AttributeSet에 Ability System Component 등록
AttributeSet은 OwnerActor의 생성자에서 Ability System Component 와 함께 생성하면 자동으로 Ability System Component 에 등록된다.
Ability System Component는 해당 Ability와 등록된 다른 모든 Attribute Set에 접근할 수 있다.
여러 개의 AttributeSet
원한다면 여러 개의 AttributeSet을 만들 수 있다.
예를 들어 아래와 같이 카테고리별로 속성을 분리할 수도 있다.
Health 관련 AttributeSet
Combat 관련 AttributeSet
Mana 관련 AttributeSet
하지만 아래와 같이 동일한 AttributeSet 클래스 타입을 두 개 이상 사용할 수 없다.
HealthAttributeSet
HealthAttributeSet
이유는 ASC가 AttributeSet을 검색할 때, 어떤 것을 가져와야 하는지 모호해지기 때문이다.
모든 Attribute를 하나의 AttributSet에 설정
반면에 모든 Attribute를 하나의 AttributeSet에 포함하는 것은 확실하게 허용된다.
Attribute 간 계산이 필요한 경우, AttributeSet이 다른 Attribute의 값을 참조할 때 작업이 단순해지는 장점이 존재한다.
또한 Attribute는 메모리를 거의 차지하지 않으므로, 원하는 경우 프로젝트의 모든 클래스에서 단일 AttrubuteSet을 공유하고 게임 프로젝트의 특정 클래스에서 필요한 Attribute만 사용하는 방식도 가능하다.
Attribute란 무엇인가?
Attribute는 게임 내 특정 엔티티와 관련된 수치 데이터이다.
<예시>
Health
Mana
Strength
Defense
또한 모든 Attribute는 float의 값을 가진다.
그리고 내부적으로 FGamplayAttributeData 구조체 안에 존재한다.
이러한 Attribute는 AtrributeSet에 저장되며, AttributeSet은 이를 면밀히 관리한다.
Attribute 값 변경 방법
Attribute 값은 코드에서 직접 변경할 수 있지만, GamplayEffect를 사용하여 변경하는 것이 가장 좋다.
GameplayEffect를 사용하는 주된 이유는 Attribute의 변화를 예측(Prediction)할 수 있기 때문이다.
예측 (Prediction)
예측(Prediction)은 클라이언트가 서버의 응답을 기다리지 않고 먼저 값을 변경하여 즉시 반응하도록 하고, 이후 서버가 해당 변경을 검증하는 기능이다.
멀티플레이에서 더 원활한 경험을 제공하는 요소이기도 하다.
먼저 예측을 사용하지 않는 상태에서 클라이언트 값 변경이 발생하는 방식은 다음과 같다.
클라이언트 요청
↓
서버 검증
↓
값 변경
↓
클라이언트 반영
이러한 방식은 네트워크 지연이 발생한다.
보통 100m 이상의 지연이 발생할 수 있으며, 이로인해 플레이어가 행동한 후 효과가 늦게 나타나는 문제가 발생한다.
예측을 사용한 방식은 다음과 같다.
클라이언트 즉시 값 변경 (지연 X)
↓
서버로 변경 요청 전송
↓
서버 검증
서버 검증 결과에 따라서는 다음과 같이 나뉠 수 있다.
정상 -> 변경 유지, 다른 클라이언트에게 전파
비정상 -> 서버가 변경 거부, 값 롤백
따라서 서버는 여전히 권한을 가지지만, 클라이언트는 지연을 겪을 필요가 없다.
이러한 예측은 직접 구현하려면 매우 복잡하지만, GAS에서는 예측 기능이 기본 내장되어 있기에 지연 보정 구현에 신경쓰지 않고 게임플레이 로직 구현에 집중할 수 있다.
Attribute의 내부 구조
Attribute는 BasValue와 CurrentValue 두 가지 값을 가진다.
BaseValue는 속성의 영구 값이며, CurrentValue는 BaseValue + GamplayEffect를 통해 수정된 값이다.
버프와 디버프 같은 특정 기간 동안 값을 더하구나 뺴는 효과가 있을 수 있으며, 해당 시간이 지나면 수정이 취소되고 BaseValue로 돌아간다.
Attribute의 흔한 실수
예를 들어 체력 백분율을 계산할 때 BaseValue를 최대값이라고 생각하여 CurrentHealth / BaseHealth와 같이 체력 퍼센트를 계산하려 할 수 있지만 이는 일반적인 실수이며, 틀린 방식이다.
Attribute의 최대 값은 Attribute 자체와 별개이며, Attribute의 최대 값은 별도의 Attribue를 사용해야 한다.
Health
MaxHealth
Health / MaxHealth
이렇게 하면 Attribute 자체에 GamePlayEffect를 적용하거나 최대 Attribue에 별도로 적용할 수 있다.
예시로 체력 표시줄의 백분율을 단순히 체력을 최대 체력으로 나눈 비율로 설정할 수 있다.
'Unity > 게임 개발' 카테고리의 다른 글
| 게임 개발 - Bickering Trip (0) | 2024.07.12 |
|---|
