주의 사항:Photon TrueSync와 Thunder는 서비스 종료되었으며 앞으로도 업데이트 및 릴리즈는 없을 예정입니다. 기존 어플리케이션에 영향은 없습니다만 현재 개발중인 어플리케이션에 대해서는 마이그레이션을 장려합니다.

TrueSync 튜토리얼 파트 4

튜토리얼 내용

이 튜토리얼 시리즈에서는 Photon TrueSync를 이용하여 Unity로 간단한 멀티플레이어 게임을 만드는 방법에 대해서 설명합니다. 파트 1,2와 3에서는 기본 설정, Photon 연결 코드 및 다른 게임 클라이언트 간 움직임이 결정론적인 물리기반의 플레이어-제어 게임 오브젝트 생성과 결정론적 인스턴스 생성과 게임 오브젝트를 파괴하는 방법을 학습하였습니다.

파트 4에서 학습할 내용:

플레이어가 제어하는 상자가 더 빨리 응답하는 동작중인 낮은-레이턴시 멀티플레이어 게임 클라이언트. 플레이어들은 상자를 움직이고 빠른 반응 시간으로 서로 쏠 수 있습니다.

롤백의 마법

게임 플레이 코드는 이제 완성되었지만, 키가 눌렸을 때와 플레이어 박스의 응답(움직임 또는 발사) 사이에는 인지 할 수 있을 정도의 지연이 발생하고 있습니다.

이러한 지연은 TrueSync가 lockstep 시스템이고 input 큐로 인해 로컬 플레이어 행동에 레이턴시를 추가하게 되므로 시물레이션울 수행하기 전에 대응하는 원격 플레이어의 행동을 받기 위해 대기 할 수 있습니다.

특정 액션 게임에서 지연은 플레이어 경험에 악영향을 미칠 수 있으므로 이를 만회하기 위해 롤백 시스템을 개발했습니다.

롤백 시스템이 하는 역할은 원격 플레이어의 input 수신 전에 로컬 시뮬레이션을 수행하여 로컬 객체들의 응답 시간을 더 빠르게 하는 게임이 되도록 하는 것 입니다. 이를 위해 TrueSync 는 원격 플레이어의 입력 값들을 예측하려고 시도 합니다.

실제 원격 input 이 수신되었을 때, TrueSync 는 다음의 규칙들에 의해 예측값과 실제값을 비교 합니다.

  • 만약 실제 input 이 예측값과 동일할 경우: 시뮬레이션으로 진행;
  • 만약 실제 input 이 예측값과 다른 경우: 이전의 알려진 상태로 시뮬레이션 복구(롤백)하고 전에 잘못 시뮬레이션 된 모든 틱/프레임을 한번에 다시 시뮬레이션;

올바르게 사용될 때, 롤백 시스템은 멀리플레이어 게임의 레이턴시를 숨길 수 있는 강력한 메카니즘 입니다. 이제 TrueSync 게임에서 이 기능을 어떻게 사용하는지 살펴 보도록 하겠습니다.

TrueSync 글로벌 설정

TrueSync 에는 "TrueSync/Unity/Resources" 폴더에 글로벌 설정 에셋을 가지고 있습니다:

truesync default global settings
TrueSync 기본 글로벌 설정.

다음은 반드시 이해를 해야하는 중요한 변수들입니다:

  • sync window: input 큐의 크기 입니다;
  • rollback window: 예측된 input 값들로 TrueSync가 사전에 시뮬레이션 할 수 있는 최대 프레임 양 입니다;
  • panic window: 미 응답의 원인(더 이상 input 값 미전송)으로 원격 플레이어가 제거되기 전 누락된 프레임/틱의 최대 양 입니다;
  • Locked Time Step: TrueSync 게임 루프의 프레임당 시간;

Photon 클라우드 서버에 60ms 의 핑(라운드 트립 타임)을 가진 게임 클라이언트가 있다고 하면 기본적으로 0.02 의 locked step time을 사용하고 있는 것 입니다(프레임당 20ms 시간).

lockstep 게임에서 원격 플레이어의 지연을 맞추기 위해 동일하게 큰 지연을 로컬 input 에 추가해주는 input 큐가 필요합니다.

