네트워크에서 식별을 하기 위해서는 NetworkIdentity가 필요하다.
유니티 네트워크를 사용하기 위해서는 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으로 빠져나가 나 자신만 움직일 수 있게 된다.
'개발 > Unity & C#' 카테고리의 다른 글
[유니티] GetComponent을 자동으로 생성하는 여러가지 방법... (0) | 2018.05.30 |
---|---|
[유니티] 유니티 네트워크(Unet) 사용 - 04) NetworkTransform와 NetworkTransformChild (0) | 2018.05.29 |
[유니티] 유니티 네트워크(Unet) 사용 - 02) NetworkManager (0) | 2018.05.29 |
[유니티] 유니티 네트워크(Unet) 사용 - 01) 시작 전 기초 용어 정리 및 개념 이해 (0) | 2018.05.29 |
[유니티] 객체를 제거하는 두 함수 : Destroy함수와 DestroyImmediate의 함수의 차이 (0) | 2018.05.07 |