Tanks, Multiplayer with PUN! (Part 4)
이번 편에서는 PUN 중의 MasterClient/Client가 어떻게 Photon Cloud와 연결되는지와 플레이어 캐릭터의 생성 구축(Spawn Tank)에 관해 설명하도록 하겠습니다.
프로그램이 연결을 개시할 때의 주의사항
PUN(Client)과 Photon Cloud의 내부 연결 단계
위의 그림처럼 PhotonNetwork를 사용해 Photon Cloud/Server에 연결할 때, PUN 로우레벨이 일부 초기화 동작을 할 수 있기 때문에 우리는 최소한 MasterServer에 이미 확정적으로 연결될 때까지 기다린 후에야 Join Room 하거나 또는 다른 네트워크 후속 동작을 할 수 있습니다. 그렇지 않을 경우 PUN에 연결할 수 없다거나 게임 룸에 참여할 수 없는 현상이 발생할 수 없습니다.
따라서 OnConnectedToMaster를 반드시 오버라이트한 후 다시 Join Room Button의 UI가 표시되게 하고, 사용자가 클릭할 때까지 기다린 후 Join Room의 동작을 실행해야 합니다.
public override void OnConnectedToMaster ()
{
// MasterServer와 연결 후, Button (UI) 이 생기면 그외 다른 액션도 실행할 수 있습니다.
Debug.Log("Master Server에 연결되었습니다");
}
// 게임 씬이 로딩될때 작동한다
void OnLevelWasLoaded(int levelNumber)
{
if (!PhotonNetwork.inRoom) return;
Debug.Log("게임 씬 로딩 완료/룸에 입장하였습니다");
}
실행 후 출력 단계는 아래 화면과 같습니다.
※파란 하이라이트가 "Master Server에 연결되었습니다"입니다.
Master Server와 연결해야 GameRoom에 진입할 수 있습니다.
Game Scene
이어서 GameManager.cs의 SpawnAllTanks를 찾는데, 이것은 플레이어 캐릭터(Tank)의 부분을 생성합니다. 우리는 그 중 콘솔 버전 Instantiate를 PhotonNetwork.Instantiate 네트워크 버전으로 치환합니다. 이러한 PhotonNetwork만이 각 Client의 게임 장면에서 생성된 모든 게임 오브젝트(GameObject)를 볼 수 있습니다.
// SpawnAllTanks는 편집하지 않고 그냥 둡니다
private void SpawnAllTanks()
{
// For all the tanks...
for (int i = 0; i < m_Tanks.Length; i++)
{
m_Tanks[i].m_Instance = Instantiate(m_TankPrefab, m_Tanks[i].m_SpawnPoint.position, m_Tanks[i].m_SpawnPoint.rotation) as GameObject;
m_Tanks[i].m_PlayerNumber = i + 1;
m_Tanks[i].Setup();
}
}
구축한 Tank를 SpawnMasterTank, SpawnTank2와 같이 먼저 분해한 후 분류를 생성합니다.
// create one Tank, set its player number and references needed for control.
private void SpawnMasterTank()
{
int i = 0;
GameObject tank = PhotonNetwork.Instantiate(
"CompleteTank",
m_Tanks[i].m_SpawnPoint.position,
m_Tanks[i].m_SpawnPoint.rotation,
0) as GameObject;
tank.name = "MasterTank";
m_Tanks[i].m_Instance = tank;
m_Tanks[i].m_PlayerNumber = i+1;
m_Tanks[i].Setup();
Debug.Log("SpawnMasterTank");
}
private void SpawnTank2()
{
int i = 1;
GameObject tank = PhotonNetwork.Instantiate(
"CompleteTank",
m_Tanks[i].m_SpawnPoint.position,
m_Tanks[i].m_SpawnPoint.rotation,
0) as GameObject;
tank.name = "Tank2";
m_Tanks[i].m_Instance = tank;
m_Tanks[i].m_PlayerNumber = i+1;
m_Tanks[i].Setup();
Debug.Log("SpawnTank2");
}
그렇습니다, GameManager.cs 내의 Start()도 함께 변동해야 하는데, 방금 분해해서 구축한 탱크의 function을 초기화합니다. 프로그래밍 코드는 다음과 같습니다.
private void Start()
{
// Create the delays so they only have to be made once.
m_StartWait = new WaitForSeconds(m_StartDelay);
m_EndWait = new WaitForSeconds(m_EndDelay);
if (!PhotonNetwork.inRoom)
return;
if( PhotonNetwork.isMasterClient ) {
SpawnMasterTank();
} else {
SpawnTank2();
Invoke("EnterGameLoop", 3);
}
}
Run & Play !
그러면 이제, Unity의 PlayMode를 사용해 실행해 보세요~ 하나의 Client는 Build & Run을 이용해 실행 효과를 볼 수 있습니다.
Unity의 Play Mode 효과(MasterClient)
상기 화면에서 게임 장면 내의 캐릭터가 이미 움직일 수 있는 것을 보실 수 있는데요. 아마도 별 것 아니라고, 콘솔 기기에서의 Local Network는 원래 이런 것 아니냐고 생각하는 분도 계실것 같습니다.
Mac OS 실행 화면(다른 Client)
실제, Unity의 Play Mode 또는 위와 같은 화면(Mac의 Client에서 사용)을 불문하고, 그 내부의 정보 메시지 전송은 이미 Photon Cloud의 접속 매커니즘을 사용해 서비스됩니다. 다시 말해 우리는 단순히 집이나 사무실이 아닌, 전 세계인들과 Local Wifi를 사용해 이 작은 게임을 함께 즐길 수 있습니다. 👾🎮
자, 이게 바로 멀티플레이어 실시간 온라인 게임입니다. 간단하죠?!
미래는 당신의 손안에 있습니다.
머리속에서 상상하던 게임을 지금 당장 만들어 보세요~
기대하겠습니다!
댓글
댓글 0개
댓글을 남기려면 로그인하세요.