==================================================================
모든 출처는
- 유니티 개발자를 위한 C#으로 온라인 게임 서버 만들기 - 저자 이석현, 출판사 한빛미디어
그리고 URL :
http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture_series&no=79
==================================================================
패킷 수신
ENTER_GAME_ROOM_REQ 패킷을 서버에 요청ㅇ한 뒤에는 서버로부터 응답이 오기만을 기다리면 됩니다.
세균전 게임은 1:1로 진행되는 게임이기 때문에 내가 게임 방 입장을 요청했다고 바로 게임을 할 수 있는 것이 아닙니다.
상대방 누군가가 나와 똑같은 패킷을 요청하여 서로 매칭이 이루어져야 비로소 게임을 시작할 수 있는 것이죠.
서버측 소스 코드를 작성할 때 ENTER_GAME_ROOM_REQ 패킷을 핸들링하여 게임 방을 생성하고 클라이언트에게
응답을 보내주던 부분이 기억 나시는지요?
최소한 두 명의 클라이언트가 ENTER_GAME_ROOM_REQ 패킷을 요청하면
서버는 매칭을 성사시키고 두 명의 클라이언트에게 각각 START_LOADING 패킷을 전달합니다.
그렇다면 START_LOADING 패킷을 수신하는 코드가 클라이언트에 존재해야겠죠.
서버로부터 이 패킷을 전달 받았다면 매칭이 성사된 것으로 생각하고 게임 방에 입장하도록 처리해봅시다.
CMainTitle.cs 스크립트의 on_recv 메소드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /// <summary> /// 패킷을 수신 했을 때 호출됨. /// </summary> /// <param name="msg"></param> public void on_recv(CPacket msg) { // 제일 먼저 프로토콜 아이디를 꺼내온다. PROTOCOL protocol_id = (PROTOCOL)msg.pop_protocol_id(); switch(protocol_id) { case PROTOCOL.START_LOADING: { byte player_index = msg.pop_byte(); Debug.Log(player_index); this.battle_room.gameObject.SetActive(true); this.battle_room.start_loading(); gameObject.SetActive(false); } break; } } | cs |
1 2 3 | CPacket msg = CPacket.create((Int16)PROTOCOL.START_LOADING); msg.push(player.player_index); // 본인의 플레이어 인덱스를 알려준다. player.send(msg); | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 | CNetworkManager network_manager; bool is_connected = false; void Start() { this.user_state = USER_STATE.NOT_CONNECTED; this.bg = Resources.Load("images/title_blue") as Texture; this.battle_room = GameObject.Find("BattleRoom").GetComponent<CBattleRoom>(); this.battle_room.gameObject.SetActive(false); this.network_manager = GameObject.Find("NetworkManager").GetComponent<CNetworkManager>(); this.network_manager.message_receiver = this; } | cs |
1 2 | this.network_manager = GameObject.Find("NetworkManager").GetComponent<CNetworkManager>(); this.network_manager.message_receiver = this; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | using UnityEngine; using System.Collections; using System.Collections.Generic; using FreeNet; using VirusWarGameServer; public class CMainTitle : MonoBehaviour { Texture bg; CBattleRoom battle_room; CNetworkManager network_manager; bool is_connected; void Start() { this.is_connected = false; this.bg = Resources.Load("images/title_blue") as Texture; this.battle_room = GameObject.Find("BattleRoom").GetComponent<CBattleRoom>(); this.battle_room.gameObject.SetActive(false); this.network_manager = GameObject.Find("NetworkManager").GetComponent<CNetworkManager>(); this.network_manager.message_receiver = this; } /// <summary> /// 서버에 접속된 이후에 처리할 루프 /// 마우스 입력이 들어오면 ENTER_GAME_ROOM_REQ 프로토콜을 요청하고 /// 중복 요청을 방지하기 위해서 현재 코루틴을 중지시킨다. /// </summary> /// <returns></returns> IEnumerator after_connected() { while (true) { if (this.is_connected) { if (Input.GetMouseButtonDown(0)) { CPacket msg = CPacket.create((short)PROTOCOL.ENTER_GAME_ROOM_REQ); this.network_manager.send(msg); StopCoroutine("after_connected"); } } yield return 0; } } void OnGUI() { if (this.is_connected) { GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), this.bg); } } /// <summary> /// 서버에 접속이 완료되면 호출됨 /// </summary> public void on_connected() { this.is_connected = true; StartCoroutine("after_connected"); } /// <summary> /// 패킷을 수신 했을 때 호출됨. /// </summary> /// <param name="msg"></param> public void on_recv(CPacket msg) { // 제일 먼저 프로토콜 아이디를 꺼내온다. PROTOCOL protocol_id = (PROTOCOL)msg.pop_protocol_id(); switch(protocol_id) { case PROTOCOL.START_LOADING: { byte player_index = msg.pop_byte(); Debug.Log(player_index); this.battle_room.gameObject.SetActive(true); this.battle_room.start_loading(); gameObject.SetActive(false); } break; } } } | cs |
'- Programming > - C#' 카테고리의 다른 글
★ 13. c# 네트워크 개발 p12 (0) | 2017.02.16 |
---|---|
★ 12. c# 네트워크 개발 p11 (0) | 2017.02.16 |
★ 10. c# 네트워크 개발 p9 (0) | 2017.02.14 |
★ 9. c# 네트워크 개발 p8 (1) | 2017.02.13 |
★ 8. c# 네트워크 개발 p7 (0) | 2017.02.13 |