C# 多人刚体运动未同步(光子)

C# 多人刚体运动未同步(光子),c#,unity3d,multiplayer,photon,rigid-bodies,C#,Unity3d,Multiplayer,Photon,Rigid Bodies,我正在创建一个多人游戏,你可以进入太空船。我使用光子进行多人游戏 正如你们在下图中看到的,我在照片中看到了船的刚体,在播放器上进行了变换和相同的操作。 但当我进入飞船时,其他玩家的视图看起来非常滞后(如果我推动飞船,它会正常同步)。下面是一个显示问题的示例 我的播放器通过固定接头连接到船上。 这是我的缩写代码: void Update() { //Raycast to check for ship if ((Physics.Raycast(look, out hit, 9f)

我正在创建一个多人游戏,你可以进入太空船。我使用光子进行多人游戏

正如你们在下图中看到的,我在照片中看到了船的刚体,在播放器上进行了变换和相同的操作。

但当我进入飞船时,其他玩家的视图看起来非常滞后(如果我推动飞船,它会正常同步)。下面是一个显示问题的示例

我的播放器通过固定接头连接到船上。
这是我的缩写代码:

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;
}
void Update()
{
//Raycast将检查船的安全性
if((Physics.Raycast(look,out-hit,9f)和&hit.collider.tag==“Ship”)
{
//设置变量
shipObj=hit.collider.gameObject.transform.parent.gameObject;
ship=shipObj.GetComponent();
if(Input.GetKeyDown(KeyCode.R))
{
//检查船是否被驱动
如果(!船舶驱动)
{
驾驶=正确;
ship.ChangeDriven();
transform.position=ship.driverSeat.transform.position;
transform.rotation=ship.driverSeat.transform.rotation;
playerCamera.transform.position=ship.thirdPersonPosition.position;
playerCamera.transform.rotation=ship.thirdPersonPosition.rotation;
rb.detectCollisions=假;
rb.质量=0;
rb.drag=0;
rb.angularrag=0;
RPC(“SetJoint”,PhotonTargets.AllBuffered,shipObj.GetPhotonView().viewID);
}
}
if(驾驶)
{
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(新矢量3(0,0,Time.deltaTime*ship.moveSpeed));
}
if(Input.GetKey(KeyCode.E))
{
ship.rb.AddRelativeTorque(新矢量3(0,0,Time.deltaTime*-ship.moveSpeed));
}
如果(Input.GetAxisRaw(“鼠标Y”)>0.5f | | Input.GetAxisRaw(“鼠标Y”)<0.5f | | Input.GetAxisRaw(“鼠标X”)>0.5f | | Input.GetAxisRaw(“鼠标X”)<0.5f)
{
ship.rb.AddRelativeTorque(新矢量3(-Input.GetAxis(“鼠标Y”)、Input.GetAxis(“鼠标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;
}
}
}
}
[扑克牌]
无效设置接头(内部shipView)
{
shipObj=PhotonView.Find(shipView.gameObject);
shipObj.GetComponent().connectedBody=rb;
}

我根本不推荐这种技术,如果你的玩家加入一个物理对象,它应该完全接管它。把飞船变成一个场景对象,可以改变它的主人,当玩家想要进入它时,让这个玩家成为那艘船的主人。然后你可以依靠飞船管理安全地控制飞船我是各种各样的运动员


另外,我建议你使用光子论坛,你将有更多的机会获得回复。

我不推荐这种技术,如果你的玩家加入一个物理对象,它应该完全接管它。将飞船设置为一个场景对象,可以改变它的所有者,当玩家想要进入它时,让这个玩家成为该飞船的所有者。一个然后你就可以依靠飞船管理,从不同的玩家那里安全地控制飞船

另外,我建议你使用光子论坛,你将有更多的机会得到回复