Photon Network多玩家车辆实例化异常:非主机玩家车辆一致
问题原因与解决方案
问题根源
你现在用PlayerPrefs.GetString("getcar")读取的是本地设备存储的值,非主机玩家的车辆选择没有同步到Photon网络中。不管是每个玩家自己实例化对象,还是主机统一实例化,其他玩家的选择信息没在网络上共享,导致非主机玩家要么读取本地默认值,要么所有人用同一个值,最终生成相同车辆。
解决步骤
1. 把车辆选择同步到Photon玩家属性
玩家选车时,除了存本地,还要把选择同步到当前玩家的Photon自定义属性,让所有客户端能获取到每个玩家的选车信息:
// 选车按钮的点击事件方法 public void OnSelectCar(string carName) { // 本地存储(可选,下次进游戏默认选这个) PlayerPrefs.SetString("getcar", carName); PlayerPrefs.Save(); // 同步到网络属性 ExitGames.Client.Photon.Hashtable props = new ExitGames.Client.Photon.Hashtable(); props["SelectedCar"] = carName; PhotonNetwork.LocalPlayer.SetCustomProperties(props); }
2. 实例化时读取网络属性而非本地存储
在生成玩家车辆时,读取当前玩家的Photon自定义属性来选择预制体,确保每个玩家用自己的网络同步后的选择:
public GameObject Player; // lamborgini 预制体 public GameObject Player2; // lam 预制体 public GameObject Player3; // gini 预制体 void SpawnMyPlayer() { Vector2 randomPos = new Vector2(Random.Range(minx, maxX), Random.Range(minY, maxY)); // 获取当前玩家的选车信息,优先用网络属性,本地存储做 fallback string selectedCar = "gini"; if (PhotonNetwork.LocalPlayer.CustomProperties.TryGetValue("SelectedCar", out object carObj)) { selectedCar = carObj.ToString(); } else { selectedCar = PlayerPrefs.GetString("getcar", "gini"); } // 匹配对应的预制体 GameObject targetPrefab = Player3; switch (selectedCar) { case "lamborgini": targetPrefab = Player; break; case "lam": targetPrefab = Player2; break; case "gini": targetPrefab = Player3; break; } // 实例化自己的车辆 PhotonNetwork.Instantiate(targetPrefab.name, randomPos, Quaternion.identity); }
3. 补充:进入房间后同步本地选车
如果玩家进入房间前已经在本地选过车,在进入房间后要把本地选择同步到网络属性,避免属性为空:
public override void OnJoinedRoom() { base.OnJoinedRoom(); // 读取本地存储的选车,同步到网络属性 string localCar = PlayerPrefs.GetString("getcar", "gini"); ExitGames.Client.Photon.Hashtable props = new ExitGames.Client.Photon.Hashtable(); props["SelectedCar"] = localCar; PhotonNetwork.LocalPlayer.SetCustomProperties(props); // 调用生成方法 SpawnMyPlayer(); }
额外注意点
- 如果是主机统一生成所有玩家的车辆,那主机需要遍历房间内的所有玩家,读取每个玩家的
SelectedCar属性,再分别实例化对应的车辆,而不是每个玩家自己生成。 - 确保所有车辆预制体都添加了
PhotonView组件,并且在Photon Server的Settings里注册了这些预制体。
内容的提问来源于stack exchange,提问作者unity purpose
相关产品推荐
相关产品推荐

