Unity3d AddForce()无法通过PhotonWork处理速度同步对象

Unity3d AddForce()无法通过PhotonWork处理速度同步对象,unity3d,photon,Unity3d,Photon,我有一个播放器对象,它(连同其他组件和对象)附带了一个Rigidbody2D、一个CollizedR2D、一个PhotonView和一个名为“PhotonLagCompensationView”的脚本。PhotonLagCompensationView同步所连接刚体的位置和速度,并应用滞后补偿,如下所示: public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if

我有一个播放器对象,它(连同其他组件和对象)附带了一个Rigidbody2D、一个CollizedR2D、一个PhotonView和一个名为“PhotonLagCompensationView”的脚本。PhotonLagCompensationView同步所连接刚体的位置和速度,并应用滞后补偿,如下所示:

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()时,速度甚至不会出现停顿。但让我震惊的是,当我在不同的脚本上调用完全相同的函数时,它在房间里的所有玩家身上都能正常工作

不起作用的脚本是“KnockBackOnTrigger”,它附加到一个对象上,该对象由播放器通过网络实例化。该对象有一个作为触发器的碰撞R2D和一个PhotonView。OnTiggerEnter2D回调工作正常。它打印“trigger”,我甚至记录了AddForce()参数和一个TryGetComponent(),以确保刚体被识别并正确施力。脚本将按如下方式应用力:

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);
        }
    }
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);
        }
    }
void OnTriggerEnter2D(碰撞R2D碰撞器)
{
if(collider.gameObject.layer==9&&collider.gameObject!=PlayerManager.LocalPlayerInstance)
{
Log(“触发器”);
collider.gameObject.GetComponent().AddForce(
新向量2(this.transform.localScale.x*knockBackForce,0),ForceMode2D.pulse);
}
}
触发器出现,Rigidbody2D出现,不移动我

正在运行的脚本是一个附加到“熔岩块”游戏对象(tilemap对象)的脚本。lava块的tilemap对象具有附加到它的所有tilemap组件(贴图、渲染器、碰撞器),它们与附加到它的脚本一样工作。“LavaBlocks”脚本的工作原理如下:

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);
        }
    }
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);
        }
    }
无效OnCollisionInter2D(碰撞2D碰撞)
{//当玩家接触熔岩时,此语句中的所有内容都会发生在玩家身上。
if(collision.gameObject.layer==9)
{
collision.gameObject.GetComponent().AddForce(
矢量2.up*向上力,力模式2D.脉冲);
}
}
因此,每当玩家触摸熔岩砖的碰撞器时,它就会向上反弹

此外,我还尝试设置刚体2d的速度,但也不起作用。事实上,这就是我最初想要对脚本执行的操作,但我尝试了AddForce()以查看这是否可行。
有一次,我甚至尝试使用玩家的CharacterController2D.Move()函数将玩家的位置向左/向右打了一些单位,但这并没有起到任何作用。

似乎区别在于
collider.gameObject!=PlayerManager.LocalPlayerInstance
你没有试过吗?我可以试一试,但正如我所说,if语句执行正确。它会打印Debug.log(),并且所有正在使用的参数都会正确显示。是的,但可能不是针对正确的播放机?;)也许它正在为之工作的是让它的值被
OnPhotonSerializeView
?@derHugo my good就是这样。我已经为这件事烦恼了将近一个星期了。我现在觉得自己很傻——当其他玩家与它发生碰撞时,该玩家就是游戏实例中的
localplayernstance
。我现在的问题是,如果不是
LocalPlayerInstance
,我将如何告诉碰撞器要与谁碰撞?