네트워크에서 식별을 하기 위해서는 NetworkIdentity가 필요하다.


NetworkManager 개념 설명


유니티 네트워크를 사용하기 위해서는 NetworkManager라는 컴포넌트를 사용하는데,

이 때 NetworkIdentity가 없는 게임 오브젝트는 네트워크 상에서 동기화를 할 수 없다.

왜 동기화를 거절할까?


NetworkIdentity를 붙였다는 것은 서버와 클라이언트 간 이미 약속된 게임오브젝트라는 의미이다.

따라서, NetworkIdentity가 붙지 않았다는 것은 나쁜 짓(버그,핵)을 할 가능성이 있으므로 동기화를 거절한다.


Local Player Authority


컴퓨터 앞에 앉아 있는 캐릭터인 로컬 플레이어의 권한을 갖고 있다.


이렇게 한 뒤, 실행을 해보면 


NetworkManagerHUD에 의해 좌측 상단에 접속할 수 있 버튼이 만들어져있다.


가장 위에 LAN Host(H)를 누르면 Player가 생성된다.


PC로 빌드를 해서 1개를 더 띄운다음에 2번째 것은 LAN Client로 접속한다.


서버 호스트는 이미 만들었으므로. 그러면 플레이어가 두 개가 생성되는 것을 볼 수 있다.


캐릭터를 상하좌우로 움직여보면 


두 캐릭터가 동시에 같은 입력을 받아 움직이는 것을 확인할 수 있다.


그 이유는 이것은 생성된 플레이어가 게임 상에서 로컬 플레이어인지 리모트 플레이어인지 구분을 하지 않는다.


따라서, 스크립트의 모든 내용을 공유하기 때문에 뒤늦게 생성된 게임오브젝트는 리모트 플레이어지만 


로컬 플레이어만 동작해야 할 코드를 같이 적용하게 되는 것이다.


따라서,  로컬 플레이어인지 체크한 뒤에 조작과 관련된 코드의 적용을 통제해야한다.


하지만, 먼저 MonoBehaviour가 아니라 NetworkBehaviour 를 상속해주어야 네트워크 관련 코드를 작성할 수 있다.




Update() 코드에서 조작을 하는 코드 위에 다음과 같이 작성해준다.


        if (!isLocalPlayer)

        {

            return;

        }

 

이렇게되면, 로컬 플레이어가 아니라면 조건문이 true가 되므로 return으로 빠져나가 나 자신만 움직일 수 있게 된다.

Posted by sungho88
,