void Start() { nm = GameObject.Find("NetManager").GetComponent <NetManager>(); NetManager.plane_operate += PlaneOperate; NetManager.plane_destroy += PlaneDestroyFunc1; ++plane_count; speed = 6; PlaneOperateRequest msg1 = new PlaneOperateRequest(); msg1.X = players[plane_index].transform.position.x; msg1.Y = players[plane_index].transform.position.y; msg1.Z = players[plane_index].transform.position.z; msg1.UserId = nm.user_id; msg1.IndexId = plane_index; Request msg2 = new Request(); msg2.PlaneOperate = msg1; Message msg3 = new Message(); msg3.Userid = nm.user_id; msg3.Request = msg2; msg3.MsgType = ProtoMsg.MSG.PlaneOperateRequest; nm.write_data_queue.Enqueue(ProtoMsg.Util.SerializeToByte(msg3)); }
void Update() { Debug.Log(nm.user_index[nm.user_id] + " " + plane_index); if (nm.user_index[nm.user_id] == plane_index) { // local operate hor_last_move = hor_move; ver_last_move = ver_move; fire_last_ope = fire_ope; hor_move = 0; hor_move += Input.GetKey(KeyCode.D) ? 1 : 0; hor_move += Input.GetKey(KeyCode.A) ? -1 : 0; ver_move = 0; ver_move += Input.GetKey(KeyCode.W) ? 1 : 0; ver_move += Input.GetKey(KeyCode.S) ? -1 : 0; fire_ope = 0; if (Input.GetButton("Fire1") && Time.time > nextFire) { fire_ope = 1; nextFire = Time.time + fireRate; } if (hor_last_move != hor_move || ver_last_move != ver_move || fire_last_ope != fire_ope) { // send to server PlaneOperateRequest msg1 = new PlaneOperateRequest(); msg1.Horizontal = hor_move; msg1.Vertical = ver_move; msg1.X = players[plane_index].transform.position.x; msg1.Y = players[plane_index].transform.position.y; msg1.Z = players[plane_index].transform.position.z; msg1.UserId = nm.user_id; msg1.IndexId = plane_index; msg1.Fire = fire_ope; Request msg2 = new Request(); msg2.PlaneOperate = msg1; Message msg3 = new Message(); msg3.Userid = nm.user_id; msg3.Request = msg2; msg3.Sequence = ++nm.seq_id; msg3.TimestampMs = Utils.Time.GetTimeStampMs() + NetManager.timestamp_ms; msg3.MsgType = ProtoMsg.MSG.PlaneOperateRequest; nm.write_data_queue.Enqueue(ProtoMsg.Util.SerializeToByte(msg3)); Debug.Log("send move"); } } // get opeate from server while (nm.plane_operate_queue.Count > 0) { Byte[] bytes = (Byte[])nm.plane_operate_queue.Dequeue(); var msg = ProtoMsg.Util.ParseFromByte(bytes); moveHorizontal = msg.Response.PlaneOperate.Horizontal; moveVertical = msg.Response.PlaneOperate.Vertical; fire = msg.Response.PlaneOperate.Fire; server_plane_index = msg.Response.PlaneOperate.IndexId; timestamp_ms = msg.TimestampMs; x = msg.Response.PlaneOperate.X; y = msg.Response.PlaneOperate.Y; z = msg.Response.PlaneOperate.Z; break; } if (players[server_plane_index]) { if (timestamp_ms_last == 0) { timestamp_ms_last = timestamp_ms; } if (fire == 1) { fire = 0; if (shotSpawn) { Instantiate(shot, players[server_plane_index].transform.position, shotSpawn.rotation); players[server_plane_index].GetComponent <AudioSource>().Play(); } } Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); // 校准位置 players[server_plane_index].transform.position = Vector3.MoveTowards(players[server_plane_index].transform.position, new Vector3(x, y, z), 1.0f * Time.deltaTime); // 移动 players[server_plane_index].GetComponent <Rigidbody>().velocity = movement * speed; // players[server_plane_index].transform.Translate(movement * speed * Time.deltaTime * 1.0f); players[server_plane_index].GetComponent <Rigidbody>().position = new Vector3 ( Mathf.Clamp(players[server_plane_index].GetComponent <Rigidbody>().position.x, boundary.xMin, boundary.xMax), 0.0f, Mathf.Clamp(players[server_plane_index].GetComponent <Rigidbody>().position.z, boundary.zMin, boundary.zMax) ); players[server_plane_index].GetComponent <Rigidbody>().rotation = Quaternion.Euler(0.0f, 0.0f, players[server_plane_index].GetComponent <Rigidbody>().velocity.x * -tilt); } }