2017-04-16 10 views
1

Ich erstelle ein Multiplayer-Spiele mit Raumschiffen, die Sie betreten können. Ich verwende Photon für Multiplayer.Mehrspieler-Rigidbody-Bewegung nicht synchronisiert (Photon)

Wie Sie auf dem Bild unten sehen können, habe ich in PhotonView Schiff Rigidbody, Transform und gleich auf Player.

Aber wenn ich das Schiff betrete, sieht die Sicht von einem anderen Spieler extrem lückig aus (wenn ich das Schiff schiebe, wird es normal synchronisiert). Hier ist eine video zeigt das Problem.

Mein Player ist über eine feste Verbindung mit dem Schiff verbunden.
Hier ist meine verkürzte Code:

void Update() 
{ 
    //Raycast to check for ship 
    if ((Physics.Raycast(look, out hit, 9f) && hit.collider.tag == "Ship") 
    { 
     //set variables 
     shipObj = hit.collider.gameObject.transform.parent.gameObject; 
     ship = shipObj.GetComponent<SmallShipController>(); 

     if (Input.GetKeyDown(KeyCode.R)) 
     { 
      //check if ship is driven 
      if (!ship.driven) 
      { 
       driving = true; 
       ship.ChangeDriven(); 
       transform.position = ship.driverSeat.transform.position; 
       transform.rotation = ship.driverSeat.transform.rotation; 
       playersCamera.transform.position = ship.thirdPersonPosition.position; 
       playersCamera.transform.rotation = ship.thirdPersonPosition.rotation; 
       rb.detectCollisions = false; 
       rb.mass = 0; 
       rb.drag = 0; 
       rb.angularDrag = 0; 
       photonView.RPC("SetJoint", PhotonTargets.AllBuffered, shipObj.GetPhotonView().viewID); 
      } 
     } 
     if (driving) 
     { 
      if (Input.GetKey(KeyCode.A)) 
      { 
       ship.rb.AddRelativeForce(Vector3.left * ship.moveSpeed * Time.deltaTime); 
      } 
      if (Input.GetKey(KeyCode.W)) 
      { 
       ship.rb.AddRelativeForce(Vector3.forward * ship.moveSpeed * Time.deltaTime); 
      } 
      if (Input.GetKey(KeyCode.D)) 
      { 
       ship.rb.AddRelativeForce(Vector3.right * ship.moveSpeed * Time.deltaTime); 
      } 
      if (Input.GetKey(KeyCode.S)) 
      { 
       ship.rb.AddRelativeForce(Vector3.back * ship.moveSpeed * Time.deltaTime); 
      } 
      if (Input.GetKey(KeyCode.Space)) 
      { 
       ship.rb.AddRelativeForce(Vector3.up * ship.moveSpeed * Time.deltaTime * 0.5f); 
      } 
      if (Input.GetKey(KeyCode.LeftShift)) 
      { 
       ship.rb.AddRelativeForce(Vector3.down * ship.moveSpeed * Time.deltaTime * 0.5f); 
      } 
      if (Input.GetKey(KeyCode.Q)) 
      { 
       ship.rb.AddRelativeTorque(new Vector3(0, 0, Time.deltaTime * ship.moveSpeed)); 
      } 
      if (Input.GetKey(KeyCode.E)) 
      { 
       ship.rb.AddRelativeTorque(new Vector3(0, 0, Time.deltaTime * -ship.moveSpeed)); 
      } 
      if (Input.GetAxisRaw("Mouse Y") > 0.5f || Input.GetAxisRaw("Mouse Y") < 0.5f || Input.GetAxisRaw("Mouse X") > 0.5f || Input.GetAxisRaw("Mouse X") < 0.5f) 
      { 
       ship.rb.AddRelativeTorque(new Vector3(-Input.GetAxis("Mouse Y"), Input.GetAxis("Mouse X"), 0) * Time.deltaTime * ship.rotationSpeed); 
      } 
      if (Input.GetKey(KeyCode.C)) 
      { 
       ship.rb.velocity = ship.rb.velocity * 0.99f; 
       ship.rb.angularVelocity = ship.rb.angularVelocity * 0.99f; 
      } 
     } 
    } 
} 

[PunRPC] 
void SetJoint(int shipView) 
{ 
    shipObj = PhotonView.Find(shipView).gameObject; 
    shipObj.GetComponent<FixedJoint>().connectedBody = rb; 
} 

Antwort

0

Ich würde diese Technik überhaupt nicht empfehlen, wenn Sie den Player ein Physik-Objekt verbindet, es über sie vollständig übernehmen sollte. Machen Sie das Schiff zu einer Szene, deren Besitzer geändert werden kann, und wenn ein Spieler sie betreten möchte, machen Sie diesen Spieler zum Besitzer des Schiffes. Und dann können Sie sich auf das Management von Schiffen verlassen und das Raumfahrzeug von verschiedenen Akteuren sicher steuern.

auch, ich schlage vor, Sie verwenden das Photon Forum, haben Sie mehr Chance, Antworten zu bekommen.

Bye,

Jean

Verwandte Themen