본문 바로가기
시행착오 스토리/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;
    }
}
② 테스트를 해본다. 이제 로컬일 경우에는 파란색으로 보이고 다른 플레이어 프리펩은 하얀색으로 나타날 것이다.