/// <summary> /// 读取包头 /// </summary> /// <param name="header"></param> /// <returns></returns> void HandleReadHeader(PacketStream ps, object obj) { UInt16 thisTag = 0; lock (_recvTagGuard) { thisTag = _recvTag; } PacketHeader header = PacketSerializer.ReadHeader(ps, thisTag); if (header.Valid) { var size = (Int32)(header.TotalSize - PacketHeader.HeaderSize); // 还有包体 if (size > 0) { ReadPacket(new PacketStream(size, HandleReadBody, header)); } else { PostPacket(header, null); // 包体没有, 继续读下一个包 ReadHeader(); } } else { PostError(SessionEvent.RecvError, new Exception("packet crack")); Close(); } }
protected bool ReadStateUpdatePacket(byte[] packetData, ref byte isAvatar, ref int objNum, ref bool shotLight, ref int potionNum, ref bool hasParent, ref State cubeState) { readStream.Start(packetData); bool result = true; try { packetSerializer.ReadHeader(readStream, ref isAvatar, ref objNum, ref shotLight, ref potionNum, ref hasParent, ref cubeState); } catch (Network.SerializeException) { Debug.Log("error: failed to read state update packet"); result = false; } readStream.Finish(); return(result); }
// Update is called once per frame void FixedUpdate() { Packet packet; while ((packet = Net.ReadPacket()) != null) { packet.ReadBytes(readBuffer); readStream.Start(readBuffer); serializer.ReadHeader(readStream, ref isAvatar, ref objNum, ref shotLight, ref potionNum, ref hasParent, ref cubeState); updated = null; if (isAvatar != 00000001) { switch (objNum) { case 0: updated = GameObject.Find("Grappling Gun(Clone)"); if (updated == null) { updated = GameObject.Find("Grappling Gun"); } break; case 1: updated = GameObject.Find("Drone"); if (updated == null) { updated = GameObject.Find("Drone(Clone)"); } break; case 2: updated = GameObject.Find("Map"); if (updated == null) { updated = GameObject.Find("Map(Clone)"); } break; case 3: var potions = GameObject.FindGameObjectsWithTag("Potion"); var poops = GameObject.FindGameObjectsWithTag("PoopPot"); foreach (GameObject potion in potions) { if (potion.GetComponent <PourLiquid>().potionNum == potionNum) { //Debug.Log("Found health"); updated = potion; } } foreach (GameObject poop in poops) { if (poop.GetComponent <pourpooppotion>().potionNum == potionNum) { //Debug.Log("Found poop"); updated = poop; } } if (updated == null) { //I am using shotLight for poop vs health potions along with fired and light. //true => poop Debug.Log(potionNum); Debug.Log("Potion should spawn in!"); if (shotLight == true) { var potion = (GameObject)Instantiate(Resources.Load("PoopPotion")); Debug.Log("Poop potion spawned in"); potion.GetComponent <pourpooppotion>().potionNum = potionNum; Debug.Log(potion.GetComponent <pourpooppotion>().potionNum + " is the newly spawned num"); potion.transform.position = new Vector3(cubeState.position_x, cubeState.position_y / Constants.UnitsPerMeter, cubeState.position_z / Constants.UnitsPerMeter); updated = potion; var blues = GameObject.FindGameObjectsWithTag("Blue"); float current = 1000; GameObject saved = new GameObject(); foreach (GameObject flower in blues) { if (Vector3.Distance(new Vector3(cubeState.position_x / Constants.UnitsPerMeter, cubeState.position_y / Constants.UnitsPerMeter, cubeState.position_z / Constants.UnitsPerMeter), flower.transform.position) < current) { current = Vector3.Distance(new Vector3(cubeState.position_x / Constants.UnitsPerMeter, cubeState.position_y / Constants.UnitsPerMeter, cubeState.position_z / Constants.UnitsPerMeter), flower.transform.position); saved = flower; } } GameObject.Destroy(saved); } else { var potion = (GameObject)Instantiate(Resources.Load("HealthPotion")); potion.GetComponent <PourLiquid>().potionNum = potionNum; potion.transform.position = new Vector3(cubeState.position_x / Constants.UnitsPerMeter, cubeState.position_y / Constants.UnitsPerMeter, cubeState.position_z / Constants.UnitsPerMeter); updated = potion; var reds = GameObject.FindGameObjectsWithTag("Red"); float current = 1000; GameObject saved = new GameObject(); foreach (GameObject flower in reds) { if (Vector3.Distance(new Vector3(cubeState.position_x / Constants.UnitsPerMeter, cubeState.position_y / Constants.UnitsPerMeter, cubeState.position_z / Constants.UnitsPerMeter), flower.transform.position / Constants.UnitsPerMeter) < current) { current = Vector3.Distance(new Vector3(cubeState.position_x / Constants.UnitsPerMeter, cubeState.position_y / Constants.UnitsPerMeter, cubeState.position_z / Constants.UnitsPerMeter), flower.transform.position); Debug.Log("New Distance:" + current); saved = flower; } } GameObject.Destroy(saved); } } else { } break; default: break; } if (objNum == 0) { var shot = updated.GetComponent <GrapplingHook>(); if (shotLight && updated.transform.parent == null) { shot.fired = true; } else { } } else if (objNum == 1) { var light = updated.GetComponent <DroneFly>(); if (shotLight) { light.isRemote = true; } else { light.isRemote = false; } } var obj = updated.GetComponent <NetworkObject>(); if (hasParent) { counter = counter + 1; if (objNum == 3) { } } //if item already has parent, disengage from hand if (hasParent && (updated.transform.parent != null && counter > 60)) { updated.transform.parent = null; var hand = GameObject.Find("Player/OVRCameraRig/TrackingSpace/RightHandAnchor"); var grabber = hand.GetComponent <Grabber>(); grabber.grabbedObject = null; grabber.grabbed = false; counter = 0; Debug.Log("Detaching!"); } obj.ProcessPacket(readBuffer); } else { var playerController = gameObject.GetComponent <PlayerController>(); var p2pManager = playerController.p2pManager; p2pManager.GetRemotePackets(packet); } } }