[RequireComponent(type())]


보통 GetComponent는 대부분 자기 자신의 컴포넌트 중 하나를 가져와 사용한다.


자신에 부착돼있는 컴포넌트를 가져와 사용하려면 기본적으로, 다음과 같이 호출한다.


Rigidbody rigid = GetComponent<Rigidbody>();


보통 이런 목적으로 사용할 때는 Awake나 Start에서 미리 선언한 뒤 사용한다. 


하지만 Rigidbody 컴포넌트의 존재를 보장하지 않는다. 


무슨말이냐면, 실수로 Rigidbody를 게임오브젝트에서 지웠다면 null이 되어 실행 시, 문제가 발생된다.


그래서 엄격히 컴포넌트의 존재를 보장하고 싶을 때 RequireComponent를 사용한다.


사용방법은 다음과 같다. 클래스보다 위에 쓴다는 점. 명심하자.



[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(Collider))]

public class Bullet : MonoBehaviour
{



제법 깔끔하기도 하고 자주 사용하는 방법이다.


이렇게 되면, 이 게임오브젝트는 반드시 Rigidbody와 Collider를 갖고 있어야 한다는 의미이다.


따라서, 위 두 컴포넌트는 삭제할 수 없다. Delete해봐라. 그럼 아래와 같은 창을 볼 수 있다.



Bullet 스크립트가 Box Collide를 요구하고 있기때문에, 이것은 삭제할 수 없게 되므로 에러 발생 확률이 적어진다.






이렇게 인스펙터와 관련된 기능이 많다.



Posted by sungho88
,

01)  유니티 네트워크(Unet) 사용 전 알아야할 개념

02) 유니티 네트워크(Unet) 사용 : NetworkManager

플레이어들 사이에 위치를 네트워크 동기화를 시켜주기 위한 방법에 대해 알아보자.


NetworkTransform가 붙은 오브젝트는 


자기 자신의 위치를 자신의 네트워크 너머에 있는 리모트 플레이어에게 위치를 전달할 수 있다.


즉, 위치를 자동으로 위치를 동기화시켜주는 역할을 한다.


하지만, 다른 클라이언트에게 직접적으로 동기화를 하는 것이 아니라 호스트(방장)을 거쳐가게 된다.


NetworkTransform 컴포넌트에서는 이러한 속성들이 있다.





Transform Sync Mode에는 어떤 것을 동기화할 것인지 설정하는 것으로 다음과 같은 속성이 있다.


테스트하는 것이므로 기본값으로 해보자.


다시 창 2개를 띄우고 접속한 뒤 움직여보자.


로컬 플레이어만 움직이며, 움직이는 모습이 두 창에서 동기화된다.


그런데 여기 문제점이 하나 있다.


Player root 객체는 움직이는데 만약, 계층 구조로 되어 있다면, 이 자식 젝체들은 회전하지 않는다.


그래서, 자동차 같은 경우 바퀴와 차량 본체로 이뤄져 있다면 이동방향과 상관없이 회전하지 않는다.


따라서 이를 위해서 NetworkTransformChild을 사용해야 한다.


주의할 점은 이것을 자식 게임오브젝트에 추가하는 것이 아니라 Player(부모 게임오브젝트)에 컴포넌트로 넣는다.


PlayerCar

ㄴ wheel

ㄴ body


라면 PlayerCar에 NetworkTransformChild를 두 개 추가해준 뒤, 


Target에 wheel과 body를 드래그 & 드롭하면 된다. 이렇게 하면 두 화면 모두 동기화되어 잘 움직인다.






Posted by sungho88
,

네트워크에서 식별을 하기 위해서는 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
,