4인 멀티플레이어 게임에서 플레이어 캐릭터는 총 16명이다
게임 서버를 공부한 사람이라면, 이 문장을 이해할 수 있어야 한다.
각 클라이언트의 게임 월드는 네트워크상에서 평행우주처럼 동작한다.
클라이언트: 서버에 접속하여 서비스를 제공받는 단말기(컴퓨터), 프로그램, 사용자를 뜻함.
다음은 4인 멀티플레이어 게임에서 각 클라이언트의 게임 월드 모습을 그린 그림이다.
그림에서 네트워크에 존재하는 게임 월드는 총 4개이다.
위 그림에서 게임 월드 속의 a, b, c, d는 플레이어 캐릭터로 동작하는 게임 오브젝트입니다.
여기서 플레이어 A가 직접 조작하는 플레이어 캐릭터는 a라고 가정해 본다면,
A의 컴퓨터, 즉 클라이언트 A에서 동작하는 게임 월드에는 a, b, c, d라는 4명의 플레이어 캐릭터가 존재한다. 마찬가지로 클라이언트 B의 게임 월드에도 a,b,c,d라는 4명의 플레이어 캐릭터가 존재한다.
각자의 클라이언트에 각각 4명씩의 플레이어 캐릭터가 존재하므로 4인 멀티플레이어 게임에서 네트워크상에 존재하는 총 플레이어 캐릭터는 16명이다.
여기서 아래 둘은 다른 게임 오브젝트라는 점에 주목해야 한다.
클라이언트 A의 플레이어 캐릭터 a
클라이언트 B의 플레이어 캐릭터 b
비유하자면 나와 똑같은 사람이 다른 평행우주에 다른 버전으로 존재하는 것이다. 둘은 서로를 알지 못하고 영향을 줄 수 없다. 따라서 서로 같은 시간에 다른 행동을 할 수 있다.
하지만 내가 다른 우주의 나를 찾아 통신 할 수 있다면 서로 같은 시간에 같은 행동을 하도록 합을 맞출 수 있다.
네트워크 매니저를 통해 클라이언트 A와 클라이언트 B에 있는 각각의 캐릭터 a가 같은 캐릭터를 표현하는 것임을 알 수 있는 식별자를 부여할 수 있다.
즉, 클라이언트 A의 캐릭터 A와 클라이언트 B의 캐릭터 b 는 서로 다른 인스턴스지만 네트워크를 통해 같은 캐릭터 a에 대한 서로 다른 버전임을 각각의 클라이언트가 알 수 있다. 그리고 이 두 인스턴스를 네트워크를 통해 동기화함으로 서로 동일한 상태로 만들 수 있다.
플레이어 캐릭터 a(클라이언트A) <-- 동기화 --> 플레이어 캐릭터 b (클라이언트 B)
로컬과 리모트
로컬: 물리적으로 사용자의 위치에 존재하는 단말기, 프로그램, 오브젝트
리모트: 원격 접속을 통해 접근할 수 있는 단말기, 프로그램, 오브젝트
ex) 로컬 데스크톱은 사용자가 직접 사용 중인 컴퓨터, 리모트 데스크톱은 인터넷 등을 통해 접속한 타인의 컴퓨터.
마찬가지로 네트워크 게임에서 씬에 존재하는 게임 오브젝트는 로컬 오브젝트와 리모트 오브젝트로 구분 가능
로컬과 리모트 오브젝트를 나누는 기준은 해당 오브젝트의 주도권을 가진 사람.
로컬 오브젝트: 주도권이 자신에게 있음
리모트 오브젝트: 주도권이 네트워크 너머의 타인에게 있음.
로컬 오브젝트는 로컬 클라이언트(플레이어 자신의 컴퓨터)의 게임 월드에서 생성되며 주도권은 로컬 클라이언트에 있다.
리모트 오브젝트는 타인의 게임 월드에서 건너온 것으로, 타인의 게임 월드에서 어떤 게임 오브젝트가 생성된 다음 네트워크를 통해 나의 게임 월드에 같은 게임 오브젝트로 복제 생성되었다고 했을 때 해당 게임 오브젝트를 말한다.
리모트 게임 오브젝트는 로컬 클라이언트에 주도권이 없기 때문에 특별한 경우를 제외하고는 로컬 클라이언트가 리모트 오브젝트를 임의로 삭제하거나 주요 상태를 변경할 수 없다.
4인 멀티플레이어 게임 그림에서 로컬과 리모트를 구분하여 다시 표현하면 다음과 같다.
동기화
플레이어 A가 자신의 게임 월드에서 로컬 플레이어 캐릭터 a 를 움직였다고 가정해 보자.
이 경우에 나머지 B,C,D의 게임 월드에서도 리모트 플레이어 캐릭터 a가 움직여야 한다.
그런데 B, C, D 의 게임 월드에서 플레이어 캐릭터 a 는 A의 게임 월드에서의 a와 다른 존재이다.
그러므로 특별한 처리 없이는 움직이지 않는다.
따라서 플레이어 A는 플레이어 캐릭터 a를 움직인 다음 변경된 a의 위치를 사용자 B,C,D의 게임 월드에 있는 a의 분신에 동기화 신호로 전달해야 한다. 그 다음에서야 B,C,D에서의 a도 움직이게 된다.
즉, 로컬 플레이어 캐릭터 a의 정보를 다른 월드에 있는 리모트 플레이어 캐릭터 a에 전달하여 로컬 플레이어 캐릭터 a의 변경 사항을 리모트 플레이어 캐릭터 a에 반영한다. 이런 방식으로 4개의 게임 월드를 끊임없이 같은 모습으로 동기화 할 수 있다.
여기서 동기화 간격이 길거나 인터넷 속도가 느리면 4개의 게임 월드의 모습이 조금씩 달라질 수 있다. 또한 네트워크 접속이 끊기면 4개의 게임 월드는 서로 완전히 독립적으로 동작하게 된다.
로컬 권한 검사
로컬 플레이어 게임 오브젝트든 리모트 플레이어 게임 오브젝트든 플레이어 게임 오브젝트의 컴포넌트 구성은 동일하다.
따라서 로컬과 리모트 플레이어 캐릭터 모두 사용자 입력을 받을 수 있다.
즉, A의 게임 월드에 존재하는 a,b,c,d라는 플레이어 캐릭터는 모두 플레이어 A의 조작을 받을 수 있다. 하지만 플레이어 A의 조작 입력은 로컬 플레이어 캐릭터인 a에만 반영되어야 하고, 리모트 플레이어 캐릭터 b,c,d에는 반영되면 안 된다.
이를 구현하려면 오브젝트가 로컬 권한을 가지고 있는지 검사해야 한다.
다음 그림에서는 코드마다 if문을 삽입하여 오브젝트 자신이 로컬 오브젝트라면 사용자 입력을 그대로 받고, 리모트라면 사용자 입력을 무시한다.
위 그림은 플레이어 A의 조작이 플레이어 게임 오브젝트 a,b,c,d의 Update() 메서드에서 어떻게 처리되는지 보여준다. 여기서 local은 로컬 오브젝트임을 나타내는 bool 변수이다. 만약 리모트 오브젝트라면 local은 false, !local은 true가 된다.
플레이어 A의 입장에서 a오브젝트는 로컬이므로 사용자 입력을 감지하는 하단의 코드로 처리가 계속 진행된다.
나머지 b,c,d의 게임 오브젝트는 if문 조건에 걸려 처리가 더 이상 진행되지 않는다. 따라서 A월드의 b,c,d 게임 오브젝트의 위치는 네트워크 동기화를 통해서만 변경된다.
'유니티 C# > 서버, 네트워크' 카테고리의 다른 글
2. 게임 서버의 종류 (0) | 2023.05.17 |
---|