시행착오 스토리/Unity Network
#1 UNET으로 간단한 멀티플레이어 예제 만들어보기 - Single Player 테스트까지
by 양벨라
2017. 9. 27.
UNET을 이용하여 멀티플레이어 게임 만들기
네트워크 엔진 Ranknet이라는게 있다. 게임 개발자라면 한번쯤 들어봤을 법한 이 라이브러리는 P2P방식의 네트워크엔진인데 유니티에 내장된 네트워크 기능이 바로 이것이라고 한다. 유니티5에서 기능이 수정되면서 하이레벨로 제작되어진 API 스크립트를 HLAPI 라고 한다. Ranknet에 기반했으므로 UDP기반이며 UNET은 데디케이트 서버를 가지는 세션 방식의 게임서버에 특화되어 있다.
사용에 앞서 유니티에서 제공하는 예제를 먼저 따라해보기로 한다. 예제는
Simple MultiPlayer Example 에서 확인할 수 있다. 해당 글에서는 총 범위 1에서 18까지 중에서 1~6까지 다룰 예정이다.
Introduction to a Simple Multiplayer Example
① 유니티에서 새 3d 프로젝트를 생성한다.
② 씬을 main으로 저장한다.
The Network Manager
① empty gameobject를 만들고 이름을 Network Manager로 지정한다.
② Network Manager를 선택한 채로 NetworkManager와 NetworkManagerHUD 컴포넌트를 추가한다.
여기서 NetworkManager 컴포넌트는 게임의 네트워크 환경을 관리해준다. NetworkManagerHUD 컴포넌트는 NetworkManager와 함께 동작하며 게임을 실행했을 때 네트워크 관경을 컨트롤할 수 있는 유저 인터페이스를 제공한다.
↓↓↓ 아래와 같다.
Setting up the Player prefab
① Capsule 게임 오브젝트를 만들고 이름을 Player로 지정한다.
② 게임 오브젝트의 앞을 구분하기 위해 Player 오브젝트의 차일드 오브젝트를 생성한다.
Player를 선택한 채로 새로운 Cube 게임오브젝트를 생성하고 이름은 Visor로 지정한다.
Visor의 Scale은 (0.95, 0.25,0.5) 로 Position은 (0.0, 0.5, 0.24)로 설정한다.
③ Material을 만들고 이름을 Black로 지정한다.
Material을 선택한 채로 Albedo색깔을 black으로 바꾼다.
④ Material을 끌어서 Visor의 위에 놓으면 Visor의 색이 black으로 설정된다.
⑤ Player에 Network>NetworkIdentity 를 추가한다. 그리고 Local Player Authority를 선택한다.
⑥ Player 게임 오브젝트를 드래그 하여 Prefab을 생성한다. 씬의 Player를 지우고 씬을 저장해준다.
Registering the Player prefab
① Network Manager 게임 오브젝트를 선택하고 Inspector에서 Spawn Info를 연다.
② Player prefab field에 Player prefab을 드래그한다.
Network Manager 컴포넌트는 networked 오브젝트들의 스포닝을 관리할 수 있다. 뒤에 나오지만 Player 말고도 스포닝을 관리하고 싶은 오브젝트가 있다면 바로 아래에 Registered Spawnable Prefabs에 +로 추가를 하여 사용하면 된다.
Creating Player Movement
C# 스크립트를 추가하고 이름을 PlayerController로 지정한다.
/*PlayerController.cs*/
using UnityEngine;
public class PlayerController : MonoBehaviour
{
void Update()
{
var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
transform.Rotate(0, x, 0);
transform.Translate(0, 0, z);
}
}
Testing Player Movement Online
① 플레이모드로 들어가서 LAN Host 버튼을 누르면 시작된다. 이 때 이 프로젝트는 호스트로서 게임을 작동시킨다.
② build Setting에 main 씬을 추가하고 standalone 어플리케이션으로Build and Run한다. 실행이 되면 LAN Client 버튼을 누른다.
이 어플리케이션은 클라이언트로서 게임을 작동한다.
③ 방향키로 Player를 움직여보면 호스트와 클라이언트의 위치가 똑같이 표시되지 않는다는 사실을 알 수 있다.
이 글은 내가 직접 유니티 예제를 보고 따라했던 부분을 적은 것이다. 플레이어 프리팹이 호스트와 클라이언트에 각각 뜨고 동기화되는 것을 확인할 수 있었고 아직 위치는 동기화되지 않는다. 다음으로 넘어가서 위치를 동기화시키는 부분을 더 해볼 것이다.