Unity New Input Manager и проблема с Photon

Я работаю над многопользовательской игрой, и у меня возникает проблема, когда 2 игрока загружают один и тот же уровень с помощью PhotonNetwork.LoadLevel ().

Когда я запускаю игру один, я могу управлять своим плеером, и все в порядке. Но когда нас двое, игрок А контролирует игрока Б, и наоборот.

Я проверял множество ссылок в Интернете за последние несколько дней, и я изучил концепцию PhotonNetwork.IsMine, которая, как я думал, решит все мои проблемы, но, похоже, не работает со мной. Кроме того, я использую новую систему ввода Unity, но не думаю, что проблема здесь.

В основном, что я делаю:

  • Создайте экземпляр игрока (это произошло дважды, так как у меня 2 игрока), у которого есть PlayerManager
  • Player Manager Получить экземпляр локального плеера и синхронизировать камеру с локальным плеером, только если isMine = true
  • CameraManager создает диспетчер ввода, если сценарий связан с локальным проигрывателем с помощью isMine.
  • Свяжите основную камеру с этим скриптом, когда геймменеджер запросит это.
  • Обновлять поворот камеры, только когда isMine истинно (вторая защита)

Вот фрагмент моего кода:

GameManager.cs (удерживается объектом сцены, поэтому он изначально создается для всех, у кого есть сцена)

void Start()
    {
            if(PlayerManager.LocalPlayerInstance == null)
            {
                //Get player's team
                string team = (string)PhotonNetwork.LocalPlayer.CustomProperties["Team"];
                int indexPlayer = GetSpawnPosition();

                //Spawn player depending on its team and its index in the players pool
                if (team.Equals("Spy"))
                {
                    PhotonNetwork.Instantiate(this.spyPrefab.name, SpySpawns[indexPlayer].position, SpySpawns[indexPlayer].rotation);
                }
                else if (team.Equals("Defender"))
                {
                    PhotonNetwork.Instantiate(this.defenderPrefab.name, SpySpawns[indexPlayer].position, SpySpawns[indexPlayer].rotation);
                }
        }
    }

PlayerManager.cs (удерживается игроком, поэтому изначально не создается со сценой)

void Awake()
    {
        //Keep track of the localPlayer to prevent instanciation when levels are synchronized
        if (photonView.IsMine)
        {
            LocalPlayerInstance = gameObject;
        }

        //Don't destroy this gameobject so it can survives level synchronization
        DontDestroyOnLoad(gameObject);
    }

    private void Start()
    {
        //Get Manager of the camera of the player and attach to the local player
        CameraLookFPS cameraFPSManager = gameObject.GetComponent<CameraLookFPS>();
        if (cameraFPSManager != null)
        {
            //Ensure that we the local player is controlling its own camera
            if(photonView.IsMine == true)
            {
                cameraFPSManager.SynchronizeWithLocalPlayer();
            }
        }
        else
            Debug.Log("This player is missing the CameraLookFPS component");
    }

CameraManager.cs (удерживается игроком, поэтому изначально не создается со сценой)

private void Start()
    {
        //Synchronize camera with local player on start for debug
        if(SynchronizeOnStart)
        {
            SynchronizeWithLocalPlayer();
        }

        //Bind input for controlling the camera
        BindingInput();
    }

private void BindingInput()
    {
        // Prevent control is connected to Photon and represent the localPlayer
        if (photonView.IsMine == false && PhotonNetwork.IsConnected == true)
        {
            return;
        }
        else
        {
            //Get Components
            Input_Master = new InputMaster();

            //Enable
            Input_Master.Enable();

            //Input binding
            Input_Master.Player.Look.performed += context => MoveCamera(context);
            Input_Master.Player.Look.Enable();
        }
    }

public void SynchronizeWithLocalPlayer()
    {
        if (photonView.IsMine == false && PhotonNetwork.IsConnected == true)
        {
            return;
        }
        Player_Camera = Camera.main.transform;
        isSynchronized = true;
    }

Я постарался быть достаточно ясным, скажите мне, если что-то не так объяснили. Я продолжу свое исследование на своей стороне и буду держать вас в курсе, если что-то найду. Заранее спасибо за помощь!

Адриан


person Adrien G.    schedule 19.04.2020    source источник


Ответы (1)


Я наконец нашел свое решение. Похоже, я уже читал об этом, но я потерпел неудачу при попытке решить. Итак, как и у многих людей, это проблема камеры. Что я сделал:

  • Создайте игровой объект, содержащий камеру, и поместите его как дочерний по отношению к игровому объекту player.
  • Деактивировать игровой объект, удерживающий камеру
  • При создании экземпляра игрока проверьте, является ли игрок локальным игроком, используя PhotonNetwork.IsMine. Если да, активируйте игровой объект, удерживающий камеру, через скрипт

Если у вас есть вопросы, напишите мне!

Адриан

person Adrien G.    schedule 21.04.2020