public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { // I have control over the pieces, so I can move them and then send pos + rot over network if (stream.IsWriting) { stream.SendNext(MyFlippedCoordinates.PositionRelativeToBoard(Rb.position, Board)); stream.SendNext(Rb.isKinematic); stream.SendNext(Rb.rotation); stream.SendNext(Rb.velocity); } // No control over the object, so I update this class with the values read from the network // if (stream.IsReading) else { NetworkPositionRb = (Vector3)stream.ReceiveNext(); NetworkIsKinematic = (bool)stream.ReceiveNext(); NetworkRotation = (Quaternion)stream.ReceiveNext(); float lag = Mathf.Abs((float)(PhotonNetwork.Time - info.SentServerTime)); Rb.velocity = (Vector3)stream.ReceiveNext(); NetworkPositionRb += Rb.velocity * lag; Distance = Vector3.Distance(Rb.position, NetworkPositionRb); } }
void SpawnPlayer(int i) { GameObject piece = IsFirstPlayer ? Instantiate(YellowPlayer, Positions[i].transform.position, PieceRotation) : Instantiate(RedPlayer, Positions[i].transform.position, PieceRotation); PhotonView view = piece.GetComponent <PhotonView>(); if (PhotonNetwork.AllocateViewID(view)) { object[] data = new object[] { MyFlippedCoordinates.PositionRelativeToBoard(piece.transform.position, Board), piece.transform.rotation, view.ViewID, IsFirstPlayer }; RaiseEventOptions raiseEventOptions = new RaiseEventOptions { Receivers = ReceiverGroup.Others, CachingOption = EventCaching.AddToRoomCache, }; SendOptions sendOptions = new SendOptions { Reliability = true }; PhotonNetwork.RaiseEvent((byte)RaiseEventCodes.PlayerSpawnEventCode, data, raiseEventOptions, sendOptions); } }