멀티 플레이어 구현, 원하는 경우 나중에 구현할 수 있습니까?


15

XNA를 사용하여 게임 프로젝트를 만들 계획입니다. 멀티 플레이어 기능을 추가하고 싶은지, 아직 새로운 문제를 해결할 다른 많은 문제가 있다는 것을 확신하지는 않습니다. 나는 프로젝트가 반드시 손에서 벗어나기를 원하지 않습니다.

내 질문은, 멀티 플레이어 지원을 추가 할 계획없이 프로젝트를 진행하는 경우, 뒤로 이동하고 (일반적으로는 아님) 멀티 플레이어 게임을 캡처하는 데 필요한 코드를 쉽게 추가 할 수 있습니까?

답변:


24

다음은 Zoidcom 네트워킹 라이브러리 매뉴얼 에서 얻은 조언입니다 .

프로젝트가 계획 단계에있는 경우 처음부터 네트워킹을위한 프로젝트를 설계하는 것이 좋습니다. 프로젝트의 말기 상태에서 네트워크 코드를 연결하면 대규모 리팩토링이나 대량의 해킹이 발생하여 유지 관리가 어렵고 버그가 많은 코드가 생성 될 수 있습니다.

가장 깨끗한 방법은 마치 전체 네트워크 게임처럼 전체 게임을 구현하는 것입니다. 즉, 전용 서버에 대한 코드를 구현하고 서버 코드에 대해서만이 코드를 구현하십시오. 비슷한 방식으로 게임 클라이언트 코드를 구현하십시오. 서버와 클라이언트는 동일한 프로세스에서 실행될 수 있으며 실제 네트워크 소켓을 사용할 필요는 없지만 별도의 엔터티 여야하며 모든 코드는 그런 방식으로 작동하도록 설계되어야합니다. 플레이어가 점프 할 때 플레이어의 점프 벡터를 직접 변경하지 말고 '점프 키 누름'패킷을 서버로 보내 서버가 처리하도록하십시오.

즉, 싱글 플레이어 게임에서도 백그라운드에서 보이지 않는 서버가 실행되고 있습니다. 동일한 게임의 멀티 플레이어 버전은 로컬 멀티 플레이어 대신 원격 서버에 연결하기 만하면됩니다. 이것의 장점은 다음과 같습니다.

단일 및 멀티 플레이어를위한 별도의 코드가 없음 네트워크 코드는 전체 프로젝트 클린 코드 중에 테스트 및 개발됩니다

이 체계를 사용하는 프로젝트는 Quake 엔진, Civilization 4, Neverwinter Nights 등을 사용하는 거의 모든 게임입니다.

대기 시간이없는 동일한 프로세스에서 클라이언트와 서버를 연결하기 위해 로컬 소켓을 사용할 수 있습니다. 이들은 Zoidcom에서 제공하며 OS 레벨 소켓을 거치지 않고 한 ZCom_Control에서 다른 ZCom_Control로 직접 패킷을 전달합니다.


이것이 내가 싫어하는 순수한 서버 권한을위한 설정 인 것 같습니다. 서버에 대한 핑이 낮 으면 제대로 재생됩니다. 그러나 핑이 너무 높아지면 화면의 동작이 지연됩니다. 소스 엔진이 사용하는 방법을 선호하고 클라이언트가 물리를 실행하고 로컬로 작업을 수행하고 모든 작업이 즉시 표시되지만 서버는 여전히 사람들이 해킹하지 않았는지 확인하고 발생해야 할 일에 불일치가 있는지 확인합니다. 서버가 올바른 상태를 플레이어에게 보내고 클라이언트 시뮬레이션을 새 데이터로 재정의합니다.
AttackingHobo

8
@AttackingHobo : 당신은 단지 클라이언트 예측을 설명하고 있습니다. 클라이언트 예측과 서버 권한을 함께 사용할 수 있으며 Zoidcom 매뉴얼에 설명 된 아키텍처를 전혀 배제하지 않습니다.

@AttackingHobo @Joe : Zoidcom은 실제로 클라이언트 측 예측을 지원합니다 ^^
Leftium

2

나는 Leftium의 답변에 인용 된 조언에 동의합니다. 나중에 추가 할 수 없으므로 처음부터 네트워킹 할 수 있도록 설계하십시오 .

멀티 플레이어 게임을 처음 만들려고했을 때 (단일 플레이어 게임을 만들려고하지 않았습니다!) 먼저 게임을 시작한 다음 네트워킹을 추가 할 것이라고 생각했습니다. 나쁜 생각. 나는 정말 지루한 싱글 플레이어 게임의 프로토 타입을 남겼으며 멀티 플레이어 게임으로 변환하는 방법에 대한 실마리는 없었습니다. 나는 처음부터 멀티 플레이어 네트워킹 코드를 작성하면서 완전히 폐기하고 다시 시작했습니다. 모든 것이 클릭되었습니다.

나는 1 인용 게임으로 시작해서 멀티 플레이어 기능을 추가하는 것이 불가능 하지 않다고 확신합니다 . 당신이 그것을 통해 생각하고, 그것을 올바르게 계획하고 당신의 전략을 알고 있는지 확인한 다음 시도하십시오. 최소한 작업하는 것이 재미있는 퍼즐이라고 생각합니다. 그러나 실제로 네트워킹을 추가하는 방법에 대한 계획을 알고 있어야합니다.

나는 시도하지 않았지만 중간 근거가 있다고 생각합니다. 네트워킹 / 멀티 플레이어 기능을위한 더미 클래스를 작성하고 싱글 플레이어 게임을 작성할 때 부지런히 사용할 수 있습니다. 그런 다음 나중에 멀티 플레이어를 구현하기로 결정한 경우 더미 클래스를 작성하면 대부분의 방식으로 완료됩니다. 이것은 서버 / 클라이언트 방법에 많이 접근하지만 적은 작업으로 도망 갈 수 있습니다. 결국, 싱글 플레이어 게임은 멀티 플레이어 게임보다 만들기가 더 쉽기 때문에 멀티 플레이어 게임처럼 싱글 플레이어 게임을 작성하려면 왜 멀티 플레이어로 만들지 않겠습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.