Photon多人玩家移动异常求助:他人所见为我方操控角色而非自身
解决Photon多人玩家移动时视角错误问题
问题现象
使用Photon实现多人玩家移动功能时出现异常:当我操控自己的玩家移动时,其他连接的玩家看到的是我操控的玩家,而非他们自己的玩家。
相关代码
玩家移动代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun; public class Player_Movement : MonoBehaviour { [SerializeField] float speed; [SerializeField] float xDirection; [SerializeField] float zDirection; [SerializeField] Vector3 moveDirection; private PhotonView view; private void Start() { view = GetComponent<PhotonView>(); } void Update() { if (view.IsMine) { xDirection = Input.GetAxis("Horizontal"); zDirection = Input.GetAxis("Vertical"); moveDirection = new Vector3(xDirection, 0.0f, zDirection); transform.position += moveDirection * speed * Time.deltaTime; } } }
玩家与相机初始化代码
IEnumerator Start() { yield return new WaitUntil(() => PhotonNetwork.IsConnectedAndReady); Vector3 playerPos = new Vector3(Random.Range(xMin, xMax), 0.0f, Random.Range(zMin, zMax)); GameObject obj = PhotonNetwork.Instantiate(playerPrefab.name, playerPos, Quaternion.identity); cameraObject = GameObject.Find("Camera").GetComponent<Camera>().gameObject; cameraObject.transform.parent = obj.transform; obj.SetActive(true); }
问题原因
相机初始化逻辑存在错误:PhotonNetwork.Instantiate会在所有客户端实例化玩家对象,但原代码中每个客户端都会将本地相机父化到刚实例化的玩家对象上,无论该玩家是否属于本地客户端。这导致其他玩家的相机被错误绑定到远程玩家(即操控者的玩家)身上,从而出现视角跟随错误。
修复方案
修改相机初始化逻辑,仅当实例化的玩家为本地玩家(PhotonView.IsMine为true)时,才将相机绑定到该玩家对象:
IEnumerator Start() { yield return new WaitUntil(() => PhotonNetwork.IsConnectedAndReady); Vector3 playerPos = new Vector3(Random.Range(xMin, xMax), 0.0f, Random.Range(zMin, zMax)); GameObject obj = PhotonNetwork.Instantiate(playerPrefab.name, playerPos, Quaternion.identity); PhotonView playerView = obj.GetComponent<PhotonView>(); // 仅本地玩家绑定相机 if (playerView.IsMine) { // 改用标签查找相机更可靠,避免重名问题 cameraObject = GameObject.FindGameObjectWithTag("MainCamera").gameObject; cameraObject.transform.parent = obj.transform; // 调整相机本地位置与旋转,确保视角正确 cameraObject.transform.localPosition = new Vector3(0, 5, -10); cameraObject.transform.localRotation = Quaternion.Euler(30, 0, 0); } obj.SetActive(true); }
补充说明
- 玩家移动代码无需修改,
view.IsMine的判断逻辑正确,确保只有本地玩家会响应输入移动。 - 建议给场景中的主相机添加
MainCamera标签,使用FindGameObjectWithTag替代Find,避免因重名导致的查找错误。
内容的提问来源于stack exchange,提问作者Omkar P
相关产品推荐
相关产品推荐

