如何在 Photon 中为玩家初始化相机

scr*_*ock 6 c# unity-game-engine photon

我在做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
}
Run Code Online (Sandbox Code Playgroud)

简单的相机控制器

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

UPD 找到了解决方案

我将相机控制器的脚本移动到玩家的相机,在玩家的实例中我搜索这个相机,打开它并将玩家的变换传输到它。

不确定这种方法,但它至少有效。

这是那个怪物

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);
        }
}
Run Code Online (Sandbox Code Playgroud)

和相机控制器

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jac*_*ani 3

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

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

基本上你就是这样做的。

=> 创建玩家
=> 分配摄像机

当你应该这样做的时候。

=> 创建玩家
=> 检查这是否是您的客户端=> 分配相机

要实现这一点,您需要添加此检查:

if (photonView.IsMine) AssignCamera();
Run Code Online (Sandbox Code Playgroud)

我看到您正在管理器中发送命令。所以你有这些解决方案:

  • 在管理器中添加一种方法来检查这是否是玩家
  • (更好)将代码移至播放器脚本内。

在玩家脚本中添加代码

if (photonView.IsMine) AssignCamera();
Run Code Online (Sandbox Code Playgroud)

在管理器中添加检查

我不确定你的代码的所有逻辑。某些代码应适用于所有玩家,其他一些代码应仅适用于对等相关玩家。

我认为你应该像这样更改 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);
}
Run Code Online (Sandbox Code Playgroud)

更多信息:玩家网络 - Photon PUN