Exemple #1
0
    // 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);
        }
    }
Exemple #3
0
    // 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;
	}