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

Сделал я по туториалу 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);
        }
    }
}

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы