我在制作2D游戏时,问题在于,当第一个玩家创建并出现在房间中时,他的相机正常工作,但是当新玩家进入房间时,第一个玩家会通过第二个玩家的相机看到一切。此外,如果有第三位玩家连接,则第一位和第二位玩家都可以通过第三位玩家的相机看到所有内容,依此类推。

在GameManager类中实例化的预制玩家(仅在游戏场景中)

public class GameManager : MonoBehaviourPunCallbacks
    {
        public GameObject playerPrefab;
        public Transform spawnPoint;

        public void Start()
        {
            GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
            player.GetComponent<FireFighterHeroController>().enabled = true;
            player.GetComponent<CameraControler>().enabled = true;
            player.GetComponent<CameraControler>().SetTarget(player.transform);
        }

        #region PUN Callbacks

        public override void OnLeftRoom()
        {
            SceneManager.LoadScene(1);
        }

        #endregion

        #region Custom Methods

        public void OnClickLeaveRoom_Btn()
        {
            PhotonNetwork.LeaveRoom();
        }

        #endregion
}

简单的相机 Controller

public class CameraControler : MonoBehaviour
    {
        private Transform target;
        public GameObject camera;
        public Vector3 offset;

        public void SetTarget(Transform target)
        {
            this.target = target;
        }

        public void LateUpdate()
        {
            camera.transform.position = target.position + offset;
        }
    }

UPD找到了解决方案

我将摄像机 Controller 的脚本移到了播放器的摄像机上,在播放器的实例中,我搜索了该摄像机,然后将其打开并将播放器的变换传输到该摄像机。

不确定这种方法,但至少可以奏效。

这是那个怪物

public class GameManager : MonoBehaviourPunCallbacks
    {
        public Transform spawnPoint;

        public void Start()
        {
            GameObject player = PhotonNetwork.Instantiate("Player", spawnPoint.position, Quaternion.identity);

            if (!player.GetPhotonView().IsMine)
                return;
            player.GetComponent<FireFighterHeroController>().enabled = true;
            player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().enabled = true;
            player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().SetTarget(player.transform);
            player.transform.Find("Camera").gameObject.SetActive(true);
        }
}

和相机 Controller

public class CameraControler : MonoBehaviour
    {
        private Transform target;
        public Vector3 offset;

        public void SetTarget(Transform target)
        {
            this.target = target;
        }

        public void LateUpdate()
        {
            gameObject.transform.position = target.position + offset;
        }
    }

最佳答案

更新-发表评论后
您正在将命令发送给所有玩家。

在发送命令之前,您应该检查接收命令的播放器是否是新播放器的所有者。

基本上,您正在执行此操作。

=>创建玩家
=>分配相机

当你应该这样做的时候。

=>创建玩家
=>检查您的客户=> ASSIGN CAMERA

为此,您需要添加以下检查:

if (photonView.IsMine) AssignCamera();

我看到您正在管理器中发送命令。因此,您有以下解决方案:
  • 在管理器中添加一种方法来检查这是否是玩家
  • (更好)在播放器脚本内移动代码。

  • 在播放器脚本中添加代码

    public class YourPlayer : Photon.MonoBehaviour
    {
        public void Start()
        {
            //stop assigning controls if this is not the player related to this peer
            if(!photonView.IsMine) return;
            player.GetComponent<FireFighterHeroController>().enabled = true;
            player.GetComponent<CameraControler>().enabled = true;
            player.GetComponent<CameraControler>().SetTarget(player.transform);
        }
    }
    

    在管理器中添加检查

    我不确定您代码的所有逻辑。某些代码应适用于所有播放器,其他一些代码应仅适用于与对等相关的播放器。

    我认为您应该像这样更改Start方法:
    public void Start()
    {
        GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
    
        //stop assigning controls if this is not the player related to this peer
        if(!player.GetPhotonView().IsMine) return;
        player.GetComponent<FireFighterHeroController>().enabled = true;
        player.GetComponent<CameraControler>().enabled = true;
        player.GetComponent<CameraControler>().SetTarget(player.transform);
    }
    

    更多信息:Player Networking - Photon PUN

    关于c# - 如何为Photon中的播放器初始化相机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56235834/

    10-13 06:56