시행착오 스토리/Unity Network
#2 UNET으로 간단한 멀티플레이어 예제 만들어보기 - Local Player 식별까지
by 양벨라
2017. 9. 28.
UNET을 이용하여 멀티플레이어 게임 만들기
지난 글에서는 호스트와 클라이언트가 각각의 플레이어 프리팹을 동기화하는 것 까지 했다. 오늘은 위치를 동기화시키고 로컬 플레이어를 식별할 수 있도록 색깔을 지정해주는 부분까지 할 것이다. 예제는 Simple MultiPlayer Example 에서 확인할 수 있다. 범위는 7~9까지이다.
Networking Player Movement
① PlayerController 스크립트를 열어서 수정한다.
UnityEngine.Networking 네임스페이스를 추가하고, MonoBehaviour을 NetworkBehaviour로 변경한다. 이 네임스페이스는 network-aware 스크립트를
작성할 수 있도록 해준다. NetworkBehaviour은 MonoBehaviour을 베이스로 하는 클래스이며 이를 상속하면 네트워킹 feature를 사용할 수 있다.
↓ ↓ ↓ 아래와 같이 isLocalPlayer을 체크하는 부분을 추가한다.
if(!isLocalPlayer)
{
return;
}
그렇다면 수정된 최종 코드는 이렇게 된다.
/*PlayerController.cs*/
using UnityEngine;
using UnityEngine.Networking;
public class PlayerController : NetworkBehaviour
{
void Update()
{
if (!isLocalPlayer)
{
return;
}
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);
}
}
② Player 프리팹을 선택하여 Network > NetworkTransform 컴포넌트를 추가해준다.
NetworkTransform은 게임오브젝트의 transform을 동기화해주는 역할을 한다.
Testing Multiplayer Movement
① 플레이모드로 들어가서 LAN Host 버튼을 누르면 시작된다. 이 때 이 프로젝트는 호스트로서 게임을 작동시킨다.
② standalone 어플리케이션으로 Build and Run한다. 실행이 되면 LAN Client 버튼을 누른다.
이 어플리케이션은 클라이언트로서 게임을 작동한다.
③ 방향키로 Player를 움직여보면 전과는 다르게 위치가 서로 동기화됨을 알 수 있다. 유니티의 Hierarchy에 Player(clone)이 2개 생성되어 있음이 보여진다.
↓↓↓
Identifying the Local Player
① PlayerController 스크립트를 수정한다.
로컬플레이어를 실행했을 때 자기자신을 알기 위해 색깔을 바꿔줄 것이다. 아래의 코드를 넣고 로컬 플레이어 프리팹의 색깔을 파란색으로 바꾸어 자신을 판별할 수 있도록 해준다.
public override void OnStartLocalPlayer()
{
GetComponent().material.color = Color.blue;
}
그렇다면 수정된 최종 코드는 이렇게 된다.
/*PlayerController.cs*/
using UnityEngine;
using UnityEngine.Networking;
public class PlayerController : NetworkBehaviour
{
void Update()
{
if (!isLocalPlayer)
{
return;
}
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);
}
public override void OnStartLocalPlayer()
{
GetComponent().material.color = Color.blue;
}
}
② 테스트를 해본다. 이제 로컬일 경우에는 파란색으로 보이고 다른 플레이어 프리펩은 하얀색으로 나타날 것이다.