/// <summary> /// Socket发送坐标 /// </summary> void SendPlayerWorldMessage() { //组成新的结构体对象,包括主角坐标旋转等。 Vector3 PlayerTransform = transform.localPosition; Vector3 PlayerRotation = transform.localRotation.eulerAngles; //用short的话是2字节,为了节省包的长度。这里乘以100 避免使用float 4字节。当服务器接受到的时候小数点向前移动两位就是真实的float数据 short px = (short)(PlayerTransform.x * 100); short py = (short)(PlayerTransform.y * 100); short pz = (short)(PlayerTransform.z * 100); short rx = (short)(PlayerRotation.x * 100); short ry = (short)(PlayerRotation.y * 100); short rz = (short)(PlayerRotation.z * 100); byte equipID = 1; byte animationID = 9; byte hp = 2; JFPackage.WorldPackage wordPackage = new JFPackage.WorldPackage(px, py, pz, rx, ry, rz, equipID, animationID, hp); //通过Socket发送结构体对象 mJFsorket.SendMessage(wordPackage); }
private void SplitPackage(byte[] bytes, int index) { //在这里进行拆包,因为一次返回的数据包的数量是不定的 //所以需要给数据包进行查分。 while (true) { //包头是2个字节 byte[] head = new byte[2]; int headLengthIndex = index + 2; //把数据包的前两个字节拷贝出来 Array.Copy(bytes, index, head, 0, 2); //计算包头的长度 short length = BitConverter.ToInt16(head, 0); //当包头的长度大于0 那么需要依次把相同长度的byte数组拷贝出来 if (length > 0) { byte[] data = new byte[length]; //拷贝出这个包的全部字节数 Array.Copy(bytes, headLengthIndex, data, 0, length); //把数据包中的字节数组强制转换成数据包的结构体 //BytesToStruct()方法就是用来转换的 //这里需要和你们的服务端程序商量, JFPackage.WorldPackage wp = new JFPackage.WorldPackage(); wp = (JFPackage.WorldPackage)BytesToStruct(data, wp.GetType()); //把每个包的结构体对象添加至链表中。 worldpackage.Add(wp); //将索引指向下一个包的包头 index = headLengthIndex + length; } else { //如果包头为0表示没有包了,那么跳出循环 break; } } }