Проблемы с зеркальной сетью в Unity

Я относительно новичок в Unity и решил сделать простую многопользовательскую игру. После реализации многопользовательского режима возникли две основные проблемы. Во-первых, каждый человек, который присоединяется, будет иметь скорость, в n раз превышающую предполагаемую, где n - количество игроков после того, как игрок присоединился. Во-вторых, у меня есть очень простой скрипт камеры, в котором он отключает камеру, если она не привязана к локальному плееру, и включает ее, если она есть. Однако это не работает, поскольку каждый, кто присоединяется, не может подключиться ни к какой камере, и хост быстро переключается между камерами.

Вот код:

using Mirror;
using UnityEngine;

public class PlayerObject : NetworkBehaviour
{

    public GameObject playerPrefab;
    public KeyCode left;
    public KeyCode right;
    public float speed;
    GameObject myPlayerUnit;

    void Start()
    {
        if (isLocalPlayer == false)
        {
            return;
        }

        //Instantiate(playerPrefab);
        CmdSpawn();
        Debug.Log(myPlayerUnit == null);
    }

    void Update()
    {
        FindObjectOfType<Camera>().enabled = false;
        if (isLocalPlayer == false)
        {
            return;
        }
        CmdSetCamera(true);
        if (Input.GetKey(left))
        {
            CmdMove(false);
        }

        if (Input.GetKey(right))
        {
            CmdMove(true);
        }
    }
    [Command]
    void CmdSpawn()
    {
        GameObject go = Instantiate(playerPrefab);
        myPlayerUnit = go;
        NetworkServer.Spawn(go);
    }

    [Command]
    void CmdSetCamera(bool en)
    {
        if (myPlayerUnit != null)
        {
            myPlayerUnit.GetComponent<Camera>().enabled = en;
        }
    }

    [Command]
    void CmdMove(bool right)
    {
        if (myPlayerUnit == null)
        {
            return;
        }

        if (right)
        {
            myPlayerUnit.transform.Translate(speed, 0, 0);
        }
        else
        {
            myPlayerUnit.transform.Translate(-speed, 0, 0);
        }
    }
}


person Tyler Balota    schedule 27.06.2020    source источник
comment
Привет! Текущая сетевая система в Unity в будущем будет устаревшей. Может быть, вы можете проверить сторонние решения для такой сети, как Photon?   -  person OnionFan    schedule 27.06.2020
comment
@OnionFan Mirror - это стороннее сетевое решение, построенное на сетевом коде Unity.   -  person JustLearnedIt    schedule 26.06.2021


Ответы (2)


Прежде чем вы тратите больше времени на редактирование и попытки исправить этот код, я бы отбросил его и попробовал новый, более простой подход. Одна из основных проблем с методом, который вы выбрали здесь, заключается в том, что вы запускаете каждый кадр с выключения камеры FindObjectOfType<Camera>().enabled = false;, а включение, отключение и переключение камеры излишне сложно.

У меня нет времени приводить пример кода прямо сейчас, но Mirror работает, поэтому вам будет легче отлаживать более простой метод, и обязательно включайте операторы Debug.Log в каждую часть, чтобы вы знали, что происходит на каждом этапе. шаг.

person MasterOfInfinity    schedule 24.10.2020
comment
Добро пожаловать в Stackoverflow MasterOfInfinity! Было бы здорово, если бы вы могли добавить упомянутый пример кода. Вот что будет полезно всем. Всегда я вижу что-то вроде того, что у меня сейчас нет времени объяснять это или около того, я не могу не вспомнить последнюю теорему Ферма;) - person Kuruchy; 24.10.2020

Что касается скорости, похоже, вы рассчитываете ее на основе юнита игрока, и поскольку юниты игрока возятся друг с другом, как вы описали с камерами, вы захотите сделать что-то вроде этого

void Start() {
speed = 10f; //you need to define what your speed is or unity will calculate it weirdly
}

Что касается проблемы с камерой, вам, вероятно, следует отключить камеру в префабе и включить ее, когда игрок присоединится

person LittleEgg    schedule 24.10.2020