// UDP 데이터 수신하는 함수 private void ReceiveData() { byte[] data = new byte[1400]; // 데이터 수신 int recvSize = transportUDP.Receive(ref data, data.Length); //int recvSize = transportTCP.Receive(ref data, data.Length); if (recvSize <= 0) { // 데이터를 수신한게 없음. return; } string str = System.Text.Encoding.UTF8.GetString(data); if (str == "request connection.") { // 접속 요청 패킷이므로 아무 처리 않음 return; } ReceivePacket(data); }
private void ParseOpponentMsg() { // 명시적 버퍼 사이즈 byte[] buffer = new byte[1024]; int recvSize = transport.Receive(ref buffer, buffer.Length); // 아직 '전부' 수신되지 않았음. if (recvSize < 0) { return; } string msg = System.Text.Encoding.UTF8.GetString(buffer); string[] pos = msg.Split(';'); Vector3 targetPos = new Vector3(float.Parse(pos[1]), float.Parse(pos[2]), float.Parse(pos[3])); if (pos[0] == "Attack") { RecvAttackMsg(targetPos); } else if (pos[0] == "Moving") { RecvMovingMsg(targetPos); } }
// Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { Vector3 targetPos = Vector3.zero; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 10000f)) { targetPos = hit.point; } // 좌표를 상대에게 전달. //byte[] buffer = V3ToStr(targetPos); //byte[] buffer = System.Text.Encoding.UTF8.GetBytes(data); // 송신 엔드포인트 //Debug.Log(targetPos + " " + buffer.Length); /* * byte[] buffer = new byte[3]; * buffer[0] = (byte)((int)targetPos.x); * buffer[1] = (byte)((int)targetPos.y); * buffer[2] = (byte)((int)targetPos.z); */ byte[] buffer = System.Text.Encoding.UTF8.GetBytes(targetPos.x.ToString() + ';' + targetPos.y.ToString() + ';' + targetPos.z.ToString()); socket.Send(buffer, buffer.Length); if (myMove != null) { StopCoroutine(myMove); } // 위치를 얻었으므로 행동 시작. 프로토타입에서는 '이동' 행동 myMove = StartCoroutine(Move(targetPos, player)); } if (true) { // 명시적 버퍼 사이즈 byte[] buffer = new byte[1024]; int recvSize = socket.Receive(ref buffer, buffer.Length); // 아직 '전부' 수신되지 않았음. if (recvSize <= 0) { return; } string msg = System.Text.Encoding.UTF8.GetString(buffer); string[] pos = msg.Split(';'); // 수신 정보를 위치로 변환 //Vector3 targetPos = StrToV3(buffer); Vector3 targetPos = new Vector3(float.Parse(pos[0]), float.Parse(pos[1]), float.Parse(pos[2])); print(targetPos); if (oppMove != null) { StopCoroutine(oppMove); } // 위치를 얻었으므로 행동 시작. 프로토타입에서는 '이동' 행동 oppMove = StartCoroutine(Move(targetPos, opponent)); } }
// 수신. public void ReceiveInputData() { byte[] data = new byte[1400]; // 데이터를 송신합니다. int recvSize = m_transport.Receive(ref data, data.Length); if (recvSize < 0) { // 입력정보를 수신하지 않았으므로 다음 프레임을 처리할 수 없습니다. return; } string str = System.Text.Encoding.UTF8.GetString(data); if (requestData.CompareTo(str.Trim('\0')) == 0) { // 접속 요청 패킷 . return; } // byte 배열을 구조체로 변환합니다. InputData inputData = new InputData(); InputSerializer serializer = new InputSerializer(); serializer.Deserialize(data, ref inputData); // 수신한 입력 정보를 설정합니다. //PlayerInfo info = PlayerInfo.GetInstance(); //int playerId = info.GetPlayerId(); int playerId = 0; int opponent = (playerId == 0) ? 1 : 0; for (int i = 0; i < inputData.count; ++i) { int frame = inputData.datum[i].frame; //Debug.Log("Set inputdata"+i+"[" + recvFrame + "][" + frame + "]:" + (recvFrame + 1 == frame)); if (recvFrame + 1 == frame) { mouseInputBuffer[opponent].Add(inputData.datum[i]); ++recvFrame; } } //Debug.Log("recvFrame:" + recvFrame); // 접속 종료 플래그를 감시. bit1:접속 종료 응답, bit0: 접속 종료 요구. if ((inputData.flag & 0x03) == 0x03) { // 접속 종료 플래그 수신. suspendSync = 0x03; Debug.Log("Receive SuspendSync."); } if ((inputData.flag & 1) > 0 && (suspendSync & 1) > 0) { suspendSync |= 0x02; Debug.Log("Receive SuspendSync." + inputData.flag); } if (isConnected && suspendSync == 0x03) { // 서로 접속 종료 상태가 되었으므로 상대에게의 접속 종료 플래그를 보내기위한. // 유예기간을 두고 조금 후에 접속종료합니다. ++disconnectCount; if (disconnectCount > 10) { m_transport.Disconnect(); Debug.Log("Disconnect because of suspendSync."); } } // 상태 갱신. if (syncState == SyncState.NotStarted) { syncState = SyncState.WaitSynchronize; } //loopCounter = 0; }