Как синхронизировать жесткое тело объекта сцены (кинематическое) по сети?

#unity3d #photon

#unity3d #фотон

Вопрос:

Я использую photon pun2 для создания сетей. это простая сцена выбора и броска, в которой игроки по сети пытаются выбрать и бросить мяч. Моя сцена содержит мяч, который игроки могут выбирать и бросать. При выборе объекта я делаю кинематику мяча истинной, а для кинематики броска — ложной, используя punrpc и ipunobersvable

синхронизация кинематики жесткого тела по сети является проблемой. таким образом, кинематика жесткого тела переключается между выкл. и вкл.

Я использую photonrigidbodyview для синхронизации по сети. скорость и угловая скорость с преобразованием идеально синхронизированы.

Вот этот код

     private void Start()
    {          
           
            animator = GetComponent<Animator>();
            ball = GameObject.Find("IceBall").transform;
            rb = GameObject.Find("IceBall").GetComponent<Rigidbody>();
            coll = GameObject.Find("IceBall").GetComponent<SphereCollider>();
 
        
            //ballContainer = player.Find("ObjectGuide").transform;
            //fpsCamera = player.Find("CameraHolder").transform;
        
       
        //setup 
        if (!equipped)
        {
            rb.isKinematic = false;
            coll.isTrigger = false;
        }
        else
        {
            rb.isKinematic = true;
            coll.isTrigger = true;
            slotFull = true;
        }
 
    }
 
    private void Update()
    {
        Vector3 distanceToPlayer = ball.position - transform.position;
        if(!equipped amp;amp; distanceToPlayer.magnitude<=pickupRange amp;amp; Input.GetKeyDown(KeyCode.E)amp;amp;!slotFull)
        {
            photonView.RPC("PickUp", RpcTarget.AllBuffered, true);
        }
        if(equipped amp;amp; Input.GetKey(KeyCode.Q))
        {
            photonView.RPC("Drop", RpcTarget.AllBuffered, false);
            
        }
    }
 
    [PunRPC]
    public void PickUp(bool _kinematic)
    {
        if(equipped == false amp;amp; slotFull == false)
        {
            equipped = true;
            slotFull = true;
            Debug.Log("ball is equipped " equipped);
            ball.GetComponent<PhotonView>().TransferOwnership(PhotonNetwork.LocalPlayer);
            rb.isKinematic = _kinematic;
 
            coll.isTrigger = true;
 
            //Make ball a child of the camera and move it to default position 
            if (photonView.IsMine)
            {   
                ball.parent = ballContainer;
                ball.localPosition = Vector3.zero;
                ball.localRotation = Quaternion.Euler(Vector3.zero);
            }
      
        }
 
 
    }
 
    [PunRPC]
    public void Drop(bool _kinematic)
    {
        if(equipped == true amp;amp; slotFull == true)
        {
            ball.GetComponent<PhotonView>().TransferOwnership(null);
            animator.SetTrigger("IsThrowBall");
            equipped = false;
            slotFull = false;
 
            //set parent to null 
            ball.SetParent(null);
 
 
            //Make Rigidbody is not Kinematic and BoxCollider normal
            rb.isKinematic = _kinematic;
            coll.isTrigger = false;
 
            //Ball carries momentum of player 
           
            //addforce 
            rb.AddForce(fpsCamera.forward * dropForwardForce, ForceMode.Impulse);
            rb.AddForce(fpsCamera.up * dropUpwardForce, ForceMode.Impulse);
        }
       
 
    }
 
    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
 
 
        if (stream.IsWriting)
        {
            // We own this player: send the others our data
            stream.SendNext(rb.isKinematic);
            stream.SendNext(coll.isTrigger);
        }
        else
        {
            // Network player, receive data
            this.rb.isKinematic = (bool)stream.ReceiveNext();
            this.coll.isTrigger = (bool)stream.ReceiveNext();
 
        }
    }
 

Комментарии:

1. Вы сказали: «Я использую photonrigidbodyview для синхронизации по сети. скорость и угловая скорость с преобразованием идеально синхронизированы «. Так в чем же проблема ?

2. синхронизация кинематических свойств rigidbody по сети является проблемой.

3. Тогда я бы предложил заглянуть в SyncVar, или вам нужно использовать команды и вызовы Rpc для их синхронизации.