You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:05:45