당신이 주로 하는 게임을 돌아본다면 아마 절반정도는 멀티게임을 하고 있을 것이다.
꼭 멀티가 아니더라도 랭킹과 같은 시스템에서 다른 플레이어와 같은 요소를 공유한다.
따라서 이번 글에서는 유니티에서 멀티를 구현하는 방법에 대해 알아보겠다.
먼저, 멀티를 구현하기 위해서는 가장 기본적으로 "서버"가 필요하다.
하지만 서버는 구축, 유지에 개인이 감당할 수 없는 돈이 들기에 우리는 보통
서버를 빌려주는 사업을 하는 여러 플랫폼을 이용한다.
여기서 가장 대표적인 "플랫폼"은 Photon Engine이다.
특히 PUN이라고 해서 (Photon Unity Networking) Unity는 따로 관리를 할 수 있다.
위의 링크를 통해서 구매할 수 있다. 무료버전과 유료버전이 있는 데 사용하는 데는 무료버전도 괜찮다.
유료버전은 100 CCU로 제한이 늘어난다. 최대 100명까지 입장할 수 있다는 뜻이다.
기본 버전은 제한이 20명인데, 멀티게임을 플레이 스토어등 어딘가에 출시할 예정이라면 유료버전을 추천한다.
1. 세팅
먼저 에셋 스토어에서 PUN 2나 PUN 2+를 다운로드하여 주고,
유니티에 들어와 준다. 그 후 [Window] -> [Package Manager]로 들어가 준다.
그 후 Packages: My Assets로 바꿔주면 구매한 에셋들이 표시된다.
그중 Photon PUN 2 (+)를 찾아서 클릭해 주고, Download 버튼을 눌러주자.
그럼 Import 버튼과 Re-Download 버튼으로 나눠지게 되는데, Import를 눌러서
프로젝트 파일에 추가해 주면 패키지 설치는 완료된다.
그럼 PUN Setup이라는 창이 나온다. 이건 기본 세팅을 하는 창이다.
여기에 AppID를 넣어주면 되는데, 이건 아래의 사이트로 가서 발급하면 된다.
https://dashboard.photonengine.com/ko-kr
회원가입 후 로그인 해주자.
그리고 이 버튼을 눌러주자. (새 애플리케이션 만들기)
그럼 이렇게 멀티 프로젝트의 세팅 화면이 뜰 것이다.
Photon 종류는 PUN으로 해주자. Photon Unity Networking의 약자로, 유니티에 최적화되어 있다.
나머지는 각자 알아서 프로젝트 이름과 설명을 적어주면 되고,
URL에는 지금 하고 있는 프로젝트의 홈페이지를 넣으면 된다. (없으면 안 넣어도 됨)
그럼 DashBoard에 이렇게 새로운 칸이 만들어질 것이다.
위에서 나온 AppID는 여기서 나오는 "애플리케이션 ID"를 말한다.
위의 사진에선 가려놨지만 클릭해서 복사해 주자.
복사를 완료했으면 다시 유니티로 돌아와서 AppID에 복사해 둔 ID를 넣어주자.
그 후 활성화된 "Setup Project" 버튼을 눌러주고, 기다려주면 세팅은 끝이다.
2. 사용법.
사용법을 알기 위해서는 기본적으로 포톤의 룰을 알아야 한다.
포톤에는 "로비"와 "룸"이 존재한다. 모든 사용자는 포톤엔진에 접속하며
로비에 들어가게 된다. 그 후에 룸에 입장한 플레이어들끼리 통신하는 방식이다.
따라서 가장 기본적으로 로비에 입장하고, 룸에 입장하는 코드를 작성해야 한다.
private void Start() {
PhotonNetwork.ConnectUsingSettings();
}
먼저, 포톤엔진에 접속을 해야 하는데, 이 과정에서는 위의 코드를 Start나 Awake에 넣어 사용한다.
이건 그냥 공식처럼 외워줬으면 좋겠다.
public override void OnJoinedLobby()
{
Debug.Log("Successfully joined the lobby.");
RoomOptions rm = new RoomOptions();
rm.MaxPlayers = 2;
PhotonNetwork.JoinOrCreateRoom("MyRoom", rm, TypedLobby.Default);
}
그 후 로비에 자동으로 입장되는데, 그때 실행되는 함수가 존재한다. (거의 모든 상황에 존재함)
OnJoinedLobby()가 그에 대응되는 함수이다. 로비에 입장하면, 함수 안의 코드에 따라서
콘솔에 "Successfully joined the lobby", 즉 로비에 성공적으로 입장했다고 표시된다.
로비에 들어온 것이 확인되었으니 이제 룸에 접속을 시도해야 한다.
룸에 접속하기 위해서는 룸을 만들어야 한다.
PhotonNetwork.CreateRoom("RoomName", roomOptions, TypedLobby.Default); //생성.
PhotonNetwork.JoinRoom("RoomName"); //접속 시도
룸을 만들 때는 룸의 이름, 룸의 옵션, 룸의 타입을 정해서 생성할 수 있다.
룸이 여러 개 생성될 때는 이름을 다 다르게 해야 하고,
룸의 옵션은 OnJoinedLobby의 예시처럼 만들면 된다.
룸의 타입은 그냥 TypedLobby. 찍고 자동완성 중에 고르면 된다.
이걸 합친 게 JoinOrCreateRoom이다.
방이 존재하면 Join으로, 방이 존재하지 않으면 Create를 해준다.
2명이서 무언가 코드를 치고 들어가는 멀티 게임에서 유용할 것이다.
룸에 들어왔으면 이제 동기화를 해주면 끝이다. 동기화하고 싶은 오브젝트에
PhotonView, PhotonTransformView를 붙이면 위치, 회전, 크기 등을 동기화할 수 있고,
Photon----View를 선택하면 ----의 능력을 동기화한다. (Observed Components에 등록됨 = 동기화)
추가로 Observable Search를 바꾸면 직접 지정할 수 있는데, 오브젝트와 컴포넌트도 등록이 가능해진다.
(Synchronization을 바꾸면 OnPhotonSerializeView가 실행되는 주기가 바뀜)
변수를 동기화하고 싶다면, 메인에서 보내고 클라이언트에서 받으면 된다.
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.IsWriting)
{
// 데이터를 보내는 쪽일 경우, 체력 정보를 보냅니다.
stream.SendNext(msg);
}
else
{
// 데이터를 받는 쪽일 경우, 체력 정보를 받습니다.
msg = stream.ReceiveNext().ToString();
}
}
msg가 메시지라는 뜻일 때 2인용 채팅을 구현하기 위해 이렇게 표현했다.
근데 이러면 마스터(룸의 주인) 쪽에서만 메시지를 보낼 수 있다는 문제점이 발생한다.
[PunRPC]
void SetMsg(string newMsg)
{
msg = newMsg;
}
public void OnSendBtnClicked() {
msg = input.text;
photon.RPC("SetMsg", RpcTarget.All, msg);
}
그래서 RPC를 활용해서 구현해 주어 문제를 해결했다.
RPC는 구체적으로 이해해야 하는 개념이긴 하나 간단하게 소개하면
모든 클라이언트에서 동시에 실행하도록 마스터가 명령을 내리는 것이다.
따라서 버튼을 누르면 SetMsg함수가 RPC로 실행되고,
그럼 모든 클라이언트는 newMsg를 msg의 값으로 저장한다.
근데 newMsg가 RPC를 보낸 유저의 msg값이니까
결과적으로 버튼을 누르면 모두 동기화가 되는 셈인 것이다.
이걸 이해하는 게 좋다고 생각함으로 유튜브에서 강의를 보길 바란다.
RPC라고 검색하면 눈에 띄는 강의가 하나 있을 것이다.
여기까지 포톤엔진의 설치, 세팅, 작동 원리와 사용 방법까지 알아봤다.
글이 너무 길어진 감이 있는 것 같긴 한데 하나하나 볼 사람이 있을 것이라 생각한다.
나는 구글링 했을 때 이런 글이 안 나와서 공부하기 어려웠는데, 누군가에게 도움이 되길 바란다.
이상으로 도움이 되었길 바라며,
끝.
+)
이 글은 제가 실제로 사용해 본 제품에 대한 솔직한 이야기입니다. 저는 이 제품을 유니티로부터 지원받아 이 글을 작성하게 되었고 링크를 통해 구매하시는 경우, 저에게는 소정의 커미션이 지급됩니다. 하지만, 이로 인해 저의 평가가 편향되지 않았음을 명확히 말씀드리고 싶습니다. 돈도 물론 중요하지만 진실한 글임을 인정받을 때 돈도 따라온다고 생각하기 때문입니다. 이 글의 목적은 전적으로 여러분들의 고민을 돕는 것이며 "광고"로만 보지 않아 주셨으면 합니다. 감사합니다.
(커미션 진짜 얼마 안 됩니다... ㅠㅠ)
'게임 개발 > 서버-통신' 카테고리의 다른 글
유니티 채팅 기능 만드는법. (0) | 2022.09.01 |
---|---|
유니티) Photon Engine 포톤엔진 설치방법. (0) | 2022.08.29 |
게임 서버의 종류 정리 (0) | 2022.08.21 |
댓글