У меня есть объект игрока, к которому прикреплены (наряду с другими компонентами и объектами) 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 () игрока, чтобы просто ударить позицию игрока на несколько юнитов влево / вправо, и даже это ничего не сделало.