//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); }
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++; }
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; } }
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); } }