[언리얼 C++] Achievements 인터페이스(온라인 서브시스템)
Achievements는 플레이어에게 도전 과제, 동기 부여, 보상을 제공하여 게임에서 제공하는 내용을 보다 많이 경험할 수 있도록 이끌어 주는 수단으로, 게임을 다시 플레이하는 가치를 높이거나 플레이어와 친구들 사이 경쟁을 지원할 수도 있습니다. 다수의 온라인 서비스에서 Achievements에 보상을 주는 기능을 제공하며, 온라인 서브시스템에서는 Achievements 인터페이스를 통해 지원하고 있습니다.
온라인 서브시스템은 Achievements 시스템 사용을 위한 게임 내 함수 기능을 제공하지만, Achievements 자체를 생성, 삭제, 어떤식으로든 수정하는데 관련된 기능을 처리하지는 않습니다. 각 온라인 서비스에서 별도의 백엔드 시스템을 통해 Achievements 관리를 지원하고 있습니다.
1. Achievements 데이터 구하기
Achievements 데이터에는 특정 사용자가 해제한 Achievements를 나타내는 플레이어 전용 데이터, 그리고 Achievements의 이름과 그 아이콘을 나타내는 일반 데이터 모두 포함됩니다.
- Achievements 데이터 검색
Achievements 데이터는 온라인 서비스로의 비동기 호출을 통한 요청시 사용할 수 있습니다.
이 데이터는 두 부분으로 나뉘는데, 한 부분은 Achievements의 ID와 특정 플레이어의 진행률, 나머지는 Achievements에 대한 설명, 즉 Achievements 자체에 대한 설명으로 모든 플레이어에게 공통인 부분입니다.
가능한 Achievements 목록을 검색하려면 QueryAchievements() 함수를 플레이어의 FUniqueNetId를 넘겨 호출합니다.
(FOnQueryAchievementsCompleteDelegate 유형) 델리게이트가 호출되고 결과가 성공한 경우, Achievements의 ID와 해당 플레이어의 진행률이 캐시에 저장됩니다.
- Achievements 데이터 검사
데이터를 캐시에 저장한 이후, 몇가지 함수 호출로 데이터를 검사할 수 있습니다.
GetCachedAchievements() 함수를 사용하여 알려진 모든 Achievements ID가 들어있는 배열을 얻을 수 있습니다.
그런 다음 이 ID를 사용하여 GetCachedAchievement() 함수에다 특정 플레이어의 FUniqueNetId를 넘겨 호출하면 해당 Achievements의 진행률을 확인할 수 있습니다.
또한, ID를 GetCachedAchievementDescription() 함수의 파라미터로 넘겨 호출하면, Achievements 설명이 반환됩니다.
2. Achievements 데이터 설정
특정 사용자에 대한 Achievements을 일부 또는 전부 해제할 수 있습니다. 예를 들어 게임을 완료한 플레이어는 "게임 승리" Achievements를 받을 수도 있고, 어떤 특수 기술을 사용한 플레이어는 "이 기술을 1000번 사용" Achievements를 받을 수도 있습니다.
하지만 Achievements 기능에 대한 테스트를 할때, 한번 Achievements를 얻으면 다시는 똑같은 Achievements를 얻을 수 없기 때문에 플레이어의 Achievements를 지우는 기능이 필요합니다.
그래서 테스트 도중 대부분의 온라인 서비스는 테스터가 게임을 새로 테스트할때마다 계정을 매번 새로 만들지 않아도 되도록 게임에 대한 플레이어의 Achievements 리셋 기능을 지원합니다.
- Achievements 데이터 작성
WriteAchievements() 함수는 한번에 최대 5개의 Achievements 업데이트를 받아 온라인 서비스에 전송한 뒤, 완료시 제공된 (FOnAchievementsWrittenDelegate 유형) 델리게이트를 호출합니다. 각 업데이트는 단일 FOnlineAchievementsWrite가 들어있는 레퍼런스 유형으로, FOnlineStats 오브젝트를 감싸는 역할을 합니다. Properties 칸을 통해 전송된 키-값 짝에는 Achievements ID를 나타내는 키와 0.0에서 100.0퍼센트까지 진행률을 나타내는 double 값이 포함됩니다. 대부분의 온라인 서비스는 플레이어의 Achievements 진행률에 이미 기록된 값 이하로 변경 시도하면 거부하므로, 업데이트 전송 전 현재 플레이어의 진행률을 확인하시기 바랍니다.
- Achievements 데이터 리셋
개발 및 테스트 도중 ResetAchievements() 함수는 현재 타이틀에 대한 제공된 플레이어의 Achievements을 모두 리셋합니다. 온라인 서비스마다 정책이 다르긴 하지만, 이 함수는 테스팅 환경 이외에는 작동하지 않아야 합니다.
#if !UE_BUILD_SHIPPING
// ResetAchievements() 함수 호출
#endif
Shipping 빌드에는 존재하지 않는 함수이므로 해당 함수를 호출하는 코드를 제거하거나, 위와 같이 컴파일 시간에 해당 코드를 제거하는 로직을 사용하시기 바랍니다.