현재 지원이 중단된 네트워크 솔루션으로 비교적 간단히 멀티플레이를 구현 가능
UNet의 제작자가 Mirror라는 19, 20버전 유니티에서 사용 가능한 라이브러리를 만들었고,
현재는 Mirage라는 라이브러리 제작 중이다.
NetworkManager
아래와 같이 사용할 클래스가 NetworkManager를 상속받아 필요한 내용 오버로딩
public class FWNetworkManager : NetworkManager
{
#region SERVER SIDE EVENET
public override void OnServerConnect(NetworkConnection conn)
{
Debug.Log("OnServerConnect + " + conn.address);
base.OnServerConnect(conn);
}
#endregion
}
게임 오브젝트에 해당 컴포넌트를 붙이면 Offline Scene과 Online Scene을 붙여야 함
해당 씬들은 빌드에 포함되어 있어야 한다.
Offline Scene은 멀티 플레이를 시작하기 전 씬을 의미하고
Onlien Scene은 멀티 플레이가 시작하는 씬을 의미한다.
void GotoNextScene()
{
//SceneController.Instance.LoadScene(SceneNameConstants.InGameScene);
FWNetworkManager.singleton.StartHost();
NextSceneCall = true;
}
위와 같이 LoadScene 대신 NetworkManager의 StartHost를 호출
멀티 플레이 시 조작할 객체는 MonoBehaviour를 상속 받는 것이 아닌
NetworkBehaviour를 상속 받아야 한다.
[SerializeField]
[SyncVar]
Vector3 MoveVector = Vector3.zero;
멀티 플레이 유저 간 동기해야 하는 변수는 SyncVar을 써줘야 한다.
[Command]
public void CmdMove(Vector3 moveVector)
{
this.MoveVector = moveVector;
transform.position += moveVector;
base.SetDirtyBit(1);
}
클라이언트가 서버로 요청하는 커맨드 함수는 [Command] 속성을 가져야 하며,
함수명이 Cmd로 시작해야 된다고 하며,
SyncVal을 수정 후 SetDirtyBit를 설정하여 수정됨을 알려야 한다.
플레이어가 조종할 객체는 NetworkIdentity 클래스를 가져야 하며,
객체 프리팹에 컴포넌트 추가 후 해당 컴포넌트를 사용
그리고 NetworkManager 객체의 Spawn Info에 플레이어 프리팹을 지정해줘야 함
if (isServer)
{
RpcMove(MoveVector);
}
else
{
CmdMove(MoveVector);
if (isLocalPlayer)
{
transform.position += AdjustMoveVector(MoveVector);
}
}
2019 유니티의 경우 버그가 있어 호스트일 때 CmdMove가 먹히지 않는 때가 있다고 함
그래서 서버인 경우 자기 자신에게 ClientRpc를 보내어 이동
클라이언트인 경우 서버에 요청 후 자기 자신을 이동시킴
[ClientRpc]
public void RpcMove(Vector3 moveVector)
{
this.MoveVector = moveVector;
transform.position += moveVector;
base.SetDirtyBit(1);
this.MoveVector = Vector3.zero;
}
ClientRpc 함수는 위와 같이 속성과 Rpc를 함수 이름으로 가져야 함
NetowrkBehaviour를 상속시켜 정의한 클래스는 SyncVal 속성 추가가 불가능하다