Почему странно работает управление в игре с мультиплеером?

Сделал я по туториалу 2д игру. Управление в игре осуществляется с помощью джойстика. Я добавил Network в проект, создал NetworkManager в иерархии, добавил везде где надо разные компоненты. В итоге я могу подключиться в игру, но управление стало странно работать: Видео

Вот скрипт игрока:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class PlayerController : NetworkBehaviour
{
    public float speed;
    public float jumpForce;
    private float moveInput;

    public Joystick joystick;

    private Rigidbody2D rb;

    private bool facingRight = true;

    private bool isGrounded;
    public Transform feetPos;
    public float checkRadius;
    public LayerMask whatIsGround;

    private Animator anim;

    private void Start()
    {
        anim = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
        joystick = GameObject.Find("Floating Joystick").GetComponent<FloatingJoystick>();
    }

    private void FixedUpdate()
    {
        if (!isLocalPlayer)
            return;
        moveInput = joystick.Horizontal;
        rb.velocity = new Vector2(moveInput * speed,rb.velocity.y);
        if(facingRight== false && moveInput > 0)
        {
            Flip();
        }
        if(facingRight== true && moveInput < 0)
        {
            Flip();
        }
        if(moveInput == 0)
        {
            anim.SetBool("isRunning", false);
        }
        else
        {
            anim.SetBool("isRunning", true);
        }
    }
    private void Update()
    {
        float verticalMove = joystick.Vertical;
        isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);
        if(isGrounded == true && verticalMove >= .5f)
        {
            rb.velocity = Vector2.up * jumpForce;
            anim.SetTrigger("TakeOff");
        }
        if(isGrounded == true)
        {
            anim.SetBool("isJumping", false);
        }
        else
        {
            anim.SetBool("isJumping", true);
        }
    }

    void Flip()
    {
        facingRight = !facingRight;
        Vector3 Scaler = transform.localScale;
        Scaler.x *= -1;
        transform.localScale = Scaler;
        if(moveInput < 0)
        {
            transform.eulerAngles = new Vector3(0, 180, 0);
        }
        else if( moveInput > 0)
        {
            transform.eulerAngles = new Vector3(0, 0, 0);
        }
    }
}

Я просто не понимаю, в чем может быть проблема?
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
DrinkFromTheCup
@DrinkFromTheCup
Теоретик
if (!isLocalPlayer)
            return;

в
private void Update()
точно не нужен, а в
private void FixedUpdate()
точно нужен?

Вдобавок, даже если все проверки на то, от локального игрока берём поступающие команды или от сетевого, произойдут успешно - всем присутствующим "куклам" будут пытаться отправиться (и выполниться) все команды подряд, что (отчасти - отсутствует проверка для горизонтального движения) и произошло на последней трети видео.
Нет указания, какой конкретно инстанс "куклы" будет двигать полученный инпут.
Либо что-то помешало его выполнению - NetworkBehaviour, насколько я знаю, сам по себе соответствие "инстанс объекта" <-> "локальный/нелокальный игрок" не устанавливает, значит, где-то должен быть ещё код, который это делает.

Больше невооружённым глазом аномалий не вижу...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы