Unity New Input Manager 和 Photon 问题

Unity New Input Manager and Photon issue

我正在开发一款多人游戏,当 2 名玩家使用 PhotonNetwork.LoadLevel() 加载同一关卡时我遇到了问题。

当我一个人开始游戏的时候,我可以控制我的播放器,一切都很好。但是当我们是2个玩家时,玩家A控制着玩家B,反之亦然。

这几天我在互联网上查看了很多链接,我学到了 PhotonNetwork.IsMine 的概念,我认为它可以解决我所有的问题,但它似乎不适合我。另外,我正在使用 Unity 的新输入系统,但我不认为问题出在此处。

基本上,我正在做的是:

这是我的一段代码:

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

我尽量说得够清楚,告诉我是否有解释不当的地方。我会继续我的研究,如果我发现了什么,我会与你保持联系。 预先感谢您的帮助!

阿德里安

我终于找到了解决办法。看来我已经读过它,但在尝试解决它时失败了。 所以,像很多人一样,这是相机问题。 我所做的是:

  • 创建一个持有相机的游戏对象并将其作为玩家游戏对象的子对象
  • 停用拿着相机的游戏对象
  • 实例化播放器时,检查播放器是否为本地播放器,使用PhotonNetwork.IsMine。如果是,通过脚本激活持有相机的游戏对象

有问题可以给我留言!

阿德里安