유니티

유니티 - Mirror 셋팅 및 Attribute 간단 설명

재밌는게임~ 2024. 6. 9. 18:38

유니티에서는 무료로 제공하는 Mirror Asset이 있다. 이렇게 Deadicated Server 멀티플레이어 게임을 만들 수 있다.

 

오늘은 Mirror를 간단하게 사용하는 방법을 보겠다.

 

먼저 본인은 Client가 Server를 같이 병행하는 형태를 사용하였다. 즉! 방장이 Server와 동시에 Client이고, 다른 Client가 들어오면서 게임을 하는 방식이다.

 

먼저 Mirror Asset을 Import 해주고, NetworkRoomManager를 셋팅해준다.

 

본인은 RoomManager라는 새로운 스크립트를 NetworkRoomManager를 상속받아서 사용하였다.

 

이런식으로 셋팅해서 사용하면 되고, 버튼에 각각 서버와 클라이언트가 시작되는 코드를 넣어서 테스트 해보면 될 것이다.

 

셋팅은 여기까지 설명하고 간단하게 통신하는 것들을 알려주겠다. 

 

Server와 Client를 통신하게 해주는 Attribute 가 있다. 간단하게 아래 이정도만 알아두고, 나머지는 필요할 때 찾아보자

mirror - attribute

[SyncVar]

[SyncVar] public int health = 100;
  • 설명: [SyncVar] 어트리뷰트는 서버에서 값이 변경될 때 클라이언트에 자동으로 동기화되는 변수를 정의합니다. health 변수가 서버에서 변경되면 클라이언트는 자동으로 그 값을 받게 됩니다.
  • 용도: 플레이어의 체력과 같은 중요한 게임 상태를 모든 클라이언트와 동기화할 때 사용합니다.

**[SyncVar(hook = nameof(OnInt1Changed))]**는 변수의 값을 서버에서 클라이언트로 동기화하는 것에 더해, 값이 변경될 때마다 지정된 후크 함수를 호출하여 추가적인 처리를 할 수 있습니다.

  • **[SyncVar]**는 변수의 값을 서버에서 클라이언트로 자동 동기화하지만, 값이 변경될 때 특별한 처리를 하지 않습니다.

SyncList<T>

SyncList<Item> inventory = new SyncList<Item>();
  • 설명: **SyncList<T>**는 리스트(List)의 변경 사항을 자동으로 클라이언트와 동기화해주는 Mirror API의 자료구조입니다.
  • 용도: 플레이어의 인벤토리와 같이 동기화된 리스트를 유지해야 할 때 사용됩니다. 리스트에 아이템을 추가하거나 제거할 때 그 변경 사항이 클라이언트에 자동으로 반영됩니다.

[Server]

[Server] void LevelUp() {}
  • 설명: [Server] 어트리뷰트는 해당 함수가 서버에서만 호출될 수 있음을 나타냅니다. 클라이언트에서 호출하려고 하면 오류가 발생합니다.
  • 용도: 레벨 업과 같은 서버 전용 로직을 구현할 때 사용합니다.

[Client]

[Client] void Animate() {}
  • 설명: [Client] 어트리뷰트는 해당 함수가 클라이언트에서만 호출될 수 있음을 나타냅니다. 서버에서 호출하려고 하면 오류가 발생합니다.
  • 용도: 애니메이션과 같은 클라이언트 전용 로직을 구현할 때 사용합니다.

isServer와 isClient

void Update()
{
    if (isServer) Heal();
    if (isClient) Move();
}
  • 설명: **isServer**와 **isClient**는 현재 코드가 서버에서 실행 중인지 클라이언트에서 실행 중인지 확인하는 속성입니다.
  • 용도: **isServer**는 서버 전용 로직(예: Heal)을, **isClient**는 클라이언트 전용 로직(예: Move)을 실행할 때 사용합니다.

[Command]

[Command] void CmdUseItem(int slot) {}
  • 설명: [Command] 어트리뷰트는 클라이언트에서 서버로 호출되는 함수를 정의합니다. 클라이언트가 이 함수를 호출하면 서버에서 실행됩니다.
  • 용도: 클라이언트가 서버에 아이템 사용 명령을 보낼 때 사용됩니다.

[ClientRpc]

[ClientRpc] void RpcRespawn() {}
  • 설명: [ClientRpc] 어트리뷰트는 서버에서 모든 클라이언트로 호출되는 함수를 정의합니다. 서버가 이 함수를 호출하면 모든 클라이언트에서 실행됩니다.
  • 용도: 서버가 모든 클라이언트에게 플레이어의 리스폰(재생성)을 알릴 때 사용됩니다.

[TargetRpc]

[TargetRpc] void Hello() {}
  • 설명: [TargetRpc] 어트리뷰트는 서버에서 특정 클라이언트로 호출되는 함수를 정의합니다. 서버가 특정 클라이언트를 지정하여 이 함수를 호출하면 해당 클라이언트에서만 실행됩니다.
  • 용도: 서버가 특정 클라이언트에게만 특정 메시지를 보내거나 특정 작업을 수행하게 할 때 사용됩니다.

이러한 Attribute가 붙은 함수들로 Server와 통신하며 다른 클라이언트에게 알려주는 역할을 하게 된다. 

 

다음 페이지에는 예시를 통한 통신을 작성해보겠다.

728x90