이 의미는 sync window 크기가 최소 3이 되어야 하므로, 모든 input 에 대해 60ms (3 프레임 X 프레임당 20ms)를 더했습니다.

롤백으로 지연 숨기기

이 이슈는 핑이 많이 변동될 수 있기 때문에 sync window 의 보다 안전한 값은 5 또는 6 입니다. 그러나 특정 게임에서는 이 값이 너무 클 수 있으므로 대신 rollback window 를 증가시키는 것이 좋습니다.

sync window의 값을 4로 사용하고 rollback window 도 4로 사용하면 게임을 8 프레임 지연을 감당할 수 있습니다(160ms 최대 핑 시간에도 부드럽게 실행된다는 의미입니다).

전역 설정을 변경하고 sync window 와 rollback window 의 값을 (4와 4) 사용합니다(sync window 의 기본 값인 10을 제거하여).

이제 테스트합니다-게임 신을 실행하세요. 플레이어 박스가 응답이 더 빠르다는 것을 확인해보세요. 두 개의 빌르로 온라인 테스트를 할 수 있으며 결과를 볼 수 있지만 죽은 점수와 쿨다운 횟수에 이슈가 있을 수 있습니다(지금 이것을 수정해 보겠습니다).

상태 추적 추가하기

록백에 대한 하나의 이슈는: TrueSync 내부 물리 엔진 등의 상태 복구이외에 체력, 점수, xp, 카운터와 타이머등 시뮬레이션에 추가한 커스텀 변수를 추적해야 합니다.

예측된 input 값으로 한 시뮬레이션에서 총알이 플레이어 박스를 쳤다고 가정하면 리스폰되고 죽은 갯수가 증가되어야 합니다.

이제 실제 input 값을 받았지만 플레이어가 총알을 피해 플레이어 박스를 치지 않아 롤백이 필요하다고 생각해봅시다. 물리 상태 복구를 통해 올바로 오버라이드 되어야 하지만 죽은 수는 그렇지 않을 것이고 시뮬레이션은 잘못된 값으로 진행될 것 입니다.

이 이슈들을 해결하기 위해 TrueSync는 상태 추적 시스템을 통해 개발자가 커스텀 속성 또는 객체가 자동적으로 관찰되고 롤백하는 동안 이전 값으로 복구하도로 해 줍니다.

이 튜토리얼에서, 우리는 롤백을 안전하게 사용하기 위한 다음의 속성들이 필요합니다:

  • "PlayerWeapon.cs" 에서 무기 쿨다운 타이머;
  • "Projectile.cs" 에서 총알 파괴 타이머;
  • "PlayerMovement.cs"에서 죽은수 카운터;

TrueSync의 상태 시스템에 속송을 추가하기 위해서 "[AddTracking]" 어노테이션을 추가하기만 하면 됩니다. "Projectile.cs"의 아래 코드에는 추적을 위한 파괴 타이머를 가지고 있습니다. 다른 두 개의 속성도 동일하게 수행합니다.

C#

[AddTracking]
private FP destroyTime = 3;

최종 테스팅

빌드 설정에 두 개의 신(Tutorial/Menu and Tutorial/Game) 모두 포함되어 있는지 확인해주시고 Tutorial/Menu 신이 첫 번째인지 확인 해 주세요(시작시 Unity가 로드할 신).

빌드를 선택하여 두 복사본을 실행하거나, 하나의 복사본을 실행하고 Unity 에디터내에서 Menu 신을 실행하세요.

두 클라이언트가 Photon 에 접속된 후 각 클라이언트가 자신의 상자를 제어하고 서로 쏘는 game 신이 로드되는 것을 볼 수 있어야 합니다. 플레이어 input 의 응답이 전 보다 빨라져야 합니다.

튜토리얼 소스

이 튜토리얼에 대한 전체 소스는 Unity Package 다운로드에서 다운로드 할 수 있습니다.

소스에는 TrueSync 와 PUN 이 포함되어 있지 않으므로 패키지 사용을 하시려면 TrueSync 라이브러리내에 이미 포함되어 있으니 임포트 해 주세요.

Back to top