Beispiel #1
0
    //This hook method is automatically called when the server is instructed to spawn a player (and provided extra info)
    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId, NetworkReader extraMessageReader)
    {
        SpawnMessage msg = new SpawnMessage("", -1, 0);

        msg.Deserialize(extraMessageReader);
        ServerAddPlayer(conn, playerControllerId, msg.name, msg.team, msg.ship);
    }
Beispiel #2
0
    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId, NetworkReader extraMessageReader)
    {
        //캐릭터 타입 전달 위해 사용하는 메시지
        SpawnMessage message = new SpawnMessage();

        //Read를 위해 Deserialize
        message.Deserialize(extraMessageReader);

        //message 에서 실제 VrPlayer 인지 받음
        int character = message.CharacterType;

        //playerCount에 맞는 스폰포인트 지정
        Transform spawnPoint = this.startPositions[playerCount % 4];

        //새로운 플레이어 생성
        GameObject newPlayer;

        //VrPlayer인 경우와 아닌 경우

        newPlayer = (GameObject)Instantiate(Character[character], spawnPoint.position, spawnPoint.rotation);


        //새로 스폰된 플레이어를 모든 클라이언트에 알림
        NetworkServer.AddPlayerForConnection(conn, newPlayer, playerControllerId);

        //플레이어 카운트 추가
        playerCount++;
    }
Beispiel #3
0
    private void OnReceivedData(IAsyncResult result)
    {
        try
        {
            int    length = stream.EndRead(result);
            byte[] data   = new byte[length];

            Buffer.BlockCopy(asyncBuffer, 0, data, 0, length);

            if (length <= 0)
            {
                Debug.Log("Disconnected from server.");
                Application.Quit();
                return;
            }

            NetworkReader networkReader = new NetworkReader(data);

            byte[] readerMsgSizeData = networkReader.ReadBytes(2);
            short  readerMsgSize     = (short)((readerMsgSizeData[1] << 8) + readerMsgSizeData[0]);
            //Debug.Log(readerMsgSize);

            byte[] readerMsgTypeData = networkReader.ReadBytes(2);
            short  readerMsgType     = (short)((readerMsgTypeData[1] << 8) + readerMsgTypeData[0]);
            //Debug.Log(readerMsgType);

            if (readerMsgType == MRTMsgType.Spawn)
            {
                SpawnMessage msg = new SpawnMessage();
                msg.Deserialize(networkReader);

                //Debug.Log(msg.connectId);
                //Debug.Log(msg.prefabId);
                Debug.Log(msg.position.ToString("F4"));
                Debug.Log(msg.payload);

                spawnManager.Spawn(msg);
            }
            else if (readerMsgType == MRTMsgType.Text)
            {
                TextMessage msg = new TextMessage();
                msg.Deserialize(networkReader);

                Debug.Log(msg.payload);

                //debugLog.Log(msg.payload);
            }

            stream.BeginRead(asyncBuffer, 0, asyncBuffer.Length, OnReceivedData, null);
        }
        catch (Exception)
        {
            Debug.Log("Disconnected from server.");
            Application.Quit();
            return;
        }
    }
Beispiel #4
0
        public void SpawnMessageTest()
        {
            DoTest(0);
            DoTest(42);

            void DoTest(ulong testSceneId)
            {
                // try setting value with constructor
                SpawnMessage message = new SpawnMessage
                {
                    netId         = 42,
                    isLocalPlayer = true,
                    isOwner       = true,
                    sceneId       = testSceneId,
                    assetId       = Guid.NewGuid(),
                    position      = UnityEngine.Vector3.one,
                    rotation      = UnityEngine.Quaternion.identity,
                    scale         = UnityEngine.Vector3.one,
                    payload       = new ArraySegment <byte>(new byte[] { 0x01, 0x02 })
                };

                UnityEngine.Debug.Log($"sceneId:{message.sceneId} | assetId:{message.assetId}");

                // serialize
                NetworkWriter writer = new NetworkWriter();

                message.Serialize(writer);
                byte[] writerData = writer.ToArray();

                // deserialize the same data - do we get the same result?
                SpawnMessage fresh = new SpawnMessage();

                fresh.Deserialize(new NetworkReader(writerData));
                Assert.That(fresh.netId, Is.EqualTo(message.netId));
                Assert.That(fresh.isLocalPlayer, Is.EqualTo(message.isLocalPlayer));
                Assert.That(fresh.isOwner, Is.EqualTo(message.isOwner));
                Assert.That(fresh.sceneId, Is.EqualTo(message.sceneId));
                if (fresh.sceneId == 0)
                {
                    Assert.That(fresh.assetId, Is.EqualTo(message.assetId));
                }
                Assert.That(fresh.position, Is.EqualTo(message.position));
                Assert.That(fresh.rotation, Is.EqualTo(message.rotation));
                Assert.That(fresh.scale, Is.EqualTo(message.scale));
                Assert.That(fresh.payload.Count, Is.EqualTo(message.payload.Count));
                for (int i = 0; i < fresh.payload.Count; ++i)
                {
                    Assert.That(fresh.payload.Array[fresh.payload.Offset + i],
                                Is.EqualTo(message.payload.Array[message.payload.Offset + i]));
                }
            }
        }
    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId, NetworkReader extraMessageReader)
    {
        SpawnMessage message = new SpawnMessage();

        message.Deserialize(extraMessageReader);

        bool isVrPlayer = message.isVrPlayer;

        Transform spawnPoint = this.startPositions [playerCount];

        GameObject newPlayer;

        if (isVrPlayer)
        {
            newPlayer = (GameObject)Instantiate(this.vrPlayerPrefab, spawnPoint.position, spawnPoint.rotation);
        }
        else
        {
            newPlayer = (GameObject)Instantiate(this.playerPrefab, spawnPoint.position, spawnPoint.rotation);
        }
        NetworkServer.AddPlayerForConnection(conn, newPlayer, playerControllerId);
        playerCount++;
    }
    void Connect(NetworkIdentity player = null)
    {
        if (socket != null && socket.Connected)
        {
            Disconnect();
        }

        tcpClient = new TcpClient(ip, port);

        socket = tcpClient.Client;

        if (socket.Connected)
        {
            socket.Send(BitConverter.GetBytes(0), SocketFlags.None);

            byte[] buffer = new byte[sizeof(int)];
            Read(ref buffer);
            int length = BitConverter.ToInt32(buffer, 0);

            buffer = new byte[length];
            Read(ref buffer);

            if ((MessageId)buffer[0] == MessageId.Spawn)
            {
                SpawnMessage msg = new SpawnMessage();
                msg.Deserialize(ref buffer);
                clientId = msg.objectId;

                if (player != null)
                {
                    player.connectionToServer.Leave(player);

                    SceneManager.MoveGameObjectToScene(player.gameObject, gameObject.scene);
                    player.id      = msg.objectId;
                    player.spawned = true;

                    player.connectionToServer = this;

                    netComps.Add(msg.objectId, player);
                }
                else
                {
                    messageQueue.Enqueue(buffer);
                }
            }
            else
            {
                Debug.LogError("[" + sceneName + "] Failed to get client data");
                Disconnect();
                return;
            }

            Debug.Log("[" + sceneName + "] Client connected to " + ip + ":" + port + " with id: " + clientId + "!");
        }

        if (!socket.Connected)
        {
            Debug.LogWarning("[" + sceneName + "] Failed to connect " + ip + ":" + port + "!");
            gameObject.SetActive(false);
        }
        else
        {
            foreach (KeyValuePair <int, NetworkIdentity> netComp in netComps)
            {
                GameObject go = netComp.Value.gameObject;
                go.SendMessage("OnConnect", this, SendMessageOptions.DontRequireReceiver);
                go.SetActive(true);
            }

            StartCoroutine(MsgHandling());

            msgReceiveThread = new Thread(new ThreadStart(MsgThread));
            msgReceiveThread.Start();
        }
    }
    IEnumerator MsgHandling()
    {
        while (true)
        {
            if (messageQueue.Count <= 0)
            {
                yield return(null);

                continue;
            }

            byte[] buffer = messageQueue.Dequeue();

            if ((MessageId)buffer[0] == MessageId.Transform)
            {
                TransformMessage msg = new TransformMessage();
                msg.Deserialize(ref buffer);

                if (!netComps.ContainsKey(msg.sourceId))
                {
                    Debug.LogWarning("[" + sceneName + "] Object with netId " + msg.sourceId + " not found!");
                    continue;
                }

                NetworkIdentity netId = netComps[msg.sourceId];

                netId.SendMessage("ApplyTransform", msg, SendMessageOptions.DontRequireReceiver);
            }
            else if ((MessageId)buffer[0] == MessageId.Spawn)
            {
                SpawnMessage msg = new SpawnMessage();
                msg.Deserialize(ref buffer);

                if (netComps.ContainsKey(msg.objectId))
                {
                    continue;
                }

                GameObject spawned = Instantiate(spawnablePrefabs[msg.prefabId].gameObject, transform.position, transform.rotation);
                SceneManager.MoveGameObjectToScene(spawned, gameObject.scene);
                spawned.SetActive(msg.hasAuthority);

                NetworkIdentity netId = spawned.GetComponent <NetworkIdentity>();
                netComps.Add(msg.objectId, netId);

                netId.id                 = msg.objectId;
                netId.spawned            = true;
                netId.connectionToServer = this;
                netId.hasAuthority       = msg.hasAuthority;
            }
            else if ((MessageId)buffer[0] == MessageId.Despawn)
            {
                DespawnMessage msg = new DespawnMessage();
                msg.Deserialize(ref buffer);

                if (netComps.ContainsKey(msg.objectId))
                {
                    NetworkIdentity netComp = netComps[msg.objectId];
                    netComps.Remove(msg.objectId);

                    Destroy(netComp.gameObject);
                }
            }
            else if ((MessageId)buffer[0] == MessageId.Enable)
            {
                EnableMessage msg = new EnableMessage();
                msg.Deserialize(ref buffer);

                if (netComps.ContainsKey(msg.objectId))
                {
                    NetworkIdentity netComp = netComps[msg.objectId];

                    netComp.transform.position = new Vector3(msg.position[0], msg.position[1], msg.position[2]);
                    netComp.transform.rotation = new Quaternion(msg.rotation[0], msg.rotation[1], msg.rotation[2], msg.rotation[3]);

                    netComp.gameObject.SetActive(msg.toEnable);
                }
            }

            yield return(null);
        }
    }