Unity New Input Manager и выпуск Photon - PullRequest
0 голосов
/ 19 апреля 2020

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

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

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

По сути, я делаю следующее:

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

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

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 (удерживается игроком, поэтому изначально не создается w Сцена)

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;
    }

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

Адриен

1 Ответ

0 голосов
/ 21 апреля 2020

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

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

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

Adrien

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...