프로젝트/2021-2022 포밍부스 프로젝트

[포밍부스] Unity 다중 플레이어 서버 제작하기

sleesm 2021. 10. 14. 20:30

 

 

 

안녕 여러분!!!! 🙌🙌🙌

 

오늘은 소혜님과 함께 Teams로 제어권 주고 진행하는

 

Unity에 내장된 NetworkManager를 사용해서 다중 플레이어 만드는 시간!!!!!!!!!!!!!!!!!!

 

이 목적이었으나,, 살펴보니까 2019년 이후로 NetworkManager가 안되더라고요 ㅎㅎ,,

 

 

그래서!!! 다른 무료 에셋을 사용한

다중 플레이어 서버 제작? 지금부터 시작합니다~~~~

 

 

 

 

 

 


 

 

 

 

먼저

 

NetworkManager를 사용할 수 있는 무료 에셋 Mirror를 설치해줍니다!!!

다운로드 주소 👉 https://assetstore.unity.com/packages/tools/network/mirror-129321

 

Mirror | 네트워크 | Unity Asset Store

Get the Mirror package from vis2k and speed up your game development process. Find this & other 네트워크 options on the Unity Asset Store.

assetstore.unity.com

 

 

 

 

 

 

설치 후에는 간단합니다!!!

 

 

 

 

 

☝ 빈 오브젝트를 만들어서 NetworkManager, NetworkManagerHUD를 넣어줍니다!

NetworkManager Inspector 화면

 

 


 

이때 NetworkManagerHUD화면에 띄우기 위한 용도입니다!!

따라서 필요하지 않은 사람은 띄우지 않아도 돼요!

 

화면에 띄워진 HUD

 

 

하지만, 저희는 테스팅 용도로 필요하기 때문에 (처음이니까)

사용했습니다!!

 

나중에는 HUD를 지우고 필요한 것만 띄우는 것이 목표!!

 


 

 

그렇다면 이제 뭘 하냐????????????!!!!!!!!!!!!!!

 

NetworkManager의 Player Obejct

 

NetworkManager에 Player Prefab에 앞으로 만들어갈 Player( 👇 )를 프리팹으로 만들어 넣어주면,

자동으로 플레이어 연결 완료!!!!!!

 

 

 

 

 

 

 





 

 

원하는 모양의 Player를 만들어서 Network Identity와 Network Transform을 넣어줍니다!!

Player Inspector 화면

 

 

 

  • 여기서 Network Identity 는 Identity 말 그대로, 해당 물체를 식별하기 위한 것입니다!!

    이를 통해 네트워크 시스템이 object를 인식하게 됩니다!!!

    NetworkIdentity의 Server Only

    여기서 Server Only는 Server에서만 Player를 보여준다는 뜻이므로 체크하지 않아야 합니다!!

    만약 체크를 하게 되면 Client로 들어갔을 때 Player의 모습이 보이지 않습니다!!!

 

 

  • Network Transform은 네트워크를 통해 Game Obejct의 Transform을 동기화시킵니다!!

    Network Transform의 Authority

    이때 Client Authority는 말 그대로, Client가 Object의 소유 권한을 가지고 있다는 말입니다!!

    즉, Client가 Commands를 호출할 수 있고, Client가 서버에서 나가면 해당 Obejct도 함께 사라집니다!!!







When a client has authority over an object it means that they can call
Commands and that the object will automatically be destroyed when the client disconnects. - Mirror


 

 







 

 

 


🤷‍♀️🤷‍♂️

저희는 Player로 Capsule을 사용했는데,

그냥 마음 끌리는 대로 하심 됩니다~~

 

지면도 마찬가지로 임시로 Cube를 만들어서 했는데,

그냥 끌리는 대로 골라서 하시면 됩니다!!!!

 

 

 

Player - Rigidbody, Ground - Box Colider 잊지 마십쇼 ^_^

 

 

 

 

🤦‍♀️🤦‍♂️

Character Controller가 그냥 Play를 하다 보면 생겨나는데,,

이놈이 문젭니다 ㅎㅎㅎ,,,

 

Capsule Collider랑 겹쳐서 생기는 문제인데 Capsule Collider를 없애면 지면과의 충돌처리가 안되므로

그냥 Character Controller를 꺼주면 됩니다!!! ㅎㅅㅎ

 

 


 

 

 

 

 

 



 

 

 

🤟 마지막으로 Player에 들어갈 Moving scirpt만 넣어주면 끝!!!!!

그냥 간단하게 대충 뚝딱 만들어서 넣어줬습니다 ^_^

이 함수는 Update() 함수에 들어가 주면 됩니다!!!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using UnityEngine.SceneManagement;

public class PlayerController : NetworkBehaviour
{
    [SerializeField] private float speed = 5.0f;


    private void Update()
    {
        if (!hasAuthority)
            return;

        PlayerMove();

    }

    private void PlayerMove()
    {
        var horizontal = Input.GetAxis("Horizontal");
        var vertical = Input.GetAxis("Vertical");
        transform.Translate(new Vector3(horizontal, 0, vertical) * (speed * Time.deltaTime));
    }

}

 

 

 

원래 NetworkBehaviour는 UnityEngine.Network에 있어야 하는데,

버전 업데이트와 함께 사라지면서 나오지 않습니다!!

 

그래서 그냥 Mirror를 사용해주면 NetworkBehaviour를 쓸 수 있습니다!!!!!!!

 

WOW!!!! Mirror 오픈소스로 공유해준 개발자 누구야!!!!!!!! 당신 멋있는 사람!!!!!!!!!!!! 👍👍👍👍👍👍

 

 

 

 

아무튼 그렇게 되면 👉👉

 

hasAuthority를 통해 자신의 것이 아닌 경우에는 통제할 수 없도록 할 수 있습니다!!!!

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

이로써 멀티 플레이어 Network Manger 사용해서 세팅하기 끝!!!!!!!!!!!!!

 

 

Client로 들어갔을 때 보이는 Host와 Client

 

 

 

 

 

 

 

 

 

 

 

 


오늘은 여기까지~~~~~~

 

Character Controller 때문에 몇 시간을 날렸는지 몰라요 ㅋㅎㅋㅎ...

 

여러분들은 저희처럼 헤매지 않길 바라면서~~~~

.

.

.

.

그럼 안녕 !!!!!!!!!!!!!!!!!!!!!!!! 🙌🙌🙌🙌🙌🙌🙌