AddForce () не работает с синхронизируемым по скорости объектом в PhotonNetwork - PullRequest
0 голосов
/ 21 марта 2020

У меня есть объект игрока, к которому прикреплены (наряду с другими компонентами и объектами) Rigidbody2D, Collider2D, PhotonView и скрипт с именем «PhotonLagCompensationView». PhotonLagCompensationView синхронизирует положение и скорость подключенного Rigidbody2D и применяет компенсацию лага следующим образом:

public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            stream.SendNext(rigidBody2D.position);
            stream.SendNext(rigidBody2D.velocity);
        }
        else
        {
            networkedPosition = (Vector2)stream.ReceiveNext();
            networkedVelocity = (Vector2)stream.ReceiveNext();

            float lag = Mathf.Abs((float)(PhotonNetwork.Time - info.SentServerTime));
            networkedPosition += networkedVelocity * lag;
        }
    }

    void FixedUpdate()
    {
        if (!photonView.IsMine)
        {
            rigidBody2D.velocity = networkedVelocity;
            rigidBody2D.position = Vector2.Lerp(
                rigidBody2D.position, networkedPosition, Time.fixedDeltaTime * interpolateRate);
        }
    }

Проблема заключается в том, когда я пытаюсь вызвать Rigidbody2D.AddForce () на этом GameObject, скорость не будет даже заикаться. Что меня поражает, так это то, что когда я вызываю EXACT SAME FUNCTION для другого сценария, он прекрасно работает на всех игроках в комнате.

Сценарий, который не работает - это «KnockBackOnTrigger», который присоединяется к объекту, который создается игроком по сети. Этот объект имеет Collider2D, который является триггером, и PhotonView. Обратный вызов OnTriggerEnter2D работает просто отлично. Он печатает «триггер», и я даже Debug.logged параметры AddForce () и TryGetComponent <> (), чтобы убедиться, что Rigidbody распознается и он применяет силу правильно. Сценарий применяет силу следующим образом:

void OnTriggerEnter2D(Collider2D collider)
    {
        if(collider.gameObject.layer == 9 && collider.gameObject != PlayerManager.LocalPlayerInstance)
        {
            Debug.Log("trigger");
            collider.gameObject.GetComponent<Rigidbody2D>().AddForce(
                new Vector2(this.transform.localScale.x * knockBackForce, 0),ForceMode2D.Impulse);
        }
    }

Появляются триггеры, появляется Rigidbody2D, без moveme

Работающий скрипт скрипт, прикрепленный к игровому объекту «Lava Blocks», который является объектом tilemap. К объекту тайла карты для блоков лавы прикреплены все компоненты тайла карты (карта, рендерер, коллайдер), и они работают так, как задумано, а также скрипт, прикрепленный к нему. Сценарий «LavaBlocks» работает следующим образом:

void OnCollisionEnter2D(Collision2D collision)
    {  // everything inside this statement will happen to the player when it touches lava.
        if (collision.gameObject.layer == 9) 
        {
            collision.gameObject.GetComponent<Rigidbody2D>().AddForce(
                Vector2.up * upwardForce, ForceMode2D.Impulse);
        }
    }

Поэтому, когда игрок касается одного из коллайдеров лавовых плиток, он отскакивает вверх.

Кроме того, я пытался установить скорость Rigidbody2D, который тоже не работал. Это на самом деле то, что я изначально хотел сделать со сценарием, но я попытался AddForce (), чтобы увидеть, будет ли это работать. В какой-то момент я даже попытался просто использовать функцию CharacterController2D.Move () игрока, чтобы просто ударить позицию игрока на несколько юнитов влево / вправо, и даже это ничего не сделало.

